X-Git-Url: https://git.mxchange.org/?p=core.git;a=blobdiff_plain;f=inc%2Fclasses%2Fmain%2Ftemplate%2Fmenu%2Fclass_MenuTemplateEngine.php;h=e11548fb5f7b5bbf698f7b32c266cbc8d024988c;hp=93382f9c8c2a4aa0249bdef3eaaebbd6dfe17121;hb=1021cd030d57d1b50a4fa57694b7f96339e3eafd;hpb=1fa9baa4f7aab1bbd009a062bb4e6a545c553e92 diff --git a/inc/classes/main/template/menu/class_MenuTemplateEngine.php b/inc/classes/main/template/menu/class_MenuTemplateEngine.php index 93382f9c..e11548fb 100644 --- a/inc/classes/main/template/menu/class_MenuTemplateEngine.php +++ b/inc/classes/main/template/menu/class_MenuTemplateEngine.php @@ -2,11 +2,11 @@ /** * A Menu template engine class * - * @author Roland Haeder + * @author Roland Haeder * @version 0.0.0 - * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 Core Developer Team + * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2015 Core Developer Team * @license GNU GPL 3.0 or any newer version - * @link http://www.ship-simu.org + * @link http://www.shipsimu.org * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -57,10 +57,48 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla 'anchor-href', ); + /** + * Variables for a menu entry + */ + private $menuEntryVariables = array( + // List entry + 'entry_id', + // Anchor + 'anchor-id', + 'anchor-text', + 'anchor-title', + 'anchor-href', + ); + + /** + * Variables for a menu block + */ + private $menuBlockVariables = array( + // Title + 'title_id', + 'title_class', + 'title_text', + // Content is taken from menuEntries + // Footer + 'footer_id', + 'footer_class', + 'footer_text', + ); + + /** + * Rendered menu entries + */ + private $menuEntries = array(); + + /** + * Rendered menu blocks + */ + private $menuBlocks = array(); + /** * Menu instance */ - private $menuInstance = null; + private $menuInstance = NULL; /** * Current main node @@ -85,9 +123,8 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla /** * Creates an instance of the class TemplateEngine and prepares it for usage * - * @param $appInstance A manageable application - * @param $menuInstance A RenderableMenu instance - * @return $tplInstance An instance of TemplateEngine + * @param $menuInstance A RenderableMenu instance + * @return $templateInstance An instance of TemplateEngine * @throws BasePathIsEmptyException If the provided $templateBasePath is empty * @throws InvalidBasePathStringException If $templateBasePath is no string * @throws BasePathIsNoDirectoryException If $templateBasePath is no @@ -95,60 +132,52 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla * @throws BasePathReadProtectedException If $templateBasePath is * read-protected */ - public final static function createMenuTemplateEngine (ManageableApplication $appInstance, RenderableMenu $menuInstance) { + public static final function createMenuTemplateEngine (RenderableMenu $menuInstance) { // Get a new instance - $tplInstance = new MenuTemplateEngine(); + $templateInstance = new MenuTemplateEngine(); - // Get language and file I/O instances from application - $langInstance = $appInstance->getLanguageInstance(); - $ioInstance = $appInstance->getFileIoInstance(); + // Get the application instance from registry + $applicationInstance = Registry::getRegistry()->getInstance('app'); // Determine base path - $templateBasePath = $tplInstance->getConfigInstance()->getConfigEntry('application_base_path') . $appInstance->getRequestInstance()->getRequestElement('app') . '/'; + $templateBasePath = $templateInstance->getConfigInstance()->getConfigEntry('application_base_path') . $applicationInstance->getRequestInstance()->getRequestElement('app') . '/'; // Is the base path valid? if (empty($templateBasePath)) { // Base path is empty - throw new BasePathIsEmptyException($tplInstance, self::EXCEPTION_UNEXPECTED_EMPTY_STRING); + throw new BasePathIsEmptyException($templateInstance, self::EXCEPTION_UNEXPECTED_EMPTY_STRING); } elseif (!is_string($templateBasePath)) { // Is not a string - throw new InvalidBasePathStringException(array($tplInstance, $templateBasePath), self::EXCEPTION_INVALID_STRING); + throw new InvalidBasePathStringException(array($templateInstance, $templateBasePath), self::EXCEPTION_INVALID_STRING); } elseif (!is_dir($templateBasePath)) { // Is not a path - throw new BasePathIsNoDirectoryException(array($tplInstance, $templateBasePath), self::EXCEPTION_INVALID_PATH_NAME); + throw new BasePathIsNoDirectoryException(array($templateInstance, $templateBasePath), self::EXCEPTION_INVALID_PATH_NAME); } elseif (!is_readable($templateBasePath)) { // Is not readable - throw new BasePathReadProtectedException(array($tplInstance, $templateBasePath), self::EXCEPTION_READ_PROTECED_PATH); + throw new BasePathReadProtectedException(array($templateInstance, $templateBasePath), self::EXCEPTION_READ_PROTECED_PATH); } - // Get configuration instance - $configInstance = FrameworkConfiguration::getInstance(); - // Set the base path - $tplInstance->setTemplateBasePath($templateBasePath); - - // Set the language and IO instances - $tplInstance->setLanguageInstance($langInstance); - $tplInstance->setFileIoInstance($ioInstance); + $templateInstance->setTemplateBasePath($templateBasePath); // Set template extensions - $tplInstance->setRawTemplateExtension($configInstance->getConfigEntry('raw_template_extension')); - $tplInstance->setCodeTemplateExtension($configInstance->getConfigEntry('menu_template_extension')); + $templateInstance->setRawTemplateExtension($templateInstance->getConfigInstance()->getConfigEntry('raw_template_extension')); + $templateInstance->setCodeTemplateExtension($templateInstance->getConfigInstance()->getConfigEntry('menu_template_extension')); // Absolute output path for compiled templates - $tplInstance->setCompileOutputPath($configInstance->getConfigEntry('base_path') . $configInstance->getConfigEntry('compile_output_path')); + $templateInstance->setCompileOutputPath($templateInstance->getConfigInstance()->getConfigEntry('base_path') . $templateInstance->getConfigInstance()->getConfigEntry('compile_output_path')); // Set the menu instance - $tplInstance->setMenuInstance($menuInstance); + $templateInstance->setMenuInstance($menuInstance); // Init a variable stacker - $stackerInstance = ObjectFactory::createObjectByConfiguredName('menu_stacker_class'); + $stackInstance = ObjectFactory::createObjectByConfiguredName('menu_stacker_class'); // Set it - $tplInstance->setStackerInstance($stackerInstance); + $templateInstance->setStackInstance($stackInstance); // Return the prepared instance - return $tplInstance; + return $templateInstance; } /** @@ -248,7 +277,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla * @return void * @throws XmlNodeMismatchException If current main node mismatches the closing one */ - public function endElement ($resource, $nodeName) { + public function finishElement ($resource, $nodeName) { // Make all lower-case $nodeName = strtolower($nodeName); @@ -282,12 +311,12 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla // Is this string empty? if (empty($characters)) { // Then skip it silently - return false; + return; } // END - if // Assign the found characters to variable and use the last entry from // stack as the name - parent::assignVariable($this->getStackerInstance()->getNamed('current_node'), $characters); + parent::assignVariable($this->getStackInstance()->getNamed('current_node'), $characters); } /** @@ -301,15 +330,15 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla // Is the template dependency set? if ((!empty($templateDependency)) && (!isset($this->dependencyContent[$node]))) { // Get a temporay menu template instance - $templateInstance = ObjectFactory::createObjectByConfiguredName('menu_template_class', array($this->getApplicationInstance(), $this->getMenuInstance())); + $templateInstance = ObjectFactory::createObjectByConfiguredName('menu_template_class', array($this->getMenuInstance())); // Then load it $templateInstance->loadMenuTemplate($templateDependency); - // Get an XmlParser instance + // Parse the XML content $templateInstance->renderXmlContent(); - // Parse the template's content contents + // Save the parsed raw content in our dependency array $this->dependencyContent[$node] = $templateInstance->getRawTemplateData(); } // END - if } @@ -323,24 +352,24 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function initMenu ($templateDependency = '') { // Get web template engine - $this->setTemplateInstance(ObjectFactory::createObjectByConfiguredName('web_template_class', array($this->getApplicationInstance()))); + $this->setTemplateInstance(ObjectFactory::createObjectByConfiguredName('html_template_class', array($this->getApplicationInstance()))); // Handle the dependency template $this->handleTemplateDependency('menu', $templateDependency); // Push the node name on the stacker - $this->getStackerInstance()->pushNamed('current_node', 'menu'); + $this->getStackInstance()->pushNamed('current_node', 'menu'); } /** * Starts the menu entries * - * @param $templateDependency A template to load to satisfy dependencies + * @param $templateDependency A template to load to satisfy dependencies * @return void */ private function startEntryList () { // Push the node name on the stacker - $this->getStackerInstance()->pushNamed('current_node', 'entry-list'); + $this->getStackInstance()->pushNamed('current_node', 'entry-list'); } /** @@ -350,7 +379,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function startBlockHeader () { // Push the node name on the stacker - $this->getStackerInstance()->pushNamed('current_node', 'block-header'); + $this->getStackInstance()->pushNamed('current_node', 'block-header'); } /** @@ -360,7 +389,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function startBlockFooter () { // Push the node name on the stacker - $this->getStackerInstance()->pushNamed('current_node', 'block-footer'); + $this->getStackInstance()->pushNamed('current_node', 'block-footer'); } /** @@ -370,7 +399,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function startBlockList () { // Push the node name on the stacker - $this->getStackerInstance()->pushNamed('current_node', 'block-list'); + $this->getStackInstance()->pushNamed('current_node', 'block-list'); } /** @@ -380,7 +409,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function startBlock () { // Push the node name on the stacker - $this->getStackerInstance()->pushNamed('current_node', 'block'); + $this->getStackInstance()->pushNamed('current_node', 'block'); } /** @@ -390,7 +419,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function startTitle () { // Push the node name on the stacker - $this->getStackerInstance()->pushNamed('current_node', 'title'); + $this->getStackInstance()->pushNamed('current_node', 'title'); } /** @@ -400,7 +429,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function startTitleId () { // Push the node name on the stacker - $this->getStackerInstance()->pushNamed('current_node', 'title-id'); + $this->getStackInstance()->pushNamed('current_node', 'title-id'); } /** @@ -410,7 +439,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function startTitleClass () { // Push the node name on the stacker - $this->getStackerInstance()->pushNamed('current_node', 'title-class'); + $this->getStackInstance()->pushNamed('current_node', 'title-class'); } /** @@ -420,7 +449,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function startTitleText () { // Push the node name on the stacker - $this->getStackerInstance()->pushNamed('current_node', 'title-text'); + $this->getStackInstance()->pushNamed('current_node', 'title-text'); } /** @@ -430,7 +459,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function startEntry () { // Push the node name on the stacker - $this->getStackerInstance()->pushNamed('current_node', 'entry'); + $this->getStackInstance()->pushNamed('current_node', 'entry'); } /** @@ -440,7 +469,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function startEntryId () { // Push the node name on the stacker - $this->getStackerInstance()->pushNamed('current_node', 'entry-id'); + $this->getStackInstance()->pushNamed('current_node', 'entry-id'); } /** @@ -450,7 +479,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function startAnchor () { // Push the node name on the stacker - $this->getStackerInstance()->pushNamed('current_node', 'anchor'); + $this->getStackInstance()->pushNamed('current_node', 'anchor'); } /** @@ -460,7 +489,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function startAnchorId () { // Push the node name on the stacker - $this->getStackerInstance()->pushNamed('current_node', 'anchor-id'); + $this->getStackInstance()->pushNamed('current_node', 'anchor-id'); } /** @@ -470,7 +499,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function startAnchorText () { // Push the node name on the stacker - $this->getStackerInstance()->pushNamed('current_node', 'anchor-text'); + $this->getStackInstance()->pushNamed('current_node', 'anchor-text'); } /** @@ -480,7 +509,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function startAnchorTitle () { // Push the node name on the stacker - $this->getStackerInstance()->pushNamed('current_node', 'anchor-title'); + $this->getStackInstance()->pushNamed('current_node', 'anchor-title'); } /** @@ -490,7 +519,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function startAnchorHref () { // Push the node name on the stacker - $this->getStackerInstance()->pushNamed('current_node', 'anchor-href'); + $this->getStackInstance()->pushNamed('current_node', 'anchor-href'); } /** @@ -500,7 +529,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function startFooterId () { // Push the node name on the stacker - $this->getStackerInstance()->pushNamed('current_node', 'footer-id'); + $this->getStackInstance()->pushNamed('current_node', 'footer-id'); } /** @@ -510,7 +539,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function startFooterClass () { // Push the node name on the stacker - $this->getStackerInstance()->pushNamed('current_node', 'footer-class'); + $this->getStackInstance()->pushNamed('current_node', 'footer-class'); } /** @@ -520,7 +549,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function startFooterText () { // Push the node name on the stacker - $this->getStackerInstance()->pushNamed('current_node', 'footer-text'); + $this->getStackInstance()->pushNamed('current_node', 'footer-text'); } /** @@ -530,7 +559,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function finishTitle () { // Pop the last entry - $this->getStackerInstance()->popNamed('current_node'); + $this->getStackInstance()->popNamed('current_node'); } /** @@ -540,7 +569,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function finishTitleId () { // Pop the last entry - $this->getStackerInstance()->popNamed('current_node'); + $this->getStackInstance()->popNamed('current_node'); } /** @@ -550,7 +579,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function finishTitleClass () { // Pop the last entry - $this->getStackerInstance()->popNamed('current_node'); + $this->getStackInstance()->popNamed('current_node'); } /** @@ -560,7 +589,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function finishTitleText () { // Pop the last entry - $this->getStackerInstance()->popNamed('current_node'); + $this->getStackInstance()->popNamed('current_node'); } /** @@ -570,7 +599,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function finishFooterText () { // Pop the last entry - $this->getStackerInstance()->popNamed('current_node'); + $this->getStackInstance()->popNamed('current_node'); } /** @@ -580,7 +609,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function finishFooterClass () { // Pop the last entry - $this->getStackerInstance()->popNamed('current_node'); + $this->getStackInstance()->popNamed('current_node'); } /** @@ -590,7 +619,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function finishFooterId () { // Pop the last entry - $this->getStackerInstance()->popNamed('current_node'); + $this->getStackInstance()->popNamed('current_node'); } /** @@ -600,7 +629,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function finishAnchorHref () { // Pop the last entry - $this->getStackerInstance()->popNamed('current_node'); + $this->getStackInstance()->popNamed('current_node'); } /** @@ -610,7 +639,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function finishAnchorTitle () { // Pop the last entry - $this->getStackerInstance()->popNamed('current_node'); + $this->getStackInstance()->popNamed('current_node'); } /** @@ -620,7 +649,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function finishAnchorText () { // Pop the last entry - $this->getStackerInstance()->popNamed('current_node'); + $this->getStackInstance()->popNamed('current_node'); } /** @@ -630,7 +659,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function finishAnchorId () { // Pop the last entry - $this->getStackerInstance()->popNamed('current_node'); + $this->getStackInstance()->popNamed('current_node'); } /** @@ -640,7 +669,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function finishAnchor () { // Pop the last entry - $this->getStackerInstance()->popNamed('current_node'); + $this->getStackInstance()->popNamed('current_node'); } /** @@ -650,7 +679,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function finishEntryId () { // Pop the last entry - $this->getStackerInstance()->popNamed('current_node'); + $this->getStackInstance()->popNamed('current_node'); } /** @@ -660,7 +689,10 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function finishEntry () { // Pop the last entry - $this->getStackerInstance()->popNamed('current_node'); + $this->getStackInstance()->popNamed('current_node'); + + // Render this menu entry + $this->renderMenuEntry(); } /** @@ -670,7 +702,10 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function finishBlock () { // Pop the last entry - $this->getStackerInstance()->popNamed('current_node'); + $this->getStackInstance()->popNamed('current_node'); + + // Render this menu block + $this->renderMenuBlock(); } /** @@ -680,7 +715,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function finishBlockList () { // Pop the last entry - $this->getStackerInstance()->popNamed('current_node'); + $this->getStackInstance()->popNamed('current_node'); } /** @@ -690,7 +725,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function finishEntryList () { // Pop the last entry - $this->getStackerInstance()->popNamed('current_node'); + $this->getStackInstance()->popNamed('current_node'); } /** @@ -700,7 +735,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function finishBlockHeader () { // Pop the last entry - $this->getStackerInstance()->popNamed('current_node'); + $this->getStackInstance()->popNamed('current_node'); } /** @@ -710,7 +745,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function finishBlockFooter () { // Pop the last entry - $this->getStackerInstance()->popNamed('current_node'); + $this->getStackInstance()->popNamed('current_node'); } /** @@ -720,7 +755,77 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ private function finishMenu () { // Pop the last entry - $this->getStackerInstance()->popNamed('current_node'); + $this->getStackInstance()->popNamed('current_node'); + } + + /** + * Renders this menu entry, as every block all variables got overwritten + * with data from next entry. + * + * @todo 'anchor_href' may needs expanding with full URL + * @return void + */ + private function renderMenuEntry () { + // Prepare template engine + $templateInstance = $this->prepareTemplateInstance(); + + // Load menu entry template + $templateInstance->loadCodeTemplate('menu_entry'); + + // Copy all variables over to it + foreach ($this->menuEntryVariables as $variableName) { + // Copy variable + $variableValue = $this->readVariable($variableName); + + // ... into the instance + $templateInstance->assignVariable($variableName, $variableValue); + } // END - foreach + + // Compile template + variables + $templateInstance->compileTemplate(); + $templateInstance->compileVariables(); + + // Remember it here + $this->menuEntries[$this->readVariable('entry_id')] = $templateInstance->getRawTemplateData(); + } + + /** + * Renders this menu block, as next block all data is overwritten with + * next block. + * + * @return void + */ + private function renderMenuBlock () { + // Init block content + $blockContent = implode('', $this->menuEntries); + + // Prepare template engine + $templateInstance = $this->prepareTemplateInstance(); + + // Load menu entry template + $templateInstance->loadCodeTemplate('menu_block'); + + // Copy all variables over to it + foreach ($this->menuBlockVariables as $variableName) { + // Copy variable + $variableValue = $this->readVariable($variableName); + + // ... into the instance + $templateInstance->assignVariable($variableName, $variableValue); + } // END - foreach + + // Assign block content + $templateInstance->assignVariable('block_content', $blockContent); + + // Compile template + variables + $templateInstance->compileTemplate(); + $templateInstance->compileVariables(); + + // Remember it here + array_push($this->menuBlocks, $templateInstance->getRawTemplateData()); + + // Reset rendered menu entries array + $this->menuEntries = array(); } /** @@ -730,7 +835,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla */ public function getMenuCacheFqfn () { // Get the FQFN ready - $fqfn = sprintf("%s%s%s/%s.%s", + $fqfn = sprintf('%s%s%s/%s.%s', $this->getConfigInstance()->getConfigEntry('base_path'), $this->getGenericBasePath(), 'menus/_cache',