*
* @author Roland Haeder <webmaster@ship-simu.org>
* @version 0.0.0
- * @copyright Copyright (c) 2007 - 2009 Roland Haeder, this is free software
+ * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 Core Developer Team
* @license GNU GPL 3.0 or any newer version
* @link http://www.ship-simu.org
*
* templates are stored. We will internally determine the language plus
* "html" for web templates or "emails" for email templates
*/
- private $basePath = '';
+ private $templateBasePath = '';
/**
* Template type
*/
- private $templateType = "html";
+ private $templateType = 'html';
/**
* The extension for web and email templates (not compiled templates)
*/
- private $templateExtension = ".tpl";
+ private $templateExtension = '.tpl';
/**
* The extension for code templates (not compiled templates)
*/
- private $codeExtension = ".ctp";
+ private $codeExtension = '.ctp';
/**
- * Path relative to $basePath and language code for compiled code-templates
+ * Path relative to $templateBasePath and language code for compiled code-templates
*/
- private $compileOutputPath = "templates/_compiled";
+ private $compileOutputPath = 'templates/_compiled/';
+
+ /**
+ * The path name for all templates
+ */
+ private $genericBasePath = 'templates/';
/**
* The raw (maybe uncompiled) template
*/
private $varGroups = array();
+ /**
+ * Code begin
+ */
+ private $codeBegin = '<?php';
+
+ /**
+ * Code end
+ */
+ private $codeEnd = '?>';
+
// Exception codes for the template engine
const EXCEPTION_TEMPLATE_TYPE_IS_UNEXPECTED = 0x110;
const EXCEPTION_TEMPLATE_CONTAINS_INVALID_VAR = 0x111;
protected function __construct ($className) {
// Call parent constructor
parent::__construct($className);
-
- // Clean up a little
- $this->removeNumberFormaters();
- $this->removeSystemArray();
}
/**
}
/**
- * Setter for template type. Only "html", "emails" and "compiled" should
+ * 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) {
+ protected final function setTemplateType ($templateType) {
$this->templateType = (string) $templateType;
}
/**
* Setter for base path
*
- * @param $basePath The local base path for all templates
+ * @param $templateBasePath The relative base path for all templates
* @return void
*/
- public final function setBasePath ($basePath) {
+ public final function setTemplateBasePath ($templateBasePath) {
// And set it
- $this->basePath = (string) $basePath;
+ $this->templateBasePath = (string) $templateBasePath;
}
/**
* Getter for base path
*
- * @return $basePath The local base path for all templates
+ * @return $templateBasePath The relative base path for all templates
+ */
+ public final function getTemplateBasePath () {
+ // And set it
+ return $this->templateBasePath;
+ }
+
+ /**
+ * Getter for generic base path
+ *
+ * @return $templateBasePath The relative base path for all templates
*/
- public final function getBasePath () {
+ public final function getGenericBasePath () {
// And set it
- return $this->basePath;
+ return $this->genericBasePath;
}
/**
*/
protected final function setRawTemplateData ($rawTemplateData) {
// And store it in this class
- //* DEBUG: */ echo __METHOD__.":".$this->getUniqueId().": ".strlen($rawTemplateData)." Bytes set.<br />\n";
- //* DEBUG: */ echo $this->currGroup." variables: ".count($this->varStack[$this->currGroup]).", groups=".count($this->varStack)."<br />\n";
+ //* DEBUG: */ echo __METHOD__.':'.$this->getUniqueId().': '.strlen($rawTemplateData).' Bytes set.<br />\n';
+ //* DEBUG: */ echo $this->currGroup.' variables: '.count($this->varStack[$this->currGroup]).', groups='.count($this->varStack).'<br />\n';
$this->rawTemplateData = (string) $rawTemplateData;
}
* @return $rawTemplateData The raw data from the template
*/
public final function getRawTemplateData () {
- //* DEBUG: */ echo __METHOD__.":".$this->getUniqueId().": ".strlen($this->rawTemplateData)." Bytes read.<br />\n";
+ //* DEBUG: */ echo __METHOD__.':'.$this->getUniqueId().': '.strlen($this->rawTemplateData).' Bytes read.<br />\n';
return $this->rawTemplateData;
}
*/
private final function setCompiledData ($compiledData) {
// And store it in this class
- //* DEBUG: */ echo __METHOD__.":".$this->getUniqueId().": ".strlen($compiledData)." Bytes set.<br />\n";
+ //* DEBUG: */ echo __METHOD__.':'.$this->getUniqueId().': '.strlen($compiledData).' Bytes set.<br />\n';
$this->compiledData = (string) $compiledData;
}
* @return $compiledData Compiled template data
*/
public final function getCompiledData () {
- //* DEBUG: */ echo __METHOD__.":".$this->getUniqueId().": ".strlen($this->compiledData)." Bytes read.<br />\n";
+ //* DEBUG: */ echo __METHOD__.':'.$this->getUniqueId().': '.strlen($this->compiledData).' Bytes read.<br />\n';
return $this->compiledData;
}
* Private loader for all template types
*
* @param $template The template we shall load
+ * @param $extOther An other extension to use
* @return void
+ * @throws FileNotFoundException If the template was not found
*/
- private function loadTemplate ($template) {
- // Get extension for the template
- $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')) {
- // Switch over to the code-template extension
- $ext = $this->getCodeTemplateExtension();
- } // END - if
+ protected function loadTemplate ($template, $extOther = '') {
+ // Get extension for the template if empty
+ if (empty($extOther)) {
+ // None provided, so get the raw one
+ $ext = $this->getRawTemplateExtension();
+ } else {
+ // Then use it!
+ $ext = (string) $extOther;
+ }
// Construct the FQFN for the template by honoring the current language
- $fqfn = sprintf("%s%s/%s/%s%s",
- $this->getBasePath(),
+ $fqfn = sprintf("%s%s%s%s/%s/%s%s",
+ $this->getConfigInstance()->getConfigEntry('base_path'),
+ $this->getTemplateBasePath(),
+ $this->getGenericBasePath(),
$this->getLanguageInstance()->getLanguageCode(),
$this->getTemplateType(),
(string) $template,
$ext
);
- // Load the raw template data
- $this->loadRawTemplateData($fqfn);
+ // First try this
+ try {
+ // Load the raw template data
+ $this->loadRawTemplateData($fqfn);
+ } catch (FileNotFoundException $e) {
+ // If we shall load a code-template we need to switch the file extension
+ if (($this->getTemplateType() != $this->getConfigInstance()->getConfigEntry('web_template_type')) && (empty($extOther))) {
+ // Switch over to the code-template extension and try it again
+ $ext = $this->getCodeTemplateExtension();
+
+ // Try it again...
+ $this->loadTemplate($template, $ext);
+ } else {
+ // Throw it again
+ throw new FileNotFoundException($fqfn, FrameworkFileInputPointer::EXCEPTION_FILE_NOT_FOUND);
+ }
+ }
+
}
/**
* Structure of $templateMatches:
*---------------------------------
* [0] => Array - An array with all full matches
- * [1] => Array - An array with left part (before the ":") of a match
- * [2] => Array - An array with right part of a match including ":"
- * [3] => Array - An array with right part of a match excluding ":"
+ * [1] => Array - An array with left part (before the ':') of a match
+ * [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 (array $templateMatches) {
// Backup raw template data
foreach ($varMatches[1] as $key => $var) {
// Detect leading equals
- if (substr($varMatches[2][$key], 0, 1) == "=") {
+ if (substr($varMatches[2][$key], 0, 1) == '=') {
// Remove and cast it
$varMatches[2][$key] = (string) substr($varMatches[2][$key], 1);
- }
+ } // END - if
// Do we have some quotes left and right side? Then it is free text
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]);
} elseif (!empty($varMatches[2][$key])) {
- // Non-string found so we need some deeper analysis...
- die("Deeper analysis not yet implemented!");
+ // @TODO Non-string found so we need some deeper analysis...
+ ApplicationEntryPoint::app_die('Deeper analysis not yet implemented!');
}
} // for ($varMatches ...
/**
* Compiles all loaded raw templates
*
- * @param $templateMatches See method analyzeTemplate() for details
+ * @param $templateMatches See method analyzeTemplate() for details
* @return void
*/
private function compileRawTemplateData (array $templateMatches) {
private function finalizeVariableCompilation () {
// Get the content
$content = $this->getRawTemplateData();
- //* DEBUG: */ echo __METHOD__.": content before=".strlen($content)." (".md5($content).")<br />\n";
+ //* DEBUG: */ echo __METHOD__.': content before='.strlen($content).' ('.md5($content).')<br />\n';
// Walk through all variables
foreach ($this->varStack['general'] as $currEntry) {
- //* DEBUG: */ echo __METHOD__.": name=".$currEntry['name'].", value=<pre>".htmlentities($currEntry['value'])."</pre>\n";
+ //* DEBUG: */ echo __METHOD__.': name='.$currEntry['name'].', value=<pre>'.htmlentities($currEntry['value']).'</pre>\n';
// Replace all [$var] or {?$var?} with the content
- // Old behaviour, will become obsolete!
- $content = str_replace("\$content[".$currEntry['name']."]", $currEntry['value'], $content);
+ // @TODO Old behaviour, will become obsolete!
+ $content = str_replace("\$content[".$currEntry['name'].']', $currEntry['value'], $content);
- // Yet another old way
- $content = str_replace("[".$currEntry['name']."]", $currEntry['value'], $content);
+ // @TODO Yet another old way
+ $content = str_replace('['.$currEntry['name'].']', $currEntry['value'], $content);
// The new behaviour
- $content = str_replace("{?".$currEntry['name']."?}", $currEntry['value'], $content);
+ $content = str_replace('{?'.$currEntry['name'].'?}', $currEntry['value'], $content);
} // END - for
- //* DEBUG: */ echo __METHOD__.": content after=".strlen($content)." (".md5($content).")<br />\n";
+ //* DEBUG: */ echo __METHOD__.': content after='.strlen($content).' ('.md5($content).')<br />\n';
// Set the content back
$this->setRawTemplateData($content);
* Load a specified web template into the engine
*
* @param $template The web template we shall load which is located in
- * "html" by default
+ * 'html' by default
* @return void
*/
public function loadWebTemplate ($template) {
// Set template type
- $this->setTemplateType($this->getConfigInstance()->readConfig('web_template_type'));
+ $this->setTemplateType($this->getConfigInstance()->getConfigEntry('web_template_type'));
// Load the special template
$this->loadTemplate($template);
*/
public function assignConfigVariable ($var) {
// Sweet and simple...
- //* DEBUG: */ echo __METHOD__.":var={$var}<br />\n";
- $this->varStack['config'][$var] = $this->getConfigInstance()->readConfig($var);
+ //* DEBUG: */ echo __METHOD__.':var={$var}<br />\n';
+ $this->varStack['config'][$var] = $this->getConfigInstance()->getConfigEntry($var);
}
/**
* Load a specified email template into the engine
*
* @param $template The email template we shall load which is located in
- * "emails" by default
+ * 'emails' by default
* @return void
*/
public function loadEmailTemplate ($template) {
// Set template type
- $this->setTemplateType($this->getConfigInstance()->readConfig('email_template_type'));
+ $this->setTemplateType($this->getConfigInstance()->getConfigEntry('email_template_type'));
// Load the special template
$this->loadTemplate($template);
* Load a specified code template into the engine
*
* @param $template The code template we shall load which is
- * located in "code" by default
+ * located in 'code' by default
* @return void
*/
public function loadCodeTemplate ($template) {
// Set template type
- $this->setTemplateType($this->getConfigInstance()->readConfig('code_template_type'));
+ $this->setTemplateType($this->getConfigInstance()->getConfigEntry('code_template_type'));
// Load the special template
$this->loadTemplate($template);
*/
public final function compileVariables () {
// Initialize the $content array
- $validVar = $this->getConfigInstance()->readConfig('tpl_valid_var');
+ $validVar = $this->getConfigInstance()->getConfigEntry('tpl_valid_var');
$dummy = array();
// Iterate through all general variables
foreach ($this->varStack['general'] as $currVariable) {
// Transfer it's name/value combination to the $content array
- //* DEBUG: */ echo $currVariable['name']."=<pre>".htmlentities($currVariable['value'])."</pre>\n";
+ //* DEBUG: */ echo $currVariable['name'].'=<pre>'.htmlentities($currVariable['value']).'</pre>\n';
$dummy[$currVariable['name']] = $currVariable['value'];
}// END - if
unset($idx);
unset($currVariable);
- // Run the compilation twice to get content from helper classes in
+ // Run the compilation three times to get content from helper classes in
$cnt = 0;
while ($cnt < 3) {
// Finalize the compilation of template variables
);
// This loop does remove the backslashes (\) in PHP parameters
- while (strpos($eval, "<?php") !== false) {
+ while (strpos($eval, $this->codeBegin) !== false) {
// Get left part before "<?"
- $evalLeft = substr($eval, 0, strpos($eval, "<?php"));
+ $evalLeft = substr($eval, 0, strpos($eval, $this->codeBegin));
// Get all from right of "<?"
- $evalRight = substr($eval, (strpos($eval, "<?php") + 5));
+ $evalRight = substr($eval, (strpos($eval, $this->codeBegin) + 5));
// Cut middle part out and remove escapes
- $evalMiddle = trim(substr($evalRight, 0, strpos($evalRight, "?>")));
+ $evalMiddle = trim(substr($evalRight, 0, strpos($evalRight, $this->codeEnd)));
$evalMiddle = stripslashes($evalMiddle);
// Remove the middle part from right one
- $evalRight = substr($evalRight, (strpos($evalRight, "?>") + 2));
+ $evalRight = substr($evalRight, (strpos($evalRight, $this->codeEnd) + 2));
// And put all together
$eval = sprintf("%s<%%php %s %%>%s", $evalLeft, $evalMiddle, $evalRight);
$eval = str_replace(
"<%php", "\";",
str_replace(
- "%>", "\n\$result .= \"", $eval
+ "%>",
+ "\n\$result .= \"",
+ $eval
)
);
// Run the constructed command. This will "compile" all variables in
- @eval($eval);
+ eval($eval);
// Goes something wrong?
- if (!isset($result)) {
+ if ((!isset($result)) || (empty($result))) {
// Output eval command
$this->debugOutput(sprintf("Failed eval() code: <pre>%s</pre>", $this->markupCode($eval, true)), true);
*/
public 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()->getConfigEntry('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()->getConfigEntry('code_template_type')), self::EXCEPTION_TEMPLATE_TYPE_IS_UNEXPECTED);
} // END - if
// Get the raw data.
$rawData = $this->getRawTemplateData();
// Remove double spaces and trim leading/trailing spaces
- $rawData = trim(str_replace(" ", " ", $rawData));
+ $rawData = trim(str_replace(' ', ' ', $rawData));
// Search for raw variables
$this->extractVariablesFromRawData($rawData);
public function output () {
// Check which type of template we have
switch ($this->getTemplateType()) {
- case "html": // Raw HTML templates can be send to the output buffer
- // Quick-N-Dirty:
- $this->getWebOutputInstance()->output($this->getCompiledData());
- break;
-
- default: // Unknown type found
- // Construct message
- $msg = sprintf("[%s->%s] Unknown/unsupported template type <span class=\"data\">%s</span> detected.",
- $this->__toString(),
- __FUNCTION__,
- $this->getTemplateType()
- );
-
- // Write the problem to the world...
- $this->debugOutput($msg);
- break;
- }
+ case 'html': // Raw HTML templates can be send to the output buffer
+ // Quick-N-Dirty:
+ $this->getWebOutputInstance()->output($this->getCompiledData());
+ break;
+
+ default: // Unknown type found
+ // Construct message
+ $msg = sprintf("[%s->%s] Unknown/unsupported template type <span class=\"data\">%s</span> detected.",
+ $this->__toString(),
+ __FUNCTION__,
+ $this->getTemplateType()
+ );
+
+ // Write the problem to the world...
+ $this->debugOutput($msg);
+ break;
+ } // END - switch
}
/**
*
* @param $helperName The helper's name
* @return void
- * @throws ViewHelperNotFoundException If the given view helper was not found
*/
protected function loadViewHelper ($helperName) {
// Make first character upper case, rest low
// Create a class name
$className = "{$helperName}ViewHelper";
- // Does this class exists?
- if (!class_exists($className)) {
- // Abort here!
- throw new ViewHelperNotFoundException(array($this, $helperName), self::EXCEPTION_INVALID_VIEW_HELPER);
- } // END - if
-
// Generate new instance
- $eval = sprintf("\$this->helpers[%s] = %s::create%s();",
- $helperName,
- $className,
- $className
- );
-
- // Run the code
- eval($eval);
+ $this->helpers[$helperName] = ObjectFactory::createObjectByName($className);
} // END - if
// Return the requested instance
//* DEBUG: */ echo "<pre>".print_r($varMatches, true)."</pre>";
foreach ($varMatches[0] as $match) {
// Add variable tags around it
- $varCode = "{?".$match."?}";
+ $varCode = '{?' . $match . '?}';
// Is the variable found in code? (safes some calls)
if (strpos($rawCode, $varCode) !== false) {
$content = recode("html..utf8", $content);
} else {
// @TODO We need to find a fallback solution here
+ $this->partialStub('Cannot find recode extension!');
} // END - if
// Get an XML parser
// Now parse the XML tree
if (!xml_parse($xmlParser, $content)) {
// Error found in XML!
- //die("<pre>".htmlentities($content)."</pre>");
+ //* DEBUG: */ die('<pre>'.htmlentities($content).'</pre>');
throw new XmlParserException(array($this, $xmlParser), BaseHelper::EXCEPTION_XML_PARSER_ERROR);
} // END - if