Added tab-based interface to userpage UI. Yes, it is plugin expansible, and yes, it breaks existing plugins that add code to the userpage (but that can be fixed with a "colspan=4")
<?php
/*
* Enano - an open-source CMS capable of wiki functions, Drupal-like sidebar blocks, and everything in between
* Version 1.1.4 (Caoineag alpha 4)
* Copyright (C) 2006-2008 Dan Fuhry
* Installation package
* ui.php - User interface for installations and upgrades
*
* This program is Free Software; you can redistribute and/or modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
* warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for details.
*/
/**
* The class for drawing and managing UI components.
* @package Enano
* @subpackage Installer
* @author Dan Fuhry
*/
class Enano_Installer_UI
{
/**
* The list of installer stages.
* @var array
*/
var $stages = array();
/**
* The GUID of the active stage
* @var string
*/
var $current_stage = '';
/**
* The application name, or the name displayed after the stage name in the title bar. Should be localized.
* @var string
*/
var $app_name = '';
/**
* If the header should be simplified (stripped of the Enano logo and top heading), this will be true.
* @var bool
*/
var $simple = false;
/**
* Text inserted into the header on the right.
* @var string
*/
var $step = '';
/**
* Extra text to add to the HTML <head> section
* @var array Will be implode()'ed
*/
var $additional_headers = array();
/**
* Constructor.
* @param string The name displayed in the <title> tag
* @param bool If true, the simplified header format is displayed.
*/
function __construct($app_name, $simple_header)
{
$this->stages = array(
'main' => array(),
'hide' => array()
);
$this->app_name = $app_name;
$this->simple = ( $simple_header ) ? true : false;
}
/**
* Adds more text to the HTML header.
* @param string
*/
function add_header($html)
{
$this->additional_headers[] = $html;
}
/**
* Adds a stage to the installer.
* @param string Title of the stage, should be already put through $lang->get()
* @param bool If true, the stage is shown among possible stages at the top of the window. If false, acts as a hidden stage
* @return string Unique identifier for stage, used later on set_visible_stage()
*/
function add_stage($stage, $visible = true)
{
$key = ( $visible ) ? 'main' : 'hide';
$guid = md5(microtime() . mt_rand());
$this->stages[$key][$guid] = $stage;
if ( empty($this->current_stage) )
$this->current_stage = $guid;
return $guid;
}
/**
* Resets the active stage of installation. This is for the UI only; it doesn't actually change how the backend works.
* @param string GUID of stage, returned from add_stage()
* @return bool true on success, false if stage GUID not found
*/
function set_visible_stage($guid)
{
foreach ( $this->stages['main'] as $key => $stage_name )
{
if ( $key == $guid )
{
$this->current_stage = $guid;
return true;
}
}
foreach ( $this->stages['hide'] as $key => $stage_name )
{
if ( $key == $guid )
{
$this->current_stage = $guid;
return true;
}
}
return false;
}
/**
* Outputs the HTML headers and start of the <body>, including stage indicator
*/
function show_header()
{
// Determine the name of the current stage
$stage_name = false;
if ( isset($this->stages['main'][$this->current_stage]) )
$stage_name = $this->stages['main'][$this->current_stage];
else if ( isset($this->stages['hide'][$this->current_stage]) )
$stage_name = $this->stages['hide'][$this->current_stage];
else
// Can't determine name of stage
return false;
$this->app_name = htmlspecialchars($this->app_name);
$stage_name = htmlspecialchars($stage_name);
global $lang;
if ( is_object($lang) && isset($GLOBALS['lang_uri']) )
{
$lang_uri = sprintf($GLOBALS['lang_uri'], $lang->lang_code);
$this->add_header('<script type="text/javascript" src="' . $lang_uri . '"></script>');
}
$additional_headers = implode("\n ", $this->additional_headers);
$title = addslashes(str_replace(' ', '_', $stage_name));
$js_dynamic = '<script type="text/javascript">
var title="' . $title . '";
var scriptPath="'.scriptPath.'";
var ENANO_SID="";
var AES_BITS='.AES_BITS.';
var AES_BLOCKSIZE=' . AES_BLOCKSIZE . ';
var pagepass=\'\';
var ENANO_LANG_ID = 1;
var DISABLE_MCE = true;
var msg_loading_component = \'Loading %component%...\';
</script>';
echo <<<EOF
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>{$stage_name} • {$this->app_name}</title>
<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="../includes/clientside/css/enano-shared.css" />
<link rel="stylesheet" type="text/css" href="images/css/installer.css" id="mdgCss" />
$js_dynamic
<script type="text/javascript" src="../includes/clientside/static/enano-lib-basic.js"></script>
$additional_headers
</head>
<body>
<div id="enano">
EOF;
if ( !$this->simple )
{
$step = ( !empty($this->step) ) ? '<div id="step">' . htmlspecialchars($this->step) . '</div>' : '';
echo <<<EOF
<div id="header">
$step
<img alt="Enano logo" src="images/enano-artwork/installer-header-blue.png" />
</div>
EOF;
}
$stages_class = ( $this->simple ) ? 'stages' : 'stages stages-fixed';
echo <<<EOF
<div class="stages-holder">
<ul class="$stages_class">
EOF;
foreach ( $this->stages['main'] as $guid => $stage )
{
$class = ( $guid == $this->current_stage ) ? 'stage stage-active' : 'stage';
$stage = htmlspecialchars($stage);
echo " <li class=\"$class\">$stage</li>\n ";
}
echo " </ul>\n <div style=\"clear: both;\"></div>\n </div>\n";
echo " <div id=\"enano-fill\">\n ";
echo " <div id=\"enano-body\">\n ";
}
/**
* Displays the page footer.
*/
function show_footer()
{
echo <<<EOF
<div id="copyright">
Enano and its various components, related documentation, and artwork are copyright © 2006-2008 Dan Fuhry.<br />
This program is Free Software; see the file "GPL" included with this package for details.
</div>
</div> <!-- div#enano-body -->
</div> <!-- div#enano-fill -->
</div> <!-- div#enano -->
</body>
</html>
EOF;
}
}
?>