* @author Romain Quetiez * @author Denis Flaven * @license http://www.opensource.org/licenses/gpl-3.0.html LGPL */ /** * Simple helper class to ease the production of HTML pages * * This class provide methods to add content, scripts, includes... to a web page * and renders the full web page by putting the elements in the proper place & order * when the output() method is called. * Usage: * $oPage = new WebPage("Title of my page"); * $oPage->p("Hello World !"); * $oPage->output(); */ class WebPage { protected $s_title; protected $s_content; protected $s_deferred_content; protected $a_scripts; protected $a_styles; protected $a_include_scripts; protected $a_include_stylesheets; protected $a_headers; protected $a_base; public function __construct($s_title) { $this->s_title = $s_title; $this->s_content = ""; $this->s_deferred_content = ''; $this->a_scripts = array(); $this->a_styles = array(); $this->a_linked_scripts = array(); $this->a_linked_stylesheets = array(); $this->a_headers = array(); $this->a_base = array( 'href' => '', 'target' => ''); ob_start(); // Start capturing the output } /** * Change the title of the page after its creation */ public function set_title($s_title) { $this->s_title = $s_title; } /** * Specify a default URL and a default target for all links on a page */ public function set_base($s_href = '', $s_target = '') { $this->a_base['href'] = $s_href; $this->a_base['target'] = $s_target; } /** * Add any text or HTML fragment to the body of the page */ public function add($s_html) { $this->s_content .= $s_html; } /** * Add any text or HTML fragment at the end of the body of the page * This is useful to add hidden content, DIVs or FORMs that should not * be embedded into each other. */ public function add_at_the_end($s_html) { $this->s_deferred_content .= $s_html; } /** * Add a paragraph to the body of the page */ public function p($s_html) { $this->add($this->GetP($s_html)); } /** * Add a paragraph to the body of the page */ public function GetP($s_html) { return "

$s_html

\n"; } public function table($aConfig, $aData, $aParams = array()) { $this->add($this->GetTable($aConfig, $aData, $aParams)); } public function GetTable($aConfig, $aData, $aParams = array()) { $oAppContext = new ApplicationContext(); static $iNbTables = 0; $iNbTables++; $sHtml = ""; $sHtml .= "\n"; $sHtml .= "\n"; $sHtml .= "\n"; foreach($aConfig as $sName=>$aDef) { $sHtml .= "\n"; } $sHtml .= "\n"; $sHtml .= "\n"; $sHtml .= "\n"; foreach($aData as $aRow) { if (false) //(isset($aParams['preview']) && $aParams['preview']) { $sHtml .= "\n"; } else if (isset($aRow['key'])) { $sHtml .= "\n"; } else { $sHtml .= "\n"; } foreach($aConfig as $sName=>$aAttribs) { $aMatches = array(); $sClass = isset($aAttribs['class']) ? 'class="'.$aAttribs['class'].'"' : ''; if (preg_match('/^key_(.+)$/', $sName, $aMatches) > 0) { $sAlias = $aMatches[1]; $sClass = $aParams['class'][$sAlias]; $sUIPage = cmdbAbstractObject::ComputeUIPage($sClass); $sHtml .= "\n"; } else if ($sName == 'key') { $sUIPage = cmdbAbstractObject::ComputeUIPage($aParams['class']); $sHtml .= "\n"; } else { $sValue = ($aRow[$sName] === '') ? ' ' : $aRow[$sName]; $sHtml .= "\n"; } } $sHtml .= "\n"; } $sHtml .= "\n"; $sHtml .= "
".$aDef['label']."
GetForLink()."\">GetForLink()."\">$sValue
\n"; return $sHtml; } /** * Add some Javascript to the header of the page */ public function add_script($s_script) { $this->a_scripts[] = $s_script; } /** * Add some Javascript to the header of the page */ public function add_ready_script($s_script) { // Do nothing silently... this is not supported by this type of page... } /** * Add some CSS definitions to the header of the page */ public function add_style($s_style) { $this->a_styles[] = $s_style; } /** * Add a script (as an include, i.e. link) to the header of the page */ public function add_linked_script($s_linked_script) { $this->a_linked_scripts[] = $s_linked_script; } /** * Add a CSS stylesheet (as an include, i.e. link) to the header of the page */ public function add_linked_stylesheet($s_linked_stylesheet, $s_condition = "") { $this->a_linked_stylesheets[] = array( 'link' => $s_linked_stylesheet, 'condition' => $s_condition); } /** * Add some custom header to the page */ public function add_header($s_header) { $this->a_headers[] = $s_header; } /** * Add needed headers to the page so that it will no be cached */ public function no_cache() { $this->add_header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1 $this->add_header("Expires: Fri, 17 Jul 1970 05:00:00 GMT"); // Date in the past } /** * Build a special kind of TABLE useful for displaying the details of an object from a hash array of data */ public function details($aFields) { $this->add($this->GetDetails($aFields)); } /** * Build a special kind of TABLE useful for displaying the details of an object from a hash array of data */ public function GetDetails($aFields) { $sHtml = "\n"; $sHtml .= "\n"; foreach($aFields as $aAttrib) { $sHtml .= "\n"; // By Rom, for csv import, proposed to show several values for column selection if (is_array($aAttrib['value'])) { $sHtml .= "\n"; } else { $sHtml .= "\n"; } $sHtml .= "\n"; } $sHtml .= "\n"; $sHtml .= "
".$aAttrib['label']."".implode("", $aAttrib['value'])."".$aAttrib['label']."".$aAttrib['value']."
\n"; return $sHtml; } /** * Outputs (via some echo) the complete HTML page by assembling all its elements */ public function output() { foreach($this->a_headers as $s_header) { header($s_header); } $s_captured_output = ob_get_contents(); ob_end_clean(); echo "\n"; echo "\n"; echo "\n"; echo "{$this->s_title}\n"; echo $this->get_base_tag(); foreach($this->a_linked_scripts as $s_script) { echo "\n"; } if (count($this->a_scripts)>0) { echo "\n"; } foreach($this->a_linked_stylesheets as $a_stylesheet) { if ($a_stylesheet['condition'] != "") { echo "\n"; } } if (count($this->a_styles)>0) { echo "\n"; } echo "\n"; echo "\n"; echo $this->s_content; if (trim($s_captured_output) != "") { echo "
$s_captured_output
\n"; } echo $this->s_deferred_content; echo "\n"; echo "\n"; } /** * Build a series of hidden field[s] from an array */ // By Rom - je verrais bien une serie d'outils pour gerer des parametres que l'on retransmet entre pages d'un wizard... // ptet deriver webpage en webwizard public function add_input_hidden($sLabel, $aData) { foreach($aData as $sKey=>$sValue) { $this->add(""); } } protected function get_base_tag() { $sTag = ''; if (($this->a_base['href'] != '') || ($this->a_base['target'] != '')) { $sTag = 'a_base['href'] != '')) { $sTag .= "href =\"{$this->a_base['href']}\" "; } if (($this->a_base['target'] != '')) { $sTag .= "target =\"{$this->a_base['target']}\" "; } $sTag .= " />\n"; } return $sTag; } } ?>