X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=inc%2Fclasses%2Fmain%2Ftemplate%2Fclass_TemplateEngine.php;h=e1c3bcee1e5fdeb743f6738e685ca67fa246cd1d;hb=389f3abad52f9cde3323db5d3d187562fe801a71;hp=cc95918414a88b9b15e07deb361ed27896169054;hpb=a94b064b1e66382b0a9462b2613069ccd8b748f2;p=hub.git diff --git a/inc/classes/main/template/class_TemplateEngine.php b/inc/classes/main/template/class_TemplateEngine.php index cc9591841..e1c3bcee1 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 - * @version 0.3.0 + * @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.mxchange.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 @@ -20,7 +20,7 @@ * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * along with this program. If not, see . */ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate { /** @@ -114,19 +114,19 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate const EXCEPTION_INVALID_VIEW_HELPER = 0xa02; /** - * Private constructor + * Protected constructor * * @return void */ - private final function __construct () { + protected function __construct () { // Call parent constructor - parent::constructor(__CLASS__); + parent::__construct(__CLASS__); // Set part description - $this->setPartDescr("Template-Engine"); + $this->setObjectDescription("Web template engine"); // Create unique ID number - $this->createUniqueID(); + $this->generateUniqueId(); // Clean up a little $this->removeNumberFormaters(); @@ -136,18 +136,18 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate /** * Creates an instance of the class TemplateEngine and prepares it for usage * - * @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 $basePath The local base path for all templates + * @param $langInstance An instance of LanguageSystem (default) + * @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 * @throws BasePathIsNoDirectoryException If $basePath is no - * directory or not found + * directory or not found * @throws BasePathReadProtectedException If $basePath is - * read-protected + * 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; @@ -194,7 +194,7 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate * Search for a variable in the stack * * @param $var The variable we are looking for - * @return $idx FALSE means not found, > 0 means found on a specific index + * @return $idx FALSE means not found, >=0 means found on a specific index */ private function isVariableAlreadySet ($var) { // First everything is not found @@ -217,6 +217,33 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate return $found; } + /** + * Return a content of a variable or null if not found + * + * @param $var The variable we are looking for + * @return $content Content of the variable or null if not found + */ + private function readVariable ($var) { + // First everything is not found + $content = null; + + // Now search for it + for ($idx = $this->varStack->getIterator(); $idx->valid(); $idx->next()) { + // Get current item + $currEntry = $idx->current(); + + // Is the entry found? + if ($currEntry['name'] == $var) { + // Found! + $content = $currEntry['value']; + break; + } + } + + // Return the current position + return $content; + } + /** * Add a variable to the stack * @@ -227,8 +254,8 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate private function addVariable ($var, $value) { // Add it to the stack $this->varStack->append(array( - 'name' => $var, - 'value' => $value + 'name' => trim($var), + 'value' => trim($value) )); } @@ -263,7 +290,7 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate * @return void */ public final function initVariableStack () { - $this->varStack = new FrameworkArrayObject(); + $this->varStack = new FrameworkArrayObject("FakedVariableStack"); } /** @@ -491,7 +518,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(); } @@ -520,15 +547,8 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate * required method */ private function loadRawTemplateData ($fqfn) { - // Debug message - if ((defined('DEBUG_TEMPLATE')) && (is_object($this->getDebugInstance()))) $this->getDebugInstance()->output(sprintf("[%s:] Template %s vom Typ %s wird geladen.
\n", - $this->__toString(), - $template, - $this->getTemplateType() - )); - // Get a input/output instance from the middleware - $ioInstance = $this->getFileIOInstance(); + $ioInstance = $this->getFileIoInstance(); // Validate the instance if (is_null($ioInstance)) { @@ -545,12 +565,6 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate // Load the raw template $rawTemplateData = $ioInstance->loadFileContents($fqfn); - // Debug message - if ((defined('DEBUG_TEMPLATE')) && (is_object($this->getDebugInstance()))) $this->getDebugInstance()->output(sprintf("[%s:] %s Byte Rohdaten geladen.
\n", - $this->__toString(), - strlen($rawTemplateData) - )); - // Store the template's contents into this class $this->setRawTemplateData($rawTemplateData); @@ -580,11 +594,8 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate /** * Extract variables from a given raw data stream * - * @param $rawData The raw template data we shall analyze + * @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 @@ -597,12 +608,6 @@ 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); } @@ -623,7 +628,7 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate * [2] => Array - An array with right part of a match including ":" * [3] => Array - An array with right part of a match excluding ":" */ - private function analyzeTemplate ($templateMatches) { + private function analyzeTemplate (array $templateMatches) { // Backup raw template data $backup = $this->getRawTemplateData(); @@ -637,18 +642,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! - $this->rawTemplates[] = $template; + } 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; + } catch (FilePointerNotOpenedException $e) { + // Even this is not done... :/ + $this->rawTemplates[] = $template; + } } } // if ((!isset( ... @@ -701,15 +715,15 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate * @param $templateMatches See method analyzeTemplate() * @return void */ - private function insertAllTemplates ($templateMatches) { + private function insertAllTemplates (array $templateMatches) { // Run through all loaded codes - foreach ($this->loadedRawData as $template => $code) { + foreach ($this->loadedRawData as $template=>$code) { // Search for the template $foundIndex = array_search($template, $templateMatches[1]); // Lookup the matching template replacement - if (isset($templateMatches[0][$foundIndex])) { + if (($foundIndex !== false) && (isset($templateMatches[0][$foundIndex]))) { // Get the current raw template $rawData = $this->getRawTemplateData(); @@ -719,8 +733,10 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate // Set the new raw data $this->setRawTemplateData($rawData); - } - } + + } // END - if + + } // END - foreach } /** @@ -760,7 +776,7 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate * @param $varMatches An array full of variable/value pairs. * @return void */ - private function assignAllVariables ($varMatches) { + private function assignAllVariables (array $varMatches) { // Search for all variables foreach ($varMatches[1] as $key=>$var) { @@ -774,8 +790,9 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate if ((substr($varMatches[2][$key], 0, 1) == "\"") && (substr($varMatches[2][$key], -1, 1) == "\"")) { // Free string detected! Which we can assign directly $this->assignVariable($var, $varMatches[3][$key]); - } else { + } 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!"); } @@ -787,21 +804,27 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate * @param $templateMatches See method analyzeTemplate() for details * @return void */ - private function compileRawTemplateData ($templateMatches) { + private function compileRawTemplateData (array $templateMatches) { // Are some code-templates found which we need to compile? if (count($this->loadedRawData) > 0) { // Then compile all! - foreach ($this->loadedRawData as $template => $code) { + foreach ($this->loadedRawData as $template=>$code) { + + // Is this template already compiled? + if (in_array($template, $this->compiledTemplates)) { + // Then skip it + continue; + } // Search for the template $foundIndex = array_search($template, $templateMatches[1]); // Lookup the matching variable data - if (isset($templateMatches[3][$foundIndex])) { + if (($foundIndex !== false) && (isset($templateMatches[3][$foundIndex]))) { // Split it up with another reg. exp. into variable=value pairs - @preg_match_all($this->regExpVarValue, $templateMatches[3][$foundIndex], $varMatches); + preg_match_all($this->regExpVarValue, $templateMatches[3][$foundIndex], $varMatches); // Assign all variables $this->assignAllVariables($varMatches); @@ -819,6 +842,44 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate } // END - if (count($this->loadedRawData) ... } + /** + * Inserts all raw templates into their respective variables + * + * @return void + */ + private function insertRawTemplates () { + // Load all templates + foreach ($this->rawTemplates as $template=>$content) { + // Set the template as a variable with the content + $this->assignVariable($template, $content); + } + } + + /** + * Finalizes the compilation of all template variables + * + * @return void + */ + private function finalizeVariableCompilation () { + // Get the content + $content = $this->getRawTemplateData(); + + // 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 + $this->setRawTemplateData($content); + } + /** * Getter for raw template data * @@ -844,7 +905,7 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate */ public final 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); @@ -859,7 +920,7 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate */ public final 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); @@ -874,7 +935,7 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate */ public final 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); @@ -887,17 +948,22 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate */ 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 for ($idx = $this->varStack->getIterator(); $idx->valid(); $idx->next()) { + // Get current variable from the stack $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 + + // Set the new variable (don't remove the second dollar !) $$validVar = $dummy; // Prepare all configuration variables @@ -907,19 +973,67 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate unset($idx); unset($currVariable); - // Prepare the eval() command for comiling the template - $eval = sprintf("\$this->setCompiledData(\"%s\");", - addslashes($this->getRawTemplateData()) - ); + // Run the compilation twice to get content from helper classes in + $cnt = 0; + while ($cnt < 3) { + // Finalize the compilation of template variables + $this->finalizeVariableCompilation(); - // Debug message - if (((defined('DEBUG_EVAL')) || (defined('DEBUG_ALL'))) && (is_object($this->getDebugInstance()))) $this->getDebugInstance()->output(sprintf("[%s:] Konstruierte PHP-Anweisung:
%s

\n", - $this->__toString(), - htmlentities($eval) - )); + // Prepare the eval() command for comiling the template + $eval = sprintf("\$result = \"%s\";", + addslashes($this->getRawTemplateData()) + ); - // Run the constructed command. This will "compile" all variables in - eval($eval); + // This loop does remove the backslashes (\) in PHP parameters + // @TODO Make this some nicer... + 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 + $eval = str_replace( + "<%php", "\";", + str_replace( + "%>", "\$result .= \"", $eval + ) + ); + + // Debug message + if ((defined('DEBUG_EVAL')) && (is_object($this->getDebugInstance()))) $this->getDebugInstance()->output(sprintf("[%s:] Constructed PHP command:
%s

\n", + $this->__toString(), + htmlentities($eval) + )); + + // Run the constructed command. This will "compile" all variables in + eval($eval); + + // Set raw template data + $this->setRawTemplateData($result); + $cnt++; + } + + // Set the new content + $this->setCompiledData($result); } /** @@ -927,20 +1041,18 @@ 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. Thanks to Flobee(R) for given me a hint using the - // modifier "m" in regular expressions. I had implemented a regex here - // like this: (\n|\r) + // Get the raw data. $rawData = $this->getRawTemplateData(); // Remove double spaces and trim leading/trailing spaces @@ -950,7 +1062,7 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate $this->extractVariablesFromRawData($rawData); // Search for code-tags which are {? ?} - @preg_match_all($this->regExpCodeTags, $rawData, $templateMatches); + preg_match_all($this->regExpCodeTags, $rawData, $templateMatches); // Analyze the matches array if ((is_array($templateMatches)) && (count($templateMatches) == 4) && (count($templateMatches[0]) > 0)) { @@ -967,8 +1079,15 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate // Are some raw templates found and loaded? if (count($this->rawTemplates) > 0) { - die("NOT YET IMPLEMENTED"); - } + + // Insert all raw templates + $this->insertRawTemplates(); + + // Remove the raw template content as well + $this->setRawTemplateData(""); + + } // END - if + } // END - if($templateMatches ... } @@ -988,20 +1107,20 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate break; default: // Unknown type found + // Construct message + $msg = sprintf("[%s:] Unknown/unsupported template type %s detected.", + $this->__toString(), + $this->getTemplateType() + ); + if ((is_object($this->getDebugInstance())) && (method_exists($this->getDebugInstance(), 'output'))) { // Use debug output handler - $this->getDebugInstance()->output(sprintf("[%s:] Unbekannter Template-Typ %s erkannt.", - $this->__toString(), - $this->getTemplateType() - )); + $this->getDebugInstance()->output($msg); die(); } else { // Put directly out // DO NOT REWRITE THIS TO app_die() !!! - die(sprintf("[%s:] Unbekannter Template-Typ %s erkannt.", - $this->__toString(), - $this->getTemplateType() - )); + die($msg); } break; } @@ -1037,12 +1156,58 @@ class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate ); // Run the code - @eval($eval); + eval($eval); } // Return the requested instance return $this->helpers[$helperName]; } + + /** + * Assigns the last loaded raw template content with a given variable + * + * @param $templateName Name of the template we want to assign + * @param $variableName Name of the variable we want to assign + * @return void + */ + public function assignTemplateWithVariable ($templateName, $variableName) { + // Get the content from last loaded raw template + $content = $this->getRawTemplateData(); + + // Assign the variable + $this->assignVariable($variableName, $content); + + // Purge raw content + $this->setRawTemplateData(""); + } + + /** + * Transfers the content of this template engine to a given response instance + * + * @param $responseInstance An instance of a response class + * @return void + */ + public function transferToResponse (Responseable $responseInstance) { + // 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]