X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=inc%2Fclasses%2Fmain%2Ftemplate%2Fclass_TemplateEngine.php;h=23ac8b4a0fa35e4749feb8b00e9acbf8edf789c4;hb=b3e47fb693fb8d40868158b0192b3392b309d97a;hp=c9e05ab6029ebbb758b3ad20a5e3a963ca005733;hpb=a1581e4149e08719d2520fab502971bfd05fddb6;p=shipsimu.git diff --git a/inc/classes/main/template/class_TemplateEngine.php b/inc/classes/main/template/class_TemplateEngine.php index c9e05ab..23ac8b4 100644 --- a/inc/classes/main/template/class_TemplateEngine.php +++ b/inc/classes/main/template/class_TemplateEngine.php @@ -3,11 +3,11 @@ * The own template engine for loading caching and sending out the web pages * and emails. * - * @author Roland Haeder + * @author Roland Haeder * @version 0.0.0 * @copyright Copyright(c) 2007, 2008 Roland Haeder, this is free software * @license GNU GPL 3.0 or any newer version - * @link http://www.ship-simu.org + * @link http://www.ship-simu.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 @@ -109,9 +109,9 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate private $helpers = array(); // Exception codes for the template engine - const EXCEPTION_TEMPLATE_TYPE_IS_UNEXPECTED = 0xa00; - const EXCEPTION_TEMPLATE_CONTAINS_INVALID_VAR = 0xa01; - const EXCEPTION_INVALID_VIEW_HELPER = 0xa02; + const EXCEPTION_TEMPLATE_TYPE_IS_UNEXPECTED = 0x020; + const EXCEPTION_TEMPLATE_CONTAINS_INVALID_VAR = 0x021; + const EXCEPTION_INVALID_VIEW_HELPER = 0x022; /** * Protected constructor @@ -123,10 +123,10 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate parent::__construct(__CLASS__); // Set part description - $this->setObjectDescription("Template-Engine"); + $this->setObjectDescription("Web template engine"); // Create unique ID number - $this->createUniqueID(); + $this->generateUniqueId(); // Clean up a little $this->removeNumberFormaters(); @@ -138,7 +138,7 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate * * @param $basePath The local base path for all templates * @param $langInstance An instance of LanguageSystem (default) - * @param $ioInstance An instance of FileIOHandler (default, middleware!) + * @param $ioInstance An instance of FileIoHandler (default, middleware!) * @return $tplInstance An instance of TemplateEngine * @throws BasePathIsEmptyException If the provided $basePath is empty * @throws InvalidBasePathStringException If $basePath is no string @@ -147,7 +147,7 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate * @throws BasePathReadProtectedException If $basePath is * read-protected */ - public final static function createTemplateEngine ($basePath, ManageableLanguage $langInstance, FileIOHandler $ioInstance) { + public final static function createTemplateEngine ($basePath, ManageableLanguage $langInstance, FileIoHandler $ioInstance) { // Get a new instance $tplInstance = new TemplateEngine(); @@ -167,7 +167,7 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate } // Get configuration instance - $cfgInstance = $tplInstance->getConfigInstance(); + $cfgInstance = FrameworkConfiguration::getInstance(); // Set the base path $tplInstance->setBasePath($basePath); @@ -177,14 +177,14 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate // Set the language and IO instances $tplInstance->setLanguageInstance($langInstance); - $tplInstance->setFileIOInstance($ioInstance); + $tplInstance->setFileIoInstance($ioInstance); // Set template extensions - $tplInstance->setRawTemplateExtension($cfgInstance->readConfig("raw_template_extension")); - $tplInstance->setCodeTemplateExtension($cfgInstance->readConfig("code_template_extension")); + $tplInstance->setRawTemplateExtension($cfgInstance->readConfig('raw_template_extension')); + $tplInstance->setCodeTemplateExtension($cfgInstance->readConfig('code_template_extension')); // Absolute output path for compiled templates - $tplInstance->setCompileOutputPath(PATH . $cfgInstance->readConfig("compile_output_path")); + $tplInstance->setCompileOutputPath(PATH . $cfgInstance->readConfig('compile_output_path')); // Return the prepared instance return $tplInstance; @@ -283,6 +283,42 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate } } + /** + * Setter for template type. Only "html", "emails" and "compiled" should + * be sent here + * + * @param $templateType The current template's type + * @return void + */ + private final function setTemplateType ($templateType) { + // Cast it + $templateType = (string) $templateType; + + // And set it (only 2 letters) + $this->templateType = $templateType; + } + + /** + * Setter for the last loaded template's FQFN + * + * @param $template The last loaded template + * @return void + */ + private final function setLastTemplate ($template) { + // Cast it to string + $template = (string) $template; + $this->lastTemplate = $template; + } + + /** + * Getter for the last loaded template's FQFN + * + * @return $template The last loaded template + */ + private final function getLastTemplate () { + return $this->lastTemplate; + } + /** * Initialize the variable stack. This holds all variables for later * compilation. @@ -290,7 +326,7 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate * @return void */ public final function initVariableStack () { - $this->varStack = new FrameworkArrayObject(); + $this->varStack = new FrameworkArrayObject("FakedVariableStack"); } /** @@ -372,8 +408,8 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate /** * Setter for path of compiled templates * - * @param $compileOutputPath The local base path for all - * compiled templates + * @param $compileOutputPath The local base path for all compiled + * templates * @return void */ public final function setCompileOutputPath ($compileOutputPath) { @@ -384,21 +420,6 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate $this->compileOutputPath = $compileOutputPath; } - /** - * Setter for template type. Only "html", "emails" and "compiled" should - * be sent here - * - * @param $templateType The current template's type - * @return void - */ - private final function setTemplateType ($templateType) { - // Cast it - $templateType = (string) $templateType; - - // And set it (only 2 letters) - $this->templateType = $templateType; - } - /** * Getter for template type * @@ -408,32 +429,11 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate return $this->templateType; } - /** - * Setter for the last loaded template's FQFN - * - * @param $template The last loaded template - * @return void - */ - private final function setLastTemplate ($template) { - // Cast it to string - $template = (string) $template; - $this->lastTemplate = $template; - } - - /** - * Getter for the last loaded template's FQFN - * - * @return $template The last loaded template - */ - private final function getLastTemplate () { - return $this->lastTemplate; - } - /** * Assign (add) a given variable with a value * - * @param $var The variable we are looking for - * @param $value The value we want to store in the variable + * @param $var The variable we are looking for + * @param $value The value we want to store in the variable * @return void */ public final function assignVariable ($var, $value) { @@ -450,22 +450,10 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate } } - /** - * Assign a given congfiguration variable with a value - * - * @param $var The configuration variable we are looking for - * @param $value The value we want to store in the variable - * @return void - */ - public final function assignConfigVariable ($var, $value) { - // Sweet and simple... - $this->configVariables[$var] = $value; - } - /** * Removes a given variable * - * @param $var The variable we are looking for + * @param $var The variable we are looking for * @return void */ public final function removeVariable ($var) { @@ -482,7 +470,7 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate /** * Private setter for raw template data * - * @param $rawTemplateData The raw data from the template + * @param $rawTemplateData The raw data from the template * @return void */ private final function setRawTemplateData ($rawTemplateData) { @@ -495,6 +483,8 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate /** * Private setter for compiled templates + * + * @return void */ private final function setCompiledData ($compiledData) { // Cast it to string @@ -507,10 +497,10 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate /** * Private loader for all template types * - * @param $template The template we shall load + * @param $template The template we shall load * @return void */ - private final function loadTemplate ($template) { + private function loadTemplate ($template) { // Cast it to string $template = (string) $template; @@ -518,7 +508,7 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate $ext = $this->getRawTemplateExtension(); // If we shall load a code-template we need to switch the file extension - if ($this->getTemplateType() == $this->getConfigInstance()->readConfig("code_template_type")) { + if ($this->getTemplateType() == $this->getConfigInstance()->readConfig('code_template_type')) { // Switch over to the code-template extension $ext = $this->getCodeTemplateExtension(); } @@ -539,16 +529,16 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate /** * A private loader for raw template names * - * @param $fqfn The full-qualified file name for a template + * @param $fqfn The full-qualified file name for a template * @return void * @throws NullPointerException If $inputInstance is null * @throws NoObjectException If $inputInstance is not an object * @throws MissingMethodException If $inputInstance is missing a - * required method + * required method */ private function loadRawTemplateData ($fqfn) { // Get a input/output instance from the middleware - $ioInstance = $this->getFileIOInstance(); + $ioInstance = $this->getFileIoInstance(); // Validate the instance if (is_null($ioInstance)) { @@ -576,9 +566,9 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate * Try to assign an extracted template variable as a "content" or "config" * variable. * - * @param $varName The variable's name (shall be content or - * config) by default - * @param $var The variable we want to assign + * @param $varName The variable's name (shall be content orconfig) by + * default + * @param $var The variable we want to assign */ private function assignTemplateVariable ($varName, $var) { // Is it not a config variable? @@ -587,7 +577,7 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate $this->assignVariable($var, ""); } else { // Configuration variables - $this->assignConfigVariable($var, $this->getConfigInstance()->readConfig($var)); + $this->assignConfigVariable($var); } } @@ -596,9 +586,6 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate * * @param $rawData The raw template data we shall analyze * @return void - * @throws InvalidTemplateVariableNameException If a variable name - * in a template is - * invalid */ private function extractVariablesFromRawData ($rawData) { // Cast to string @@ -611,22 +598,16 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate if ((is_array($variableMatches)) && (count($variableMatches) == 4) && (count($variableMatches[0]) > 0)) { // Initialize all missing variables foreach ($variableMatches[3] as $key=>$var) { - // Is the variable name valid? - if (($variableMatches[1][$key] != $this->getConfigInstance()->readConfig("tpl_valid_var")) && ($variableMatches[1][$key] != "config")) { - // Invalid variable name - throw new InvalidTemplateVariableNameException(array($this, $this->getLastTemplate(), $variableMatches[1][$key], $this->getConfigInstance()), self::EXCEPTION_TEMPLATE_CONTAINS_INVALID_VAR); - } - // Try to assign it, empty strings are being ignored $this->assignTemplateVariable($variableMatches[1][$key], $var); - } - } + } // END - foreach + } // END - if } /** * Main analysis of the loaded template * - * @param $templateMatches Found template place-holders, see below + * @param $templateMatches Found template place-holders, see below * @return void * *--------------------------------- @@ -651,24 +632,27 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate // RECURSIVE PROTECTION! BE CAREFUL HERE! if ((!isset($this->loadedRawData[$template])) && (!in_array($template, $this->loadedTemplates))) { - // Then try to search for code-templates first - try { - // Load the code template and remember it's contents - $this->loadCodeTemplate($template); - $this->loadedRawData[$template] = $this->getRawTemplateData(); + // Template not found, but maybe variable assigned? + if ($this->isVariableAlreadySet($template) !== false) { + // Use that content here + $this->loadedRawData[$template] = $this->readVariable($template); - // Remember this template for recursion detection - // RECURSIVE PROTECTION! + // Recursive protection: $this->loadedTemplates[] = $template; - } catch (FilePointerNotOpenedException $e) { - // Template not found, but maybe variable assigned? - if ($this->isVariableAlreadySet($template) !== false) { - // Use that content here - $this->loadedRawData[$template] = $this->readVariable($template); - - // Recursive protection: + } else { + // Then try to search for code-templates + try { + // Load the code template and remember it's contents + $this->loadCodeTemplate($template); + $this->loadedRawData[$template] = $this->getRawTemplateData(); + + // Remember this template for recursion detection + // RECURSIVE PROTECTION! $this->loadedTemplates[] = $template; - } else { + } catch (FileIsMissingException $e) { + // Even this is not done... :/ + $this->rawTemplates[] = $template; + } catch (FilePointerNotOpenedException $e) { // Even this is not done... :/ $this->rawTemplates[] = $template; } @@ -685,8 +669,8 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate /** * Compile a given raw template code and remember it for later usage * - * @param $code The raw template code - * @param $template The template's name + * @param $code The raw template code + * @param $template The template's name * @return void */ private function compileCode ($code, $template) { @@ -721,7 +705,7 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate * Insert all given and loaded templates by running through all loaded * codes and searching for their place-holder in the main template * - * @param $templateMatches See method analyzeTemplate() + * @param $templateMatches See method analyzeTemplate() * @return void */ private function insertAllTemplates (array $templateMatches) { @@ -771,6 +755,9 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate // Remember this template for recursion detection // RECURSIVE PROTECTION! $this->loadedTemplates[] = $template; + } catch (FileIsMissingException $e) { + // This template was never found. We silently ignore it + unset($this->rawTemplates[$key]); } catch (FilePointerNotOpenedException $e) { // This template was never found. We silently ignore it unset($this->rawTemplates[$key]); @@ -784,6 +771,7 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate * * @param $varMatches An array full of variable/value pairs. * @return void + * @todo Unfinished work or don't die here. */ private function assignAllVariables (array $varMatches) { // Search for all variables @@ -801,7 +789,6 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate $this->assignVariable($var, $varMatches[3][$key]); } elseif (!empty($varMatches[2][$key])) { // Non-string found so we need some deeper analysis... - // @TODO Unfinished work or don't die here. die("Deeper analysis not yet implemented!"); } @@ -875,15 +862,14 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate // Walk through all variables for ($idx = $this->varStack->getIterator(); $idx->valid(); $idx->next()) { - // Get current entry $currEntry = $idx->current(); // Replace all [$var] or {?$var?} with the content + //* DEBUG: */ echo "name=".$currEntry['name'].", value=
".htmlentities($currEntry['value'])."
\n"; $content = str_replace("\$content[".$currEntry['name']."]", $currEntry['value'], $content); $content = str_replace("[".$currEntry['name']."]", $currEntry['value'], $content); $content = str_replace("{?".$currEntry['name']."?}", $currEntry['value'], $content); - } // END - for // Set the content back @@ -913,14 +899,25 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate * located in "html" by default * @return void */ - public final function loadWebTemplate ($template) { + public function loadWebTemplate ($template) { // Set template type - $this->setTemplateType($this->getConfigInstance()->readConfig("web_template_type")); + $this->setTemplateType($this->getConfigInstance()->readConfig('web_template_type')); // Load the special template $this->loadTemplate($template); } + /** + * Assign a given congfiguration variable with a value + * + * @param $var The configuration variable we want to assign + * @return void + */ + public function assignConfigVariable ($var) { + // Sweet and simple... + $this->configVariables[$var] = $this->getConfigInstance()->readConfig($var); + } + /** * Load a specified email template into the engine * @@ -928,9 +925,9 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate * located in "emails" by default * @return void */ - public final function loadEmailTemplate ($template) { + public function loadEmailTemplate ($template) { // Set template type - $this->setTemplateType($this->getConfigInstance()->readConfig("email_template_type")); + $this->setTemplateType($this->getConfigInstance()->readConfig('email_template_type')); // Load the special template $this->loadTemplate($template); @@ -943,9 +940,9 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate * located in "code" by default * @return void */ - public final function loadCodeTemplate ($template) { + public function loadCodeTemplate ($template) { // Set template type - $this->setTemplateType($this->getConfigInstance()->readConfig("code_template_type")); + $this->setTemplateType($this->getConfigInstance()->readConfig('code_template_type')); // Load the special template $this->loadTemplate($template); @@ -955,10 +952,11 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate * Compile all variables by inserting their respective values * * @return void + * @todo Make this code some nicer... */ public final function compileVariables () { // Initialize the $content array - $validVar = $this->getConfigInstance()->readConfig("tpl_valid_var"); + $validVar = $this->getConfigInstance()->readConfig('tpl_valid_var'); $dummy = array(); // Iterate through all variables @@ -968,6 +966,7 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate $currVariable = $idx->current(); // Transfer it's name/value combination to the $content array + //* DEBUG: */ echo $currVariable['name']."=
".htmlentities($currVariable['value'])."
\n"; $dummy[$currVariable['name']] = $currVariable['value']; }// END - if @@ -982,22 +981,73 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate unset($idx); unset($currVariable); - // Finalize the compilation of template variables - $this->finalizeVariableCompilation(); + // Run the compilation twice to get content from helper classes in + $cnt = 0; + while ($cnt < 3) { + // Finalize the compilation of template variables + $this->finalizeVariableCompilation(); - // Prepare the eval() command for comiling the template - $eval = sprintf("\$this->setCompiledData(\"%s\");", - addslashes($this->getRawTemplateData()) - ); + // Prepare the eval() command for comiling the template + $eval = sprintf("\$result = \"%s\";", + addslashes($this->getRawTemplateData()) + ); - // Debug message - if ((defined('DEBUG_EVAL')) && (is_object($this->getDebugInstance()))) $this->getDebugInstance()->output(sprintf("[%s:] Constructed PHP command:
%s

\n", - $this->__toString(), - htmlentities($eval) - )); + // This loop does remove the backslashes (\) in PHP parameters + while (strpos($eval, ""))); + $evalMiddle = stripslashes($evalMiddle); + + // Remove the middle part from right one + $evalRight = substr($evalRight, (strpos($evalRight, "?>") + 2)); + + // And put all together + $eval = sprintf("%s<%%php %s %%>%s", $evalLeft, $evalMiddle, $evalRight); + } // END - while + + // Prepare PHP code for eval() command + $evalLength = strlen($eval); + $eval = str_replace( + "<%php", "\";", + str_replace( + "%>", "\n\$result .= \"", $eval + ) + ); - // Run the constructed command. This will "compile" all variables in - eval($eval); + // Did something change? + if (strlen($eval) != $eval) { + // Run the constructed command. This will "compile" all variables in + @eval($eval); + } // END - if + + // Goes something wrong? + if (!isset($result)) { + // Output eval command + $this->debugOutput(sprintf("Failed eval() code:
%s
", $this->markupCode($eval, true)), true); + + // Output backtrace here + $this->debugBacktrace(); + } // END - if + + // Set raw template data + $this->setRawTemplateData($result); + $cnt++; + } + + // Set the new content + $this->setCompiledData($result); } /** @@ -1005,15 +1055,15 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate * * @return void * @throws UnexpectedTemplateTypeException If the template type is - * not "code" + * not "code" * @throws InvalidArrayCountException If an unexpected array - * count has been found + * count has been found */ public final function compileTemplate () { // We will only work with template type "code" from configuration - if ($this->getTemplateType() != $this->getConfigInstance()->readConfig("code_template_type")) { + if ($this->getTemplateType() != $this->getConfigInstance()->readConfig('code_template_type')) { // Abort here - throw new UnexpectedTemplateTypeException(array($this, $this->getTemplateType(), $this->getConfigInstance()->readConfig("code_template_type")), self::EXCEPTION_TEMPLATE_TYPE_IS_UNEXPECTED); + throw new UnexpectedTemplateTypeException(array($this, $this->getTemplateType(), $this->getConfigInstance()->readConfig('code_template_type')), self::EXCEPTION_TEMPLATE_TYPE_IS_UNEXPECTED); } // END - if // Get the raw data. @@ -1077,15 +1127,8 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate $this->getTemplateType() ); - if ((is_object($this->getDebugInstance())) && (method_exists($this->getDebugInstance(), 'output'))) { - // Use debug output handler - $this->getDebugInstance()->output($msg); - die(); - } else { - // Put directly out - // DO NOT REWRITE THIS TO app_die() !!! - die($msg); - } + // Write the problem to the world... + $this->debugOutput($msg); break; } } @@ -1155,6 +1198,23 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate // Get the content and set it in the response class $responseInstance->writeToBody($this->getCompiledData()); } + + /** + * Assigns all the application data with template variables + * + * @param $appInstance A manageable application instance + * @return void + */ + public function assignApplicationData (ManageableApplication $appInstance) { + // Get long name and assign it + $this->assignVariable("app_full_name" , $appInstance->getAppName()); + + // Get short name and assign it + $this->assignVariable("app_short_name", $appInstance->getAppShortName()); + + // Get version number and assign it + $this->assignVariable("app_version" , $appInstance->getAppVersion()); + } } // [EOF]