X-Git-Url: https://git.mxchange.org/?p=core.git;a=blobdiff_plain;f=inc%2Fclasses%2Fmain%2Ftemplate%2Fmenu%2Fclass_MenuTemplateEngine.php;h=4f3b0f112d4d0503f9fda47da65d3ed3c4c4e9d4;hp=9f179c0f4e8928e0d0c9f2272ea4bb5a8d159340;hb=56764dad28dafd1292c9ed125135a3a8115b2147;hpb=36e4d0eb331bd724db0bd23071271d5eaeb37b17 diff --git a/inc/classes/main/template/menu/class_MenuTemplateEngine.php b/inc/classes/main/template/menu/class_MenuTemplateEngine.php index 9f179c0f..4f3b0f11 100644 --- a/inc/classes/main/template/menu/class_MenuTemplateEngine.php +++ b/inc/classes/main/template/menu/class_MenuTemplateEngine.php @@ -22,6 +22,45 @@ * along with this program. If not, see . */ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTemplate { + /** + * Main nodes in the XML tree ('menu' is ignored) + */ + private $mainNodes = array( + 'block-list', + ); + + /** + * Sub nodes in the XML tree + */ + private $subNodes = array( + 'entry-list', + 'entry', + 'entries-content', + 'header', + 'footer', + 'block', + 'title', + 'anchor', + 'design', + 'text', + 'advert', + ); + + /** + * Menu instance + */ + private $menuInstance = null; + + /** + * Current main node + */ + private $curr = array(); + + /** + * Content from depency + */ + private $depencyContent = array(); + /** * Protected constructor * @@ -36,6 +75,7 @@ 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 * @throws BasePathIsEmptyException If the provided $templateBasePath is empty * @throws InvalidBasePathStringException If $templateBasePath is no string @@ -44,7 +84,7 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla * @throws BasePathReadProtectedException If $templateBasePath is * read-protected */ - public final static function createMenuTemplateEngine (ManageableApplication $appInstance) { + public final static function createMenuTemplateEngine (ManageableApplication $appInstance, RenderableMenu $menuInstance) { // Get a new instance $tplInstance = new MenuTemplateEngine(); @@ -87,6 +127,9 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla // Absolute output path for compiled templates $tplInstance->setCompileOutputPath($configInstance->getConfigEntry('base_path') . $configInstance->getConfigEntry('compile_output_path')); + // Set the menu instance + $tplInstance->setMenuInstance($menuInstance); + // Return the prepared instance return $tplInstance; } @@ -105,6 +148,468 @@ class MenuTemplateEngine extends BaseTemplateEngine implements CompileableTempla // Load the special template $this->loadTemplate($template); } + + /** + * Getter for current main node + * + * @return $currMainNode Current main node + */ + public final function getCurrMainNode () { + return $this->curr['main_node']; + } + + /** + * Setter for current main node + * + * @param $element Element name to set as current main node + * @return $currMainNode Current main node + */ + private final function setCurrMainNode ($element) { + $this->curr['main_node'] = (string) $element; + } + + /** + * Getter for main node array + * + * @return $mainNodes Array with valid main node names + */ + public final function getMainNodes () { + return $this->mainNodes; + } + + /** + * Getter for sub node array + * + * @return $subNodes Array with valid sub node names + */ + public final function getSubNodes () { + return $this->subNodes; + } + + /** + * Handles the start element of an XML resource + * + * @param $resource XML parser resource (currently ignored) + * @param $element The element we shall handle + * @param $attributes All attributes + * @return void + * @throws InvalidXmlNodeException If an unknown/invalid XML node name was found + */ + public function startElement ($resource, $element, array $attributes) { + // Initial method name which will never be called... + $methodName = 'initMenu'; + + // Make the element name lower-case + $element = strtolower($element); + + // Is the element a main node? + //* DEBUG: */ echo "START: >".$element."<
\n"; + if (in_array($element, $this->getMainNodes())) { + // Okay, main node found! + $methodName = 'start' . $this->convertToClassName($element); + + // Set it + $this->setCurrMainNode($element); + } elseif (in_array($element, $this->getSubNodes())) { + // Sub node found + $methodName = 'start' . $this->convertToClassName($element); + } elseif ($element != 'menu') { + // Invalid node name found + throw new InvalidXmlNodeException(array($this, $element, $attributes), XmlParser::EXCEPTION_XML_NODE_UNKNOWN); + } + + // Call method + //* DEBUG: */ echo "call: ".$methodName."
\n"; + call_user_func_array(array($this, $methodName), $attributes); + } + + /** + * Ends the main or sub node by sending out the gathered data + * + * @param $resource An XML resource pointer (currently ignored) + * @param $nodeName Name of the node we want to finish + * @return void + * @throws XmlNodeMismatchException If current main node mismatches the closing one + */ + public function endElement ($resource, $nodeName) { + // Make all lower-case + $nodeName = strtolower($nodeName); + + // Does this match with current main node? + //* DEBUG: */ echo "END: >".$nodeName."<
\n"; + if (($nodeName != $this->getCurrMainNode()) && (in_array($nodeName, $this->getMainNodes()))) { + // Did not match! + throw new XmlNodeMismatchException (array($this, $nodeName, $this->getCurrMainNode()), XmlParser::EXCEPTION_XML_NODE_MISMATCH); + } // END - if + + // Construct method name + $methodName = 'finish' . $this->convertToClassName($nodeName); + + // Call the corresponding method + //* DEBUG: */ echo "call: ".$methodName."
\n"; + call_user_func_array(array($this, $methodName), array()); + } + + /** + * Currently not used + * + * @param $resource XML parser resource (currently ignored) + * @param $characters Characters to handle + * @return void + * @todo Find something useful with this! + */ + public function characterHandler ($resource, $characters) { + // Trim all spaces away + $characters = trim($characters); + + // Is this string empty? + if (empty($characters)) { + // Then skip it silently + return false; + } // END - if + + // Unfinished work! + $this->partialStub('Handling extra characters is not yet supported! length='.strlen($characters)); + } + + /** + * Handles the template depency for given node + * + * @param $node The node we should load a depency template + * @param $templateDepency A template to load to satisfy depencies + * @return void + */ + private function handleTemplateDepency ($node, $templateDepency) { + // Is the template depency set? + if ((!empty($templateDepency)) && (!isset($this->depencyContent[$node]))) { + // Get a temporay menu template instance + $templateInstance = ObjectFactory::createObjectByConfiguredName('menu_template_class', array($this->getApplicationInstance(), $this->getMenuInstance())); + + // Then load it + $templateInstance->loadMenuTemplate($templateDepency); + + // Get an XmlParser instance + $templateInstance->renderXmlContent(); + + // Parse the template's content contents + $this->depencyContent[$node] = $templateInstance->getRawTemplateData(); + } // END - if + } + + /** + * Intializes the menu + * + * @param $templateDepency A template to load to satisfy depencies + * @return void + * @todo Add cache creation here + */ + private function initMenu ($templateDepency = '') { + // Get web template engine + $this->setTemplateInstance(ObjectFactory::createObjectByConfiguredName('web_template_class', array($this->getApplicationInstance()))); + + // Handle the depency template + $this->handleTemplateDepency('menu', $templateDepency); + + // Load the header template for this page + $this->getTemplateInstance()->loadCodeTemplate('menu_global_start'); + + // Set the variable group to page + $this->setVariableGroup('menu'); + + // Set its content in this template instance + $this->assignVariable('menu_start', $this->getTemplateInstance()->getRawTemplateData()); + } + + /** + * Finishes the menu + * + * @return void + */ + private function finishMenu () { + // Load the header template for this page + $this->getTemplateInstance()->loadCodeTemplate('menu_global_end'); + + // Set the variable group to page + $this->setVariableGroup('menu'); + + // Set its content in this template instance + $this->assignVariable('menu_end', $this->getTemplateInstance()->getRawTemplateData()); + } + + /** + * Starts the menu entries by loading a (maybe) provided template depency + * + * @param $templateDepency A template to load to satisfy depencies + * @return void + */ + private function startEntryList ($templateDepency = '') { + // Handle the depency template + $this->handleTemplateDepency('entries', $templateDepency); + + // Load the header template for this page + $this->getTemplateInstance()->loadCodeTemplate('menu_entries_start'); + + // Set the variable group to page + $this->setVariableGroup('menu'); + + // Set its content in this template instance + $this->assignVariable('entries_start', $this->getTemplateInstance()->getRawTemplateData()); + } + + /** + * Finishes the menu entries + * + * @return void + */ + private function finishEntryList () { + // Load the header template for this page + $this->getTemplateInstance()->loadCodeTemplate('menu_entries_end'); + + // Set the variable group to page + $this->setVariableGroup('menu'); + + // Set its content in this template instance + $this->assignVariable('entries_end', $this->getTemplateInstance()->getRawTemplateData()); + } + + /** + * Starts the menu header + * + * @return void + */ + private function startHeader () { + // Do we have a template instance? + if (is_null($this->getTemplateInstance())) { + // Init template instance for underlaying web templates + $templateInstance = ObjectFactory::createObjectByConfiguredName('web_template_class'); + + // Set it in this template engine + $this->setTemplateInstance($templateInstance); + } // END - if + + // Load the header template for this page + $this->getTemplateInstance()->loadCodeTemplate('menu_header_start'); + + // Set the variable group to page + $this->setVariableGroup('menu'); + + // Set its content in this template instance + $this->assignVariable('header', $this->getTemplateInstance()->getRawTemplateData()); + } + + /** + * Finishes the menu header + * + * @return void + */ + private function finishHeader () { + // Load the header template for this page + $this->getTemplateInstance()->loadCodeTemplate('menu_header_end'); + + // Set the variable group to page + $this->setVariableGroup('menu'); + + // Set its content in this template instance + $this->assignVariable('header_end', $this->getTemplateInstance()->getRawTemplateData()); + } + + /** + * Starts the menu footer + * + * @return void + */ + private function startFooter () { + // Do we have a template instance? + if (is_null($this->getTemplateInstance())) { + // Init template instance for underlaying web templates + $templateInstance = ObjectFactory::createObjectByConfiguredName('web_template_class'); + + // Set it in this template engine + $this->setTemplateInstance($templateInstance); + } // END - if + + // Load the footer template for this page + $this->getTemplateInstance()->loadCodeTemplate('menu_footer_start'); + + // Set the variable group to page + $this->setVariableGroup('menu'); + + // Set its content in this template instance + $this->assignVariable('footer', $this->getTemplateInstance()->getRawTemplateData()); + } + + /** + * Finishes the menu footer + * + * @return void + */ + private function finishFooter () { + // Load the footer template for this page + $this->getTemplateInstance()->loadCodeTemplate('menu_footer_end'); + + // Set the variable group to page + $this->setVariableGroup('menu'); + + // Set its content in this template instance + $this->assignVariable('footer_end', $this->getTemplateInstance()->getRawTemplateData()); + } + + /** + * Starts the menu property 'title' + * + * @param $id Id of the menu + * @param $class The title to add to the menu + * @return void + */ + private function startTitle ($id, $class) { + // Set id as current + $this->curr['id'] = $id; + + // Load the title template for this page + $this->getTemplateInstance()->loadCodeTemplate('menu_title_' . $id . '_start'); + + // Set the variable group to page + $this->setVariableGroup('menu'); + + // Set its content in this template instance + $this->assignVariable('title_start_' . $this->curr['id'], $this->getTemplateInstance()->getRawTemplateData()); + } + + /** + * Finishes the title node by added another template to the menu + * + * @return void + */ + private function finishTitle () { + // Load the title template for this page + $this->getTemplateInstance()->loadCodeTemplate('menu_title_' . $this->curr['id'] . '_end'); + + // Set the variable group to page + $this->setVariableGroup('menu'); + + // Set its content in this template instance + $this->assignVariable('title_end_' . $this->curr['id'], $this->getTemplateInstance()->getRawTemplateData()); + } + + /** + * Starts the menu text + * + * @return void + */ + private function startText () { + // Do we have a template instance? + if (is_null($this->getTemplateInstance())) { + // Init template instance for underlaying web templates + $templateInstance = ObjectFactory::createObjectByConfiguredName('web_template_class'); + + // Set it in this template engine + $this->setTemplateInstance($templateInstance); + } // END - if + + // Load the text template for this page + $this->getTemplateInstance()->loadCodeTemplate('menu_text_start'); + + // Set the variable group to page + $this->setVariableGroup('menu'); + + // Set its content in this template instance + $this->assignVariable('text', $this->getTemplateInstance()->getRawTemplateData()); + } + + /** + * Finishes the menu text + * + * @return void + */ + private function finishText () { + // Load the text template for this page + $this->getTemplateInstance()->loadCodeTemplate('menu_text_end'); + + // Set the variable group to page + $this->setVariableGroup('menu'); + + // Set its content in this template instance + $this->assignVariable('text_end', $this->getTemplateInstance()->getRawTemplateData()); + } + + /** + * Starts the menu property 'entry' + * + * @param $id Id of the menu + * @return void + */ + private function startEntry ($id) { + // Set id as current + $this->curr['entry_id'] = $id; + + // Load the entry template for this page + $this->getTemplateInstance()->loadCodeTemplate('menu_entry_' . $id . '_start'); + + // Set the variable group to page + $this->setVariableGroup('menu'); + + // Set its content in this template instance + $this->assignVariable('entry_start_' . $this->curr['id'], $this->getTemplateInstance()->getRawTemplateData()); + } + + /** + * Finishes the entry node by added another template to the menu + * + * @return void + */ + private function finishEntry () { + // Load the entry template for this page + $this->getTemplateInstance()->loadCodeTemplate('menu_entry_' . $this->curr['entry_id'] . '_end'); + + // Set the variable group to page + $this->setVariableGroup('menu'); + + // Set its content in this template instance + $this->assignVariable('entry_end_' . $this->curr['id'], $this->getTemplateInstance()->getRawTemplateData()); + } + /** + * Starts the menu property 'anchor' + * + * @param $id Id of the anchor + * @param $link Link text of the anchor + * @param $title Link title of the anchor + * @return void + */ + private function startAnchor () { + $this->partialStub('Please implement this method.'); + } + + /** + * Finishes the anchor node by added another template to the menu + * + * @return void + */ + private function finishAnchor () { + $this->partialStub('Please implement this method.'); + } + + /** + * Getter for menu cache file (FQFN) + * + * @return $fqfn Full-qualified file name of the menu cache + */ + public function getMenuCacheFqfn () { + // Get the FQFN ready + $fqfn = sprintf("%s%s%s/%s.%s", + $this->getConfigInstance()->getConfigEntry('base_path'), + $this->getGenericBasePath(), + 'menus/_cache', + md5( + $this->getMenuInstance()->getMenuName() . ':' . + $this->__toString() . ':' . + $this->getMenuInstance()->__toString() + ), + $this->getMenuInstance()->getMenuType() + ); + + // Return it + return $fqfn; + } } // [EOF]