From: Roland Häder Date: Sun, 28 Sep 2008 23:53:57 +0000 (+0000) Subject: Code base synced, updated X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=886d3459eb15f9bc6b15051b2fe2d3605c19a5d4;p=mailer.git Code base synced, updated --- diff --git a/.gitattributes b/.gitattributes index 875707fa28..963494c045 100644 --- a/.gitattributes +++ b/.gitattributes @@ -257,6 +257,7 @@ inc/classes/main/commands/web/class_WebHomeCommand.php -text inc/classes/main/commands/web/class_WebLoginAreaCommand.php -text inc/classes/main/commands/web/class_WebLoginCommand.php -text inc/classes/main/commands/web/class_WebLoginFailedCommand.php -text +inc/classes/main/commands/web/class_WebLogoutCommand.php -text inc/classes/main/commands/web/class_WebLogoutDoneCommand.php -text inc/classes/main/commands/web/class_WebRegisterCommand.php -text inc/classes/main/commands/web/class_WebResendLinkCommand.php -text @@ -286,6 +287,7 @@ inc/classes/main/controller/web/class_WebDefaultController.php -text inc/classes/main/controller/web/class_WebDefaultNewsController.php -text inc/classes/main/controller/web/class_WebLoginController.php -text inc/classes/main/controller/web/class_WebLoginFailedController.php -text +inc/classes/main/controller/web/class_WebLogoutController.php -text inc/classes/main/controller/web/class_WebLogoutDoneController.php -text inc/classes/main/controller/web/class_WebRegisterController.php -text inc/classes/main/controller/web/class_WebStatusController.php -text @@ -433,15 +435,17 @@ inc/classes/main/resolver/web/.htaccess -text inc/classes/main/resolver/web/class_WebCommandResolver.php -text inc/classes/main/resolver/web/class_WebControllerResolver.php -text inc/classes/main/response/.htaccess -text -inc/classes/main/response/class_HttpResponse.php -text -inc/classes/main/response/class_ImageResponse.php -text +inc/classes/main/response/class_BaseResponse.php -text +inc/classes/main/response/http/.htaccess -text +inc/classes/main/response/http/class_HttpResponse.php -text +inc/classes/main/response/image/.htaccess -text +inc/classes/main/response/image/class_ImageResponse.php -text inc/classes/main/result/.htaccess -text inc/classes/main/result/class_DatabaseResult.php -text inc/classes/main/rng/.htaccess -text inc/classes/main/rng/class_RandomNumberGenerator.php -text inc/classes/main/template/.htaccess -text inc/classes/main/template/class_BaseTemplateEngine.php -text -inc/classes/main/template/class_TemplateEngine.php -text inc/classes/main/template/image/.htaccess -text inc/classes/main/template/image/class_ImageTemplateEngine.php -text inc/classes/main/template/mail/.htaccess -text diff --git a/application/mxchange/init.php b/application/mxchange/init.php index 4dc2e1949a..eb2152432e 100644 --- a/application/mxchange/init.php +++ b/application/mxchange/init.php @@ -22,17 +22,20 @@ * along with this program. If not, see . */ +// Get a new configuration instance +$cfg = FrameworkConfiguration::createFrameworkConfiguration(); + // Initialize output system -require(PATH . "inc/output.php"); +require($cfg->readConfig('base_path') . "inc/output.php"); // Initialize file i/o system -require(PATH . "inc/file_io.php"); +require($cfg->readConfig('base_path') . "inc/file_io.php"); // Include the language sub-system -require(PATH . "inc/language.php"); +require($cfg->readConfig('base_path') . "inc/language.php"); // Get the database layer as well -require(PATH . "inc/database.php"); +require($cfg->readConfig('base_path') . "inc/database.php"); // Generate call-back function $callback = sprintf("%s::getInstance", diff --git a/inc/classes/interfaces/database/class_FrameworkDatabaseInterface.php b/inc/classes/interfaces/database/class_FrameworkDatabaseInterface.php index 846f140d04..6e3f3d6d4f 100644 --- a/inc/classes/interfaces/database/class_FrameworkDatabaseInterface.php +++ b/inc/classes/interfaces/database/class_FrameworkDatabaseInterface.php @@ -22,18 +22,6 @@ * along with this program. If not, see . */ interface FrameworkDatabaseInterface extends FrameworkInterface { - /** - * Analyses if a unique ID has already been used or not. This method does - * only pass the given ID through to the "real" database layer. - * - * @param $uniqueID A unique ID number which shall be checked - * before it will be used - * @param $inConstructor If called from a constructor or from - * somewhere else - * @return $isUnused true = The unique ID was not found in the database, - * false = It is already in use by an other object - */ - function isUniqueIdUsed ($uniqueID, $inConstructor = false); } // [EOF] diff --git a/inc/classes/main/class_BaseFrameworkSystem.php b/inc/classes/main/class_BaseFrameworkSystem.php index 9dd62b4f44..7e461ac820 100644 --- a/inc/classes/main/class_BaseFrameworkSystem.php +++ b/inc/classes/main/class_BaseFrameworkSystem.php @@ -281,7 +281,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { // Set the compressor channel $this->setCompressorChannel(CompressorChannel::createCompressorChannel(sprintf("%s%s", - PATH, + $this->getConfigInstance()->readConfig('base_path'), $this->getConfigInstance()->readConfig('compressor_base_path') ))); @@ -557,25 +557,6 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { $this->realClass = $realClass; } - /** - * Compare if both simulation part description and class name matches - * (shall be enough) - * - * @param $itemInstance An object instance to an other class - * @return boolean The result of comparing class name simulation part description - * @deprecated - */ - public function itemMatches ($itemInstance) { - $this->partialStub("Deprecated!"); - return ( - ( - $this->__toString() == $itemInstance->__toString() - ) && ( - $this->getObjectDescription() == $itemInstance->getObjectDescription() - ) - ); - } - /** * Compare class name of this and given class name * @@ -737,8 +718,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { } // END - if // Generate FQFN for all application templates - $fqfn = sprintf("%s%s/%s/%s", - PATH, + $fqfn = sprintf("%s%s/%s", $this->getConfigInstance()->readConfig('application_path'), strtolower($appInstance->getAppShortName()), $this->getConfigInstance()->readConfig('tpl_base_path') @@ -911,7 +891,7 @@ class BaseFrameworkSystem extends stdClass implements FrameworkInterface { } // END - if // Add line number to the code - foreach (explode("\n", $phpCode) as $lineNo=>$code) { + foreach (explode("\n", $phpCode) as $lineNo => $code) { // Add line numbers $markedCode .= sprintf("%s: %s\n", ($lineNo + 1), diff --git a/inc/classes/main/commands/web/class_WebLoginFailedCommand.php b/inc/classes/main/commands/web/class_WebLoginFailedCommand.php index 9981133487..7c74d7bd27 100644 --- a/inc/classes/main/commands/web/class_WebLoginFailedCommand.php +++ b/inc/classes/main/commands/web/class_WebLoginFailedCommand.php @@ -63,6 +63,9 @@ class WebLoginFailedCommand extends BaseCommand implements Commandable { // Prepare a template instance $templateInstance = $this->prepareTemplateInstance($appInstance); + // Assign application data with template engine + $templateInstance->assignApplicationData($appInstance); + // Load the master template $masterTemplate = $appInstance->getMasterTemplate(); diff --git a/inc/classes/main/commands/web/class_WebLogoutCommand.php b/inc/classes/main/commands/web/class_WebLogoutCommand.php new file mode 100644 index 0000000000..e220c51474 --- /dev/null +++ b/inc/classes/main/commands/web/class_WebLogoutCommand.php @@ -0,0 +1,86 @@ + + * @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 + * + * 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * 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 . + */ +class WebLogoutCommand extends BaseCommand implements Commandable { + /** + * Protected constructor + * + * @return void + */ + protected function __construct () { + // Call parent constructor + parent::__construct(__CLASS__); + } + + /** + * Creates an instance of this class + * + * @param $resolverInstance An instance of a command resolver class + * @return $commandInstance An instance a prepared command class + */ + public final static function createWebLogoutCommand (CommandResolver $resolverInstance) { + // Get new instance + $commandInstance = new WebLogoutCommand(); + + // Set the application instance + $commandInstance->setResolverInstance($resolverInstance); + + // Return the prepared instance + return $commandInstance; + } + + /** + * Executes the given command with given request and response objects + * + * @param $requestInstance An instance of a class with an Requestable interface + * @param $responseInstance An instance of a class with an Responseable interface + * @return void + */ + public function execute (Requestable $requestInstance, Responseable $responseInstance) { + // Get an auth instance for checking and updating the auth cookies + $authInstance = ObjectFactory::createObjectByConfiguredName('auth_method_class', array($responseInstance)); + + // Set request instance + $authInstance->setRequestInstance($requestInstance); + + // Destroy the auth data + $authInstance->destroyAuthData(); + + // Redirect to "logout done" page + $responseInstance->redirectToConfiguredUrl('logout_done_url'); + } + + /** + * Adds extra filters to the given controller instance + * + * @param $controllerInstance A controller instance + * @param $requestInstance An instance of a class with an Requestable interface + * @return void + */ + public function addExtraFilters (Controller $controllerInstance, Requestable $requestInstance) { + // Empty for now + } +} + +// [EOF] +?> diff --git a/inc/classes/main/commands/web/class_WebLogoutDoneCommand.php b/inc/classes/main/commands/web/class_WebLogoutDoneCommand.php index 15ecb70688..bbb7f2f702 100644 --- a/inc/classes/main/commands/web/class_WebLogoutDoneCommand.php +++ b/inc/classes/main/commands/web/class_WebLogoutDoneCommand.php @@ -63,6 +63,9 @@ class WebLogoutDoneCommand extends BaseCommand implements Commandable { // Prepare a template instance $templateInstance = $this->prepareTemplateInstance($appInstance); + // Assign application data + $templateInstance->assignApplicationData($appInstance); + // Load the master template $masterTemplate = $appInstance->getMasterTemplate(); diff --git a/inc/classes/main/controller/web/class_WebLogoutController.php b/inc/classes/main/controller/web/class_WebLogoutController.php new file mode 100644 index 0000000000..00b020a1df --- /dev/null +++ b/inc/classes/main/controller/web/class_WebLogoutController.php @@ -0,0 +1,82 @@ + + * @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 + * @todo This controller shall still provide some headlines for sidebars + * + * 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * 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 . + */ +class WebLogoutController extends BaseController implements Controller { + /** + * Protected constructor + * + * @return void + */ + protected function __construct () { + // Call parent constructor + parent::__construct(__CLASS__); + } + + /** + * Creates an instance of this class + * + * @param $resolverInstance An instance of a command resolver class + * @return $controllerInstance A prepared instance of this class + */ + public final static function createWebLogoutController (CommandResolver $resolverInstance) { + // Create the instance + $controllerInstance = new WebLogoutController(); + + // Set the command resolver + $controllerInstance->setResolverInstance($resolverInstance); + + // Add user auth filter (we don't need an update of the user here because it will be redirected) + $controllerInstance->addPreFilter(ObjectFactory::createObjectByConfiguredName('user_auth_class')); + + // User status filter + $controllerInstance->addPreFilter(ObjectFactory::createObjectByConfiguredName('user_status_class')); + + // Return the prepared instance + return $controllerInstance; + } + + /** + * Handles the given request and response + * + * @param $requestInstance An instance of a request class + * @param $responseInstance An instance of a response class + * @return void + */ + public function handleRequest (Requestable $requestInstance, Responseable $responseInstance) { + // Get the command instance + $commandInstance = $this->getResolverInstance()->resolveCommandByRequest($requestInstance); + + // This request was valid! :-D + $requestInstance->requestIsValid(); + + // Execute the command + $commandInstance->execute($requestInstance, $responseInstance); + + // Flush the response out + $responseInstance->flushBuffer(); + } +} + +// [EOF] +?> diff --git a/inc/classes/main/criteria/class_SearchCriteria.php b/inc/classes/main/criteria/class_SearchCriteria.php index b9f27db7b0..c95d853bfd 100644 --- a/inc/classes/main/criteria/class_SearchCriteria.php +++ b/inc/classes/main/criteria/class_SearchCriteria.php @@ -188,9 +188,9 @@ class SearchCriteria extends BaseFrameworkSystem implements LocalSearchCriteria $counted = 0; // Walk through all entries - foreach ($entryArray as $key=>$entry) { + foreach ($entryArray as $key => $entry) { // Then walk through all search criteria - foreach ($this->searchCriteria as $criteriaKey=>$criteriaValue) { + foreach ($this->searchCriteria as $criteriaKey => $criteriaValue) { // Is the element found and does it match? if (($key == $criteriaKey) && ($criteriaValue == $entry)) { // Then count this one up diff --git a/inc/classes/main/database/databases/class_LocalFileDatabase.php b/inc/classes/main/database/databases/class_LocalFileDatabase.php index 69ce662f9e..25cf9389f6 100644 --- a/inc/classes/main/database/databases/class_LocalFileDatabase.php +++ b/inc/classes/main/database/databases/class_LocalFileDatabase.php @@ -150,96 +150,6 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend return $this->lastException; } - /** - * Analyses if a unique ID has already been used or not by search in the - * local database folder. - * - * @param $uniqueID A unique ID number which shall be checked - * before it will be used - * @param $inConstructor If we got called in a de/con-structor or - * from somewhere else - * @return $isUnused true = The unique ID was not found in the database, - * false = It is already in use by an other object - * @throws NoArrayCreatedException If explode() fails to create an array - * @throws InvalidArrayCountException If the array contains less or - * more than two elements - * @deprecated - */ - public function isUniqueIdUsed ($uniqueID, $inConstructor = false) { - // Currently not used... ;-) - $isUsed = false; - - // Split the unique ID up in path and file name - $pathFile = explode("@", $uniqueID); - - // Are there two elements? Index 0 is the path, 1 the file name + global extension - if (!is_array($pathFile)) { - // No array found - if ($inConstructor) { - return false; - } else { - throw new NoArrayCreatedException(array($this, 'pathFile'), self::EXCEPTION_ARRAY_EXPECTED); - } - } elseif (count($pathFile) != 2) { - // Invalid ID returned! - if ($inConstructor) { - return false; - } else { - throw new InvalidArrayCountException(array($this, 'pathFile', count($pathFile), 2), self::EXCEPTION_ARRAY_HAS_INVALID_COUNT); - } - } - - // Create full path name - $pathName = $this->getSavePath() . $pathFile[0]; - - // Check if the file is there with a file handler - if ($inConstructor) { - // No exceptions in constructors and destructors! - $dirInstance = FrameworkDirectoryPointer::createFrameworkDirectoryPointer($pathName, true); - - // Has an object being created? - if (!is_object($dirInstance)) return false; - } else { - // Outside a constructor - try { - $dirInstance = FrameworkDirectoryPointer::createFrameworkDirectoryPointer($pathName); - } catch (PathIsNoDirectoryException $e) { - // Okay, path not found - return false; - } - } - - // Initialize the search loop - $isValid = false; - while ($dataFile = $dirInstance->readDirectoryExcept(array(".", "..", ".htaccess", ".svn", "info." . $this->getFileExtension()))) { - // Generate FQFN for testing - $fqfn = sprintf("%s/%s", $pathName, $dataFile); - $this->setLastFile($fqfn); - - // Get instance for file handler - $inputHandler = $this->getFileIoInstance(); - - // Try to read from it. This makes it sure that the file is - // readable and a valid database file - $this->setLastFileContents($inputHandler->loadFileContents($fqfn)); - - // Extract filename (= unique ID) from it - $ID = substr(basename($fqfn), 0, -(strlen($this->getFileExtension()) + 1)); - - // Is this the required unique ID? - if ($ID == $pathFile[1]) { - // Okay, already in use! - $isUsed = true; - } - } - - // Close the directory handler - $dirInstance->closeDirectory(); - - // Now the same for the file... - return $isUsed; - } - /** * Setter for the last read file * @@ -475,7 +385,7 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend // Is this an array? if (is_array($dataArray)) { // Search in the criteria with FMFW (First Matches, First Wins) - foreach ($dataArray as $key=>$value) { + foreach ($dataArray as $key => $value) { // Get criteria element $criteria = $criteriaInstance->getCriteriaElemnent($key); @@ -603,7 +513,7 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend // Is this an array? if (is_array($dataArray)) { // Search in the criteria with FMFW (First Matches, First Wins) - foreach ($dataArray as $key=>$value) { + foreach ($dataArray as $key => $value) { // Get criteria element $criteria = $searchInstance->getCriteriaElemnent($key); @@ -621,7 +531,7 @@ class LocalFileDatabase extends BaseDatabaseFrontend implements DatabaseFrontend } // END - if // Entry found, so update it - foreach ($criteriaArray as $criteriaKey=>$criteriaValue) { + foreach ($criteriaArray as $criteriaKey => $criteriaValue) { $dataArray[$criteriaKey] = $criteriaValue; } // END - foreach diff --git a/inc/classes/main/images/class_BaseImage.php b/inc/classes/main/images/class_BaseImage.php index 7c1e0891cd..7f667cde4a 100644 --- a/inc/classes/main/images/class_BaseImage.php +++ b/inc/classes/main/images/class_BaseImage.php @@ -469,10 +469,10 @@ class BaseImage extends BaseFrameworkSystem implements Registerable { $this->setBlue($blue); // Get a pointer for background color - $backColor = imagecolorallocate($this->imageResource, $red, $green, $blue); + $backColor = imagecolorallocate($this->getImageResource(), $red, $green, $blue); // Fill the image - imagefill($this->imageResource, 0, 0, $backColor); + imagefill($this->getImageResource(), 0, 0, $backColor); // Compile foreground colors $red = $templateInstance->compileRawCode($this->foregroundColor['red']); @@ -486,7 +486,7 @@ class BaseImage extends BaseFrameworkSystem implements Registerable { $this->setBlue($blue); // Get a pointer for foreground color - $foreColor = imagecolorallocate($this->imageResource, $red, $green, $blue); + $foreColor = imagecolorallocate($this->getImageResource(), $red, $green, $blue); switch ($this->groupable) { case "single": // Single image string @@ -502,7 +502,7 @@ class BaseImage extends BaseFrameworkSystem implements Registerable { $size = $templateInstance->compileRawCode($this->getFontSize()); // Set the image string - imagestring($this->imageResource, $size, $x, $y, $imageString, $foreColor); + imagestring($this->getImageResource(), $size, $x, $y, $imageString, $foreColor); break; case "groupable": // More than one string allowed @@ -521,7 +521,7 @@ class BaseImage extends BaseFrameworkSystem implements Registerable { // Set the image string //* DEBUG: */ echo __METHOD__.": size={$size}, x={$x}, y={$y}, string={$imageString}
\n"; - imagestring($this->imageResource, $size, $x, $y, $imageString, $foreColor); + imagestring($this->getImageResource(), $size, $x, $y, $imageString, $foreColor); } // END - foreach break; } diff --git a/inc/classes/main/images/extended/class_PngImage.php b/inc/classes/main/images/extended/class_PngImage.php index f8ee28b8f5..8b0332099f 100644 --- a/inc/classes/main/images/extended/class_PngImage.php +++ b/inc/classes/main/images/extended/class_PngImage.php @@ -64,6 +64,12 @@ class PngImage extends BaseImage { // Get a file name for our image $cacheFile = $this->getTemplateInstance()->getImageCacheFqfn(); + // Does it exist? + if (file_exists($cacheFile)) { + // Remove it + @unlink($cacheFile); + } // END - if + // Finish the image and send it to a cache file imagepng($this->getImageResource(), $cacheFile, 9, PNG_ALL_FILTERS); } diff --git a/inc/classes/main/mailer/debug/class_DebugMailer.php b/inc/classes/main/mailer/debug/class_DebugMailer.php index ffc3fc6ea8..042ee69194 100644 --- a/inc/classes/main/mailer/debug/class_DebugMailer.php +++ b/inc/classes/main/mailer/debug/class_DebugMailer.php @@ -85,13 +85,13 @@ class DebugMailer extends BaseMailer implements DeliverableMail { $templateInstance->assignVariable('subject', $this->getSubjectLine()); // Walk through all variables, first config to assign them - foreach ($recipientList['config_vars'] as $variable=>$dummy) { + foreach ($recipientList['config_vars'] as $variable => $dummy) { // Load the config value and set it $templateInstance->assignConfigVariable($variable); } // END - if // Now do the same with the values but ask the "value instance" instead! - foreach ($recipientList['value_vars'] as $variable=>$dummy) { + foreach ($recipientList['value_vars'] as $variable => $dummy) { // Is the value instance there? if (!isset($recipientList['values'][$variable])) { // Throw exception diff --git a/inc/classes/main/output/class_ConsoleOutput.php b/inc/classes/main/output/class_ConsoleOutput.php index b1cae5c408..bcc1fc5eb8 100644 --- a/inc/classes/main/output/class_ConsoleOutput.php +++ b/inc/classes/main/output/class_ConsoleOutput.php @@ -90,7 +90,7 @@ class ConsoleOutput extends BaseFrameworkSystem implements OutputStreamer { public final function output ($outStream=false) { if ($outStream === false) { // Output something here... - foreach ($this->vars as $var=>$value) { + foreach ($this->vars as $var => $value) { $this->output("var=".$var.", value=".$value.""); } } else { diff --git a/inc/classes/main/request/class_HttpRequest.php b/inc/classes/main/request/class_HttpRequest.php index a046f185c6..0241cfc19f 100644 --- a/inc/classes/main/request/class_HttpRequest.php +++ b/inc/classes/main/request/class_HttpRequest.php @@ -72,8 +72,8 @@ class HttpRequest extends BaseFrameworkSystem implements Requestable { * @return void */ public function prepareRequestData () { - // Copy the $_REQUEST array - $this->requestData = $_REQUEST; + // Copy GET then POST data + $this->requestData = array_merge($_GET, $_POST); } /** @@ -124,6 +124,7 @@ class HttpRequest extends BaseFrameworkSystem implements Requestable { * @return void */ public function setRequestElement ($element, $value) { + error_log(__METHOD__.":{$element}={$value}"); $this->requestData[$element] = $value; } diff --git a/inc/classes/main/resolver/action/class_BaseActionResolver.php b/inc/classes/main/resolver/action/class_BaseActionResolver.php index 0f41a35df2..0c7f268faf 100644 --- a/inc/classes/main/resolver/action/class_BaseActionResolver.php +++ b/inc/classes/main/resolver/action/class_BaseActionResolver.php @@ -101,9 +101,6 @@ class BaseActionResolver extends BaseResolver { $isValid = true; } // END - if - // Debug output - //* DEBUG: */ $this->debugBackTrace(); - // Set action name $this->setActionName($actionName); diff --git a/inc/classes/main/resolver/command/class_BaseCommandResolver.php b/inc/classes/main/resolver/command/class_BaseCommandResolver.php index f26d351fa6..d1fa003a38 100644 --- a/inc/classes/main/resolver/command/class_BaseCommandResolver.php +++ b/inc/classes/main/resolver/command/class_BaseCommandResolver.php @@ -125,9 +125,6 @@ class BaseCommandResolver extends BaseResolver { $isValid = true; } // END - if - // Debug output - //* DEBUG: */ $this->debugBackTrace(); - // Set command name $this->setCommandName($commandName); diff --git a/inc/classes/main/resolver/controller/class_BaseControllerResolver.php b/inc/classes/main/resolver/controller/class_BaseControllerResolver.php index 2548b4f702..ec61d4e1cb 100644 --- a/inc/classes/main/resolver/controller/class_BaseControllerResolver.php +++ b/inc/classes/main/resolver/controller/class_BaseControllerResolver.php @@ -117,9 +117,6 @@ class BaseControllerResolver extends BaseResolver { } } // END - while - // Debug output - //* DEBUG: */ $this->debugBackTrace(); - // Return the result return $isValid; } diff --git a/inc/classes/main/resolver/controller/image/class_ImageControllerResolver.php b/inc/classes/main/resolver/controller/image/class_ImageControllerResolver.php index 157a98c60f..b2f4fcd815 100644 --- a/inc/classes/main/resolver/controller/image/class_ImageControllerResolver.php +++ b/inc/classes/main/resolver/controller/image/class_ImageControllerResolver.php @@ -120,9 +120,6 @@ class ImageControllerResolver extends BaseControllerResolver implements Controll * controller class is missing (bad!) */ private function loadController ($controllerName) { - // Debug message - //* DEBUG: */ $this->debugBackTrace(); - // Cache default command $defaultController = $this->getConfigInstance()->readConfig('default_image_command'); diff --git a/inc/classes/main/resolver/controller/web/class_WebControllerResolver.php b/inc/classes/main/resolver/controller/web/class_WebControllerResolver.php index 2446e6dc77..da09dca315 100644 --- a/inc/classes/main/resolver/controller/web/class_WebControllerResolver.php +++ b/inc/classes/main/resolver/controller/web/class_WebControllerResolver.php @@ -120,9 +120,6 @@ class WebControllerResolver extends BaseControllerResolver implements Controller * controller class is missing (bad!) */ private function loadController ($controllerName) { - // Debug message - //* DEBUG: */ $this->debugBackTrace(); - // Cache default command $defaultController = $this->getConfigInstance()->readConfig('default_web_command'); diff --git a/inc/classes/main/response/class_BaseResponse.php b/inc/classes/main/response/class_BaseResponse.php new file mode 100644 index 0000000000..2ecfaa2bae --- /dev/null +++ b/inc/classes/main/response/class_BaseResponse.php @@ -0,0 +1,200 @@ + + * @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 + * + * 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * 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 . + * + * The extended headers are taken from phpMyAdmin setup tool, written by + * Michal Cihar , licensed under GNU GPL 2.0. + */ +class BaseResponse extends BaseFrameworkSystem { + /** + * Response status + */ + private $responseStatus = "200 OK"; + + /** + * Array with all headers + */ + private $responseHeaders = array(); + + /** + * Cookies we shall sent out + */ + private $cookies = array(); + + /** + * Body of the response + */ + private $responseBody = ""; + + /** + * Instance of the template engine + */ + private $templateInstance = null; + + /** + * Fatal resolved messages from filters and so on + */ + private $fatalMessages = array(); + + /** + * Protected constructor + * + * @param $className Name of the concrete response + * @return void + */ + protected function __construct ($className) { + // Call parent constructor + parent::__construct($className); + + // Clean up a little + $this->removeNumberFormaters(); + $this->removeSystemArray(); + } + + /** + * Setter for status + * + * @param $status New response status + * @return void + */ + public final function setResponseStatus ($status) { + $this->responseStatus = (string) $status; + } + + /** + * Add header element + * + * @param $name Name of header element + * @param $value Value of header element + * @return void + */ + public final function addHeader ($name, $value) { + $this->responseHeaders[$name] = $value; + } + + /** + * Reset the header array + * + * @return void + */ + public final function resetResponseHeaders () { + $this->responseHeaders = array(); + } + + /** + * "Writes" data to the response body + * + * @param $output Output we shall sent in the HTTP response + * @return void + */ + public final function writeToBody ($output) { + $this->responseBody .= $output; + } + + /** + * Sets the response body to something new + * + * @param $output Output we shall sent in the HTTP response + * @return void + */ + public final function setResponseBody ($output) { + $this->responseBody = $output; + } + + /** + * Adds a fatal message id to the response. The added messages can then be + * processed and outputed to the world + * + * @param $messageId The message id we shall add + * @return void + */ + public final function addFatalMessage ($messageId) { + // Adds the resolved message id to the fatal message list + $this->fatalMessages[] = $this->getApplicationInstance()->getLanguageInstance()->getMessage($messageId); + } + + /** + * Flushs the cached HTTP response to the outer world + * + * @param $force Wether we shall force the output or abort if headers are + * already sent with an exception + * @return void + * @throws ResponseHeadersAlreadySentException Thrown if headers are + * already sent + */ + public function flushBuffer ($force = false) { + if ((headers_sent()) && (!$force)) { + // Headers are already sent! + throw new ResponseHeadersAlreadySentException($this, self::EXCEPTION_HEADERS_ALREADY_SENT); + } elseif (!headers_sent()) { + // Send headers out + header("HTTP/1.1 {$this->responseStatus}"); + + // Used later + $now = gmdate('D, d M Y H:i:s') . ' GMT'; + + // General header for no caching + $this->addHeader('Expired', $now); // RFC2616 - Section 14.21 + $this->addHeader('Last-Modified', $now); + $this->addHeader('Cache-Control', 'no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0'); // HTTP/1.1 + $this->addHeader('Pragma', 'no-cache'); // HTTP/1.0 + + // Define the charset to be used + //$this->addHeader('Content-type:', sprintf("text/html; charset=%s", $this->getConfigInstance()->readConfig('header_charset'))); + + // Send all headers + foreach ($this->responseHeaders as $name => $value) { + header("{$name}: {$value}"); + //* DEBUG: */ echo "{$name}: {$value}
\n"; + } // END - foreach + + // Send cookies out? + if (count($this->cookies) > 0) { + // Send all cookies + $cookieString = implode(" ", $this->cookies); + header("Set-Cookie: {$cookieString}"); + + // Remove them all + $this->cookies = array(); + } // END - if + } + + // Are there some error messages? + if (count($this->fatalMessages) == 0) { + // Flush the output to the world + $this->getWebOutputInstance()->output($this->responseBody); + } else { + // Display all error messages + $this->getApplicationInstance()->handleFatalMessages($this->fatalMessages); + + // Send the error messages out to the world + $this->getWebOutputInstance()->output($this->responseBody); + } + + // Clear response header and body + $this->setResponseBody(""); + $this->resetResponseHeaders(); + } +} + +// [EOF] +?> diff --git a/inc/classes/main/response/class_HttpResponse.php b/inc/classes/main/response/class_HttpResponse.php deleted file mode 100644 index 869d358a49..0000000000 --- a/inc/classes/main/response/class_HttpResponse.php +++ /dev/null @@ -1,362 +0,0 @@ - - * @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 - * - * 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 - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * 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 . - * - * The extended headers are taken from phpMyAdmin setup tool, written by - * Michal Cihar , licensed under GNU GPL 2.0. - */ -class HttpResponse extends BaseFrameworkSystem implements Responseable { - /** - * Response status - */ - private $responseStatus = "200 OK"; - - /** - * Array with all headers - */ - private $responseHeaders = array(); - - /** - * Cookies we shall sent out - */ - private $cookies = array(); - - /** - * Body of the response - */ - private $responseBody = ""; - - /** - * Instance of the template engine - */ - private $templateInstance = null; - - /** - * Fatal resolved messages from filters and so on - */ - private $fatalMessages = array(); - - /** - * Protected constructor - * - * @return void - */ - protected function __construct () { - // Call parent constructor - parent::__construct(__CLASS__); - - // Clean up a little - $this->removeNumberFormaters(); - $this->removeSystemArray(); - } - - /** - * Creates an object of this class - * - * @param $appInstance An instance of a manageable application - * @return $responseInstance A prepared instance of this class - */ - public final static function createHttpResponse (ManageableApplication $appInstance) { - // Get a new instance - $responseInstance = new HttpResponse(); - - // Set the application instance - $responseInstance->setApplicationInstance($appInstance); - - // Initialize the template engine here - $responseInstance->initTemplateEngine($appInstance); - - // Return the prepared instance - return $responseInstance; - } - - /** - * Setter for status - * - * @param $status New response status - * @return void - */ - public final function setResponseStatus ($status) { - $this->responseStatus = (string) $status; - } - - /** - * Add header element - * - * @param $name Name of header element - * @param $value Value of header element - * @return void - */ - public final function addHeader ($name, $value) { - $this->responseHeaders[$name] = $value; - } - - /** - * Reset the header array - * - * @return void - */ - public final function resetResponseHeaders () { - $this->responseHeaders = array(); - } - - /** - * "Writes" data to the response body - * - * @param $output Output we shall sent in the HTTP response - * @return void - */ - public function writeToBody ($output) { - $this->responseBody .= $output; - } - - /** - * Sets the response body to something new - * - * @param $output Output we shall sent in the HTTP response - * @return void - */ - public function setResponseBody ($output) { - $this->responseBody = $output; - } - - /** - * Flushs the cached HTTP response to the outer world - * - * @param $force Wether we shall force the output or abort if headers are - * already sent with an exception - * @return void - * @throws ResponseHeadersAlreadySentException Thrown if headers are - * already sent - */ - public function flushBuffer ($force=false) { - if ((headers_sent()) && (!$force)) { - // Headers are already sent! - throw new ResponseHeadersAlreadySentException($this, self::EXCEPTION_HEADERS_ALREADY_SENT); - } elseif (!headers_sent()) { - // Send headers out - header("HTTP/1.1 {$this->responseStatus}"); - - // Used later - $now = gmdate('D, d M Y H:i:s') . ' GMT'; - - // General header for no caching - $this->addHeader('Expired', $now); // rfc2616 - Section 14.21 - $this->addHeader('Last-Modified', $now); - $this->addHeader('Cache-Control', 'no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0'); // HTTP/1.1 - $this->addHeader('Pragma', 'no-cache'); // HTTP/1.0 - - // Define the charset to be used - //$this->addHeader('Content-Type:', sprintf("text/html; charset=%s", $this->getConfigInstance()->readConfig('header_charset'))); - - foreach ($this->responseHeaders as $name=>$value) { - header("{$name}: {$value}"); - } // END - foreach - - // Send cookies out? - if (count($this->cookies) > 0) { - // Send all cookies - $cookieString = implode(" ", $this->cookies); - header("Set-Cookie: {$cookieString}"); - - // Remove them all - $this->cookies = array(); - } // END - if - } - - // Are there some error messages? - if (count($this->fatalMessages) == 0) { - // Flush the output to the world - $this->getWebOutputInstance()->output($this->responseBody); - } else { - // Display all error messages - $this->getApplicationInstance()->handleFatalMessages($this->fatalMessages); - - // Send the error messages out to the world - $this->getWebOutputInstance()->output($this->responseBody); - } - - // Clear response header and body - $this->setResponseBody(""); - $this->resetResponseHeaders(); - } - - /** - * Initializes the template engine instance - * - * @param $appInstance An instance of a manageable application - * @return void - */ - public final function initTemplateEngine (ManageableApplication $appInstance) { - $this->setTemplateInstance($this->prepareTemplateInstance($appInstance)); - } - - /** - * Adds a fatal message id to the response. The added messages can then be - * processed and outputed to the world - * - * @param $messageId The message id we shall add - * @return void - */ - public final function addFatalMessage ($messageId) { - // Adds the resolved message id to the fatal message list - $this->fatalMessages[] = $this->getApplicationInstance()->getLanguageInstance()->getMessage($messageId); - } - - /** - * Adds a cookie to the response - * - * @param $cookieName Cookie's name - * @param $cookieValue Value to store in the cookie - * @param $encrypted Do some extra encryption on the value - * @param $expires Timestamp of expiration (default: configured) - * @return void - * @throws ResponseHeadersAlreadySentException If headers are already sent - * @todo Encryption of cookie data not yet supported. - * @todo Why are these parameters conflicting? - * @todo If the return statement is removed and setcookie() commented out, - * @todo this will send only one cookie out, the first one. - */ - public function addCookie ($cookieName, $cookieValue, $encrypted = false, $expires = null) { - //* DEBUG: */ echo $cookieName."=".$cookieValue."
\n"; - // Are headers already sent? - if (headers_sent()) { - // Throw an exception here - //* DEBUG: */ return; - throw new ResponseHeadersAlreadySentException($this, self::EXCEPTION_HEADERS_ALREADY_SENT); - } // END - if - - // Shall we encrypt the cookie? - if ($encrypted === true) { - } // END - if - - // For slow browsers set the cookie array element first - $_COOKIE[$cookieName] = $cookieValue; - - // Get all config entries - if (is_null($expires)) { - $expires = (time() + $this->getConfigInstance()->readConfig('cookie_expire')); - } // END - if - - $path = $this->getConfigInstance()->readConfig('cookie_path'); - $domain = $this->getConfigInstance()->readConfig('cookie_domain'); - - setcookie($cookieName, $cookieValue, $expires); - //, $path, $domain, (isset($_SERVER['HTTPS'])) - return; - - // Now construct the full header - $cookieString = $cookieName . "=" . $cookieValue . "; "; - $cookieString .= "expires=" . date("D, d-F-Y H:i:s", $expires) . " GMT"; - // $cookieString .= "; path=".$path."; domain=".$domain; - - // Set the cookie as a header - $this->cookies[$cookieName] = $cookieString; - } - - /** - * Redirect to a configured URL. The URL can be absolute or relative. In - * case of relative URL it will be extended automatically. - * - * @param $configEntry The configuration entry which holds our URL - * @return void - * @throws ResponseHeadersAlreadySentException If headers are already sent - */ - public function redirectToConfiguredUrl ($configEntry) { - // Is the header not yet sent? - if (headers_sent()) { - // Throw an exception here - throw new ResponseHeadersAlreadySentException($this, self::EXCEPTION_HEADERS_ALREADY_SENT); - } // END - if - - // Get the url from config - $url = $this->getConfigInstance()->readConfig($configEntry); - - // Do we have a "http" in front of the URL? - if (substr(strtolower($url), 0, 4) != "http") { - // Is there a / in front of the relative URL? - if (substr($url, 0, 1) == "/") $url = substr($url, 1); - - // No, then extend it with our base URL - $url = $this->getConfigInstance()->readConfig('base_url') . "/" . $url; - } // END - if - - // Add redirect header - $this->addHeader("Location", $url); - - // Set correct response status - $this->setResponseStatus("301 Moved Permanently"); - - // Clear the body - $this->setResponseBody(""); - - // Flush the result - $this->flushBuffer(); - - // All done here... - exit(); - } - - /** - * Expires the given cookie if it is set - * - * @param $cookieName Cookie to expire - * @return void - */ - public function expireCookie ($cookieName) { - // Is the cookie there? - if (isset($_COOKIE[$cookieName])) { - // Then expire it with 20 minutes past - $this->addCookie($cookieName, "", false, (time() - 1200)); - - // Remove it from array - unset($_COOKIE[$cookieName]); - } // END - if - } - - /** - * Refreshs a given cookie. This will make the cookie live longer - * - * @param $cookieName Cookie to refresh - * @return void - */ - public function refreshCookie ($cookieName) { - // Only update existing cookies - if (isset($_COOKIE[$cookieName])) { - // Update the cookie - $this->addCookie($cookieName, $_COOKIE[$cookieName], false); - } // END - if - } - - /** - * Getter for default command - * - * @return $defaultCommand Default command for this response - */ - public function getDefaultCommand () { - $defaultCommand = $this->getConfigInstance()->readConfig('default_web_command'); - return $defaultCommand; - } -} - -// [EOF] -?> diff --git a/inc/classes/main/response/class_ImageResponse.php b/inc/classes/main/response/class_ImageResponse.php deleted file mode 100644 index 71acb351dd..0000000000 --- a/inc/classes/main/response/class_ImageResponse.php +++ /dev/null @@ -1,381 +0,0 @@ - - * @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 - * - * 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 - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * 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 . - * - * The extended headers are taken from phpMyAdmin setup tool, written by - * Michal Cihar , licensed under GNU GPL 2.0. - */ -class ImageResponse extends BaseFrameworkSystem implements Responseable { - /** - * Response status - */ - private $responseStatus = "200 OK"; - - /** - * Array with all headers - */ - private $responseHeaders = array(); - - /** - * Cookies we shall sent out - */ - private $cookies = array(); - - /** - * Body of the response - */ - private $responseBody = ""; - - /** - * Fatal resolved messages from filters and so on - */ - private $fatalMessages = array(); - - /** - * Instance of the image - */ - private $imageInstance = null; - - /** - * Protected constructor - * - * @return void - */ - protected function __construct () { - // Call parent constructor - parent::__construct(__CLASS__); - - // Clean up a little - $this->removeNumberFormaters(); - $this->removeSystemArray(); - } - - /** - * Creates an object of this class - * - * @param $appInstance An instance of a manageable application - * @return $responseInstance A prepared instance of this class - */ - public final static function createImageResponse (ManageableApplication $appInstance) { - // Get a new instance - $responseInstance = new ImageResponse(); - - // Set the application instance - $responseInstance->setApplicationInstance($appInstance); - - // Initialize the template engine here - $responseInstance->initTemplateEngine($appInstance); - - // Return the prepared instance - return $responseInstance; - } - - /** - * Setter for status - * - * @param $status New response status - * @return void - */ - public final function setResponseStatus ($status) { - $this->responseStatus = (string) $status; - } - - /** - * Add header element - * - * @param $name Name of header element - * @param $value Value of header element - * @return void - */ - public final function addHeader ($name, $value) { - $this->responseHeaders[$name] = $value; - } - - /** - * Reset the header array - * - * @return void - */ - public final function resetResponseHeaders () { - $this->responseHeaders = array(); - } - - /** - * "Writes" data to the response body - * - * @param $output Output we shall sent in the HTTP response - * @return void - */ - public function writeToBody ($output) { - $this->responseBody .= $output; - } - - /** - * Sets the response body to something new - * - * @param $output Output we shall sent in the HTTP response - * @return void - */ - public function setResponseBody ($output) { - $this->responseBody = $output; - } - - /** - * Flushs the cached HTTP response to the outer world - * - * @param $force Wether we shall force the output or abort if headers are - * already sent with an exception - * @return void - * @todo Add support for fatal messages in image response - * @throws ResponseHeadersAlreadySentException Thrown if headers are - * already sent - */ - public function flushBuffer ($force=false) { - if ((headers_sent()) && (!$force)) { - // Headers are already sent! - throw new ResponseHeadersAlreadySentException($this, self::EXCEPTION_HEADERS_ALREADY_SENT); - } elseif (!headers_sent()) { - // Send headers out - header("HTTP/1.1 {$this->responseStatus}"); - - // Used later - $now = gmdate('D, d M Y H:i:s') . ' GMT'; - - // General header for no caching - $this->addHeader('Expired', $now); // rfc2616 - Section 14.21 - $this->addHeader('Last-Modified', $now); - $this->addHeader('Cache-Control', 'no-store, no-cache, must-revalidate, pre-check=0, post-check=0, max-age=0'); // HTTP/1.1 - $this->addHeader('Pragma', 'no-cache'); // HTTP/1.0 - $this->addHeader('Content-type', 'image/'.$this->imageInstance->getImageType()); - - // Define the charset to be used - //$this->addHeader('Content-Type:', sprintf("text/html; charset=%s", $this->getConfigInstance()->readConfig('header_charset'))); - - foreach ($this->responseHeaders as $name=>$value) { - header("{$name}: {$value}"); - } // END - foreach - - // Send cookies out? - if (count($this->cookies) > 0) { - // Send all cookies - $cookieString = implode(" ", $this->cookies); - header("Set-Cookie: {$cookieString}"); - - // Remove them all - $this->cookies = array(); - } // END - if - } - - // Are there some error messages? - if (count($this->fatalMessages) == 0) { - // Get image content from cache - $imageContent = $this->imageInstance->getContent(); - die($imageContent); - } else { - // Display all error messages - $this->partialStub("Fatal messages are currently unsupported in image response."); - } - - // Clear response header and body - $this->setResponseBody(""); - $this->resetResponseHeaders(); - } - - /** - * Initializes the template engine instance - * - * @param $appInstance An instance of a manageable application - * @return void - */ - public final function initTemplateEngine (ManageableApplication $appInstance) { - // Get config instance - $cfg = $this->getConfigInstance(); - - // Set new template engine - $cfg->setConfigEntry('template_class' , $cfg->readConfig('image_template_class')); - $cfg->setConfigEntry('raw_template_extension' , ".img"); - $cfg->setConfigEntry('code_template_extension', ".itp"); - $cfg->setConfigEntry('tpl_base_path' , "templates/images/"); - $cfg->setConfigEntry('code_template_type' , "image"); - - // Get a prepared instance - $this->setTemplateInstance($this->prepareTemplateInstance($appInstance)); - } - - /** - * Adds a fatal message id to the response. The added messages can then be - * processed and outputed to the world - * - * @param $messageId The message id we shall add - * @return void - */ - public final function addFatalMessage ($messageId) { - // Adds the resolved message id to the fatal message list - $this->fatalMessages[] = $this->getApplicationInstance()->getLanguageInstance()->getMessage($messageId); - } - - /** - * Adds a cookie to the response - * - * @param $cookieName Cookie's name - * @param $cookieValue Value to store in the cookie - * @param $encrypted Do some extra encryption on the value - * @param $expires Timestamp of expiration (default: configured) - * @return void - * @throws ResponseHeadersAlreadySentException If headers are already sent - * @todo Encryption of cookie data not yet supported. - * @todo Why are these parameters conflicting? - * @todo If the return statement is removed and setcookie() commented out, - * @todo this will send only one cookie out, the first one. - */ - public function addCookie ($cookieName, $cookieValue, $encrypted = false, $expires = null) { - // Are headers already sent? - if (headers_sent()) { - // Throw an exception here - throw new ResponseHeadersAlreadySentException($this, self::EXCEPTION_HEADERS_ALREADY_SENT); - } // END - if - - // Shall we encrypt the cookie? - if ($encrypted === true) { - } // END - if - - // For slow browsers set the cookie array element first - $_COOKIE[$cookieName] = $cookieValue; - - // Get all config entries - if (is_null($expires)) { - $expires = (time() + $this->getConfigInstance()->readConfig('cookie_expire')); - } // END - if - - $path = $this->getConfigInstance()->readConfig('cookie_path'); - $domain = $this->getConfigInstance()->readConfig('cookie_domain'); - - setcookie($cookieName, $cookieValue, $expires); - //, $path, $domain, (isset($_SERVER['HTTPS'])) - return; - - // Now construct the full header - $cookieString = $cookieName . "=" . $cookieValue . "; "; - $cookieString .= "expires=" . date("D, d-F-Y H:i:s", $expires) . " GMT"; - // $cookieString .= "; path=".$path."; domain=".$domain; - - // Set the cookie as a header - $this->cookies[$cookieName] = $cookieString; - } - - /** - * Redirect to a configured URL. The URL can be absolute or relative. In - * case of relative URL it will be extended automatically. - * - * @param $configEntry The configuration entry which holds our URL - * @return void - * @throws ResponseHeadersAlreadySentException If headers are already sent - */ - public function redirectToConfiguredUrl ($configEntry) { - // Is the header not yet sent? - if (headers_sent()) { - // Throw an exception here - throw new ResponseHeadersAlreadySentException($this, self::EXCEPTION_HEADERS_ALREADY_SENT); - } // END - if - - // Get the url from config - $url = $this->getConfigInstance()->readConfig($configEntry); - - // Do we have a "http" in front of the URL? - if (substr(strtolower($url), 0, 4) != "http") { - // Is there a / in front of the relative URL? - if (substr($url, 0, 1) == "/") $url = substr($url, 1); - - // No, then extend it with our base URL - $url = $this->getConfigInstance()->readConfig('base_url') . "/" . $url; - } // END - if - - // Add redirect header - $this->addHeader("Location", $url); - - // Set correct response status - $this->setResponseStatus("301 Moved Permanently"); - - // Clear the body - $this->setResponseBody(""); - - // Flush the result - $this->flushBuffer(); - - // All done here... - exit(); - } - - /** - * Expires the given cookie if it is set - * - * @param $cookieName Cookie to expire - * @return void - */ - public function expireCookie ($cookieName) { - // Is the cookie there? - if (isset($_COOKIE[$cookieName])) { - // Then expire it with 20 minutes past - $this->addCookie($cookieName, "", false, (time() - 1200)); - - // Remove it from array - unset($_COOKIE[$cookieName]); - } // END - if - } - - /** - * Refreshs a given cookie. This will make the cookie live longer - * - * @param $cookieName Cookie to refresh - * @return void - */ - public function refreshCookie ($cookieName) { - // Only update existing cookies - if (isset($_COOKIE[$cookieName])) { - // Update the cookie - $this->addCookie($cookieName, $_COOKIE[$cookieName], false); - } // END - if - } - - /** - * Setter for image instanxe - * - * @param $imageInstance An instance of an image - * @return void - */ - public final function setImageInstance (BaseImage $imageInstance) { - $this->imageInstance = $imageInstance; - } - - /** - * Getter for default command - * - * @return $defaultCommand Default command for this response - */ - public function getDefaultCommand () { - $defaultCommand = $this->getConfigInstance()->readConfig('default_image_command'); - return $defaultCommand; - } -} - -// [EOF] -?> diff --git a/inc/classes/main/response/http/.htaccess b/inc/classes/main/response/http/.htaccess new file mode 100644 index 0000000000..3a42882788 --- /dev/null +++ b/inc/classes/main/response/http/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/inc/classes/main/response/http/class_HttpResponse.php b/inc/classes/main/response/http/class_HttpResponse.php new file mode 100644 index 0000000000..50bf2deb8e --- /dev/null +++ b/inc/classes/main/response/http/class_HttpResponse.php @@ -0,0 +1,211 @@ + + * @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 + * + * 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * 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 . + * + * The extended headers are taken from phpMyAdmin setup tool, written by + * Michal Cihar , licensed under GNU GPL 2.0. + */ +class HttpResponse extends BaseResponse implements Responseable { + /** + * Protected constructor + * + * @return void + */ + protected function __construct () { + // Call parent constructor + parent::__construct(__CLASS__); + } + + /** + * Creates an object of this class + * + * @param $appInstance An instance of a manageable application + * @return $responseInstance A prepared instance of this class + */ + public final static function createHttpResponse (ManageableApplication $appInstance) { + // Get a new instance + $responseInstance = new HttpResponse(); + + // Set the application instance + $responseInstance->setApplicationInstance($appInstance); + + // Initialize the template engine here + $responseInstance->initTemplateEngine($appInstance); + + // Return the prepared instance + return $responseInstance; + } + + /** + * Initializes the template engine instance + * + * @param $appInstance An instance of a manageable application + * @return void + */ + public final function initTemplateEngine (ManageableApplication $appInstance) { + $this->setTemplateInstance($this->prepareTemplateInstance($appInstance)); + } + + /** + * Adds a cookie to the response + * + * @param $cookieName Cookie's name + * @param $cookieValue Value to store in the cookie + * @param $encrypted Do some extra encryption on the value + * @param $expires Timestamp of expiration (default: configured) + * @return void + * @throws ResponseHeadersAlreadySentException If headers are already sent + * @todo Encryption of cookie data not yet supported. + * @todo Why are these parameters conflicting? + * @todo If the return statement is removed and setcookie() commented out, + * @todo this will send only one cookie out, the first one. + */ + public function addCookie ($cookieName, $cookieValue, $encrypted = false, $expires = null) { + //* DEBUG: */ echo $cookieName."=".$cookieValue."
\n"; + // Are headers already sent? + if (headers_sent()) { + // Throw an exception here + //* DEBUG: */ return; + throw new ResponseHeadersAlreadySentException($this, self::EXCEPTION_HEADERS_ALREADY_SENT); + } // END - if + + // Shall we encrypt the cookie? + if ($encrypted === true) { + } // END - if + + // For slow browsers set the cookie array element first + $_COOKIE[$cookieName] = $cookieValue; + + // Get all config entries + if (is_null($expires)) { + $expires = (time() + $this->getConfigInstance()->readConfig('cookie_expire')); + } // END - if + + $path = $this->getConfigInstance()->readConfig('cookie_path'); + $domain = $this->getConfigInstance()->readConfig('cookie_domain'); + + setcookie($cookieName, $cookieValue, $expires); + //, $path, $domain, (isset($_SERVER['HTTPS'])) + return; + + // Now construct the full header + $cookieString = $cookieName . "=" . $cookieValue . "; "; + $cookieString .= "expires=" . date("D, d-F-Y H:i:s", $expires) . " GMT"; + // $cookieString .= "; path=".$path."; domain=".$domain; + + // Set the cookie as a header + $this->cookies[$cookieName] = $cookieString; + } + + /** + * Redirect to a configured URL. The URL can be absolute or relative. In + * case of relative URL it will be extended automatically. + * + * @param $configEntry The configuration entry which holds our URL + * @return void + * @throws ResponseHeadersAlreadySentException If headers are already sent + */ + public function redirectToConfiguredUrl ($configEntry) { + // Is the header not yet sent? + if (headers_sent()) { + // Throw an exception here + throw new ResponseHeadersAlreadySentException($this, self::EXCEPTION_HEADERS_ALREADY_SENT); + } // END - if + + // Assign application data + $this->getTemplateInstance()->assignApplicationData($this->getApplicationInstance()); + + // Get the url from config + $url = $this->getConfigInstance()->readConfig($configEntry); + + // Compile the URL + $url = $this->getTemplateInstance()->compileRawCode($url); + + // Do we have a "http" in front of the URL? + if (substr(strtolower($url), 0, 4) != "http") { + // Is there a / in front of the relative URL? + if (substr($url, 0, 1) == "/") $url = substr($url, 1); + + // No, then extend it with our base URL + $url = $this->getConfigInstance()->readConfig('base_url') . "/" . $url; + } // END - if + + // Add redirect header + $this->addHeader("Location", $url); + + // Set correct response status + $this->setResponseStatus("301 Moved Permanently"); + + // Clear the body + $this->setResponseBody(""); + + // Flush the result + $this->flushBuffer(); + + // All done here... + exit(); + } + + /** + * Expires the given cookie if it is set + * + * @param $cookieName Cookie to expire + * @return void + */ + public function expireCookie ($cookieName) { + // Is the cookie there? + if (isset($_COOKIE[$cookieName])) { + // Then expire it with 20 minutes past + $this->addCookie($cookieName, "", false, (time() - 1200)); + + // Remove it from array + unset($_COOKIE[$cookieName]); + } // END - if + } + + /** + * Refreshs a given cookie. This will make the cookie live longer + * + * @param $cookieName Cookie to refresh + * @return void + */ + public function refreshCookie ($cookieName) { + // Only update existing cookies + if (isset($_COOKIE[$cookieName])) { + // Update the cookie + $this->addCookie($cookieName, $_COOKIE[$cookieName], false); + } // END - if + } + + /** + * Getter for default command + * + * @return $defaultCommand Default command for this response + */ + public function getDefaultCommand () { + $defaultCommand = $this->getConfigInstance()->readConfig('default_web_command'); + return $defaultCommand; + } +} + +// [EOF] +?> diff --git a/inc/classes/main/response/image/.htaccess b/inc/classes/main/response/image/.htaccess new file mode 100644 index 0000000000..3a42882788 --- /dev/null +++ b/inc/classes/main/response/image/.htaccess @@ -0,0 +1 @@ +Deny from all diff --git a/inc/classes/main/response/image/class_ImageResponse.php b/inc/classes/main/response/image/class_ImageResponse.php new file mode 100644 index 0000000000..c03e6ea6e5 --- /dev/null +++ b/inc/classes/main/response/image/class_ImageResponse.php @@ -0,0 +1,268 @@ + + * @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 + * + * 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 + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * 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 . + * + * The extended headers are taken from phpMyAdmin setup tool, written by + * Michal Cihar , licensed under GNU GPL 2.0. + */ +class ImageResponse extends BaseResponse implements Responseable { + /** + * Instance of the image + */ + private $imageInstance = null; + + /** + * Protected constructor + * + * @return void + */ + protected function __construct () { + // Call parent constructor + parent::__construct(__CLASS__); + } + + /** + * Creates an object of this class + * + * @param $appInstance An instance of a manageable application + * @return $responseInstance A prepared instance of this class + */ + public final static function createImageResponse (ManageableApplication $appInstance) { + // Get a new instance + $responseInstance = new ImageResponse(); + + // Set the application instance + $responseInstance->setApplicationInstance($appInstance); + + // Initialize the template engine here + $responseInstance->initTemplateEngine($appInstance); + + // Return the prepared instance + return $responseInstance; + } + + /** + * Initializes the template engine instance + * + * @param $appInstance An instance of a manageable application + * @return void + */ + public final function initTemplateEngine (ManageableApplication $appInstance) { + // Get config instance + $cfg = $this->getConfigInstance(); + + // Set new template engine + $cfg->setConfigEntry('template_class' , $cfg->readConfig('image_template_class')); + $cfg->setConfigEntry('raw_template_extension' , ".img"); + $cfg->setConfigEntry('code_template_extension', ".itp"); + $cfg->setConfigEntry('tpl_base_path' , "templates/images/"); + $cfg->setConfigEntry('code_template_type' , "image"); + + // Get a prepared instance + $this->setTemplateInstance($this->prepareTemplateInstance($appInstance)); + } + + /** + * Adds a cookie to the response + * + * @param $cookieName Cookie's name + * @param $cookieValue Value to store in the cookie + * @param $encrypted Do some extra encryption on the value + * @param $expires Timestamp of expiration (default: configured) + * @return void + * @throws ResponseHeadersAlreadySentException If headers are already sent + * @todo Encryption of cookie data not yet supported. + * @todo Why are these parameters conflicting? + * @todo If the return statement is removed and setcookie() commented out, + * @todo this will send only one cookie out, the first one. + */ + public function addCookie ($cookieName, $cookieValue, $encrypted = false, $expires = null) { + // Are headers already sent? + if (headers_sent()) { + // Throw an exception here + throw new ResponseHeadersAlreadySentException($this, self::EXCEPTION_HEADERS_ALREADY_SENT); + } // END - if + + // Shall we encrypt the cookie? + if ($encrypted === true) { + } // END - if + + // For slow browsers set the cookie array element first + $_COOKIE[$cookieName] = $cookieValue; + + // Get all config entries + if (is_null($expires)) { + $expires = (time() + $this->getConfigInstance()->readConfig('cookie_expire')); + } // END - if + + $path = $this->getConfigInstance()->readConfig('cookie_path'); + $domain = $this->getConfigInstance()->readConfig('cookie_domain'); + + setcookie($cookieName, $cookieValue, $expires); + //, $path, $domain, (isset($_SERVER['HTTPS'])) + return; + + // Now construct the full header + $cookieString = $cookieName . "=" . $cookieValue . "; "; + $cookieString .= "expires=" . date("D, d-F-Y H:i:s", $expires) . " GMT"; + // $cookieString .= "; path=".$path."; domain=".$domain; + + // Set the cookie as a header + $this->cookies[$cookieName] = $cookieString; + } + + /** + * Redirect to a configured URL. The URL can be absolute or relative. In + * case of relative URL it will be extended automatically. + * + * @param $configEntry The configuration entry which holds our URL + * @return void + * @throws ResponseHeadersAlreadySentException If headers are already sent + */ + public function redirectToConfiguredUrl ($configEntry) { + // Is the header not yet sent? + if (headers_sent()) { + // Throw an exception here + throw new ResponseHeadersAlreadySentException($this, self::EXCEPTION_HEADERS_ALREADY_SENT); + } // END - if + + // Assign application data + $this->getTemplateInstance()->assignApplicationData($this->getApplicationInstance()); + + // Get the url from config + $url = $this->getConfigInstance()->readConfig($configEntry); + + // Compile the URL + $url = $this->getTemplateInstance()->compileRawCode($url); + + // Do we have a "http" in front of the URL? + if (substr(strtolower($url), 0, 4) != "http") { + // Is there a / in front of the relative URL? + if (substr($url, 0, 1) == "/") $url = substr($url, 1); + + // No, then extend it with our base URL + $url = $this->getConfigInstance()->readConfig('base_url') . "/" . $url; + } // END - if + + // Add redirect header + $this->addHeader("Location", $url); + + // Set correct response status + $this->setResponseStatus("301 Moved Permanently"); + + // Clear the body + $this->setResponseBody(""); + + // Flush the result + $this->flushBuffer(); + + // All done here... + exit(); + } + + /** + * Flushs the cached HTTP response to the outer world + * + * @param $force Wether we shall force the output or abort if headers are + * already sent with an exception + * @return void + */ + public function flushBuffer ($force = false) { + // Finish the image + $this->getImageInstance()->finishImage(); + + // Get image content + $content = $this->getImageInstance()->getContent(); + + // Set it as response body + $this->setResponseBody($content); + + // Set content type + $this->addHeader('Content-type', "image/".$this->getImageInstance()->getImageType()); + + // Call parent method + parent::flushBuffer($force); + } + + /** + * Expires the given cookie if it is set + * + * @param $cookieName Cookie to expire + * @return void + */ + public function expireCookie ($cookieName) { + // Is the cookie there? + if (isset($_COOKIE[$cookieName])) { + // Then expire it with 20 minutes past + $this->addCookie($cookieName, "", false, (time() - 1200)); + + // Remove it from array + unset($_COOKIE[$cookieName]); + } // END - if + } + + /** + * Refreshs a given cookie. This will make the cookie live longer + * + * @param $cookieName Cookie to refresh + * @return void + */ + public function refreshCookie ($cookieName) { + // Only update existing cookies + if (isset($_COOKIE[$cookieName])) { + // Update the cookie + $this->addCookie($cookieName, $_COOKIE[$cookieName], false); + } // END - if + } + + /** + * Setter for image instanxe + * + * @param $imageInstance An instance of an image + * @return void + */ + public final function setImageInstance (BaseImage $imageInstance) { + $this->imageInstance = $imageInstance; + } + + /** + * Getter for image instanxe + * + * @return $imageInstance An instance of an image + */ + public final function getImageInstance () { + return $this->imageInstance; + } + + /** + * Getter for default command + * + * @return $defaultCommand Default command for this response + */ + public function getDefaultCommand () { + $defaultCommand = $this->getConfigInstance()->readConfig('default_image_command'); + return $defaultCommand; + } +} + +// [EOF] +?> diff --git a/inc/classes/main/result/class_DatabaseResult.php b/inc/classes/main/result/class_DatabaseResult.php index f7b1648ff0..3f8918b79d 100644 --- a/inc/classes/main/result/class_DatabaseResult.php +++ b/inc/classes/main/result/class_DatabaseResult.php @@ -103,7 +103,7 @@ class DatabaseResult extends BaseFrameworkSystem implements SearchableResult, Up $entryKey = $this->key(); // Now get the update criteria array and update all entries - foreach ($updateInstance->getUpdateCriteria() as $criteriaKey=>$criteriaValue) { + foreach ($updateInstance->getUpdateCriteria() as $criteriaKey => $criteriaValue) { // Update data $this->resultArray['rows'][$entryKey][$criteriaKey] = $criteriaValue; @@ -318,7 +318,7 @@ class DatabaseResult extends BaseFrameworkSystem implements SearchableResult, Up $currentEntry = $this->current(); // Walk only through out-dated columns - foreach ($this->outDated as $key=>$dummy) { + foreach ($this->outDated as $key => $dummy) { // Does this key exist? //* DEBUG: */ echo "outDated: {$key}
\n"; if (isset($currentEntry[$key])) { diff --git a/inc/classes/main/template/class_BaseTemplateEngine.php b/inc/classes/main/template/class_BaseTemplateEngine.php index 4db73b617d..7e1aa7c194 100644 --- a/inc/classes/main/template/class_BaseTemplateEngine.php +++ b/inc/classes/main/template/class_BaseTemplateEngine.php @@ -69,11 +69,6 @@ class BaseTemplateEngine extends BaseFrameworkSystem { */ private $varStack = array(); - /** - * Configuration variables in a simple array - */ - private $configVariables = array(); - /** * Loaded templates for recursive protection and detection */ @@ -154,10 +149,12 @@ class BaseTemplateEngine extends BaseFrameworkSystem { // Is the group there? if (isset($this->varStack[$this->currGroup])) { // Now search for it - foreach ($this->varStack[$this->currGroup] as $idx=>$currEntry) { + foreach ($this->varStack[$this->currGroup] as $idx => $currEntry) { + //* DEBUG: */ echo __METHOD__.":currGroup={$this->currGroup},idx={$idx},currEntry={$currEntry['name']},var={$var}
\n"; // Is the entry found? if ($currEntry['name'] == $var) { // Found! + //* DEBUG: */ echo __METHOD__.":FOUND!
\n"; $found = $idx; break; } // END - if @@ -586,7 +583,7 @@ class BaseTemplateEngine extends BaseFrameworkSystem { // Did we find some variables? if ((is_array($variableMatches)) && (count($variableMatches) == 4) && (count($variableMatches[0]) > 0)) { // Initialize all missing variables - foreach ($variableMatches[3] as $key=>$var) { + foreach ($variableMatches[3] as $key => $var) { // Variable name $varName = $variableMatches[1][$key]; @@ -628,10 +625,17 @@ class BaseTemplateEngine extends BaseFrameworkSystem { if ((!isset($this->loadedRawData[$template])) && (!in_array($template, $this->loadedTemplates))) { // Template not found, but maybe variable assigned? + //* DEBUG: */ echo __METHOD__.":template={$template}
\n"; if ($this->isVariableAlreadySet($template) !== false) { // Use that content here $this->loadedRawData[$template] = $this->readVariable($template); + // Recursive protection: + $this->loadedTemplates[] = $template; + } elseif (isset($this->varStack['config'][$template])) { + // Use that content here + $this->loadedRawData[$template] = $this->varStack['config'][$template]; + // Recursive protection: $this->loadedTemplates[] = $template; } else { @@ -671,7 +675,7 @@ class BaseTemplateEngine extends BaseFrameworkSystem { if (in_array($template, $this->compiledTemplates)) { // Abort here... return; - } + } // END - if // Remember this template being compiled $this->compiledTemplates[] = $template; @@ -703,7 +707,7 @@ class BaseTemplateEngine extends BaseFrameworkSystem { */ 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]); @@ -766,7 +770,7 @@ class BaseTemplateEngine extends BaseFrameworkSystem { */ private function assignAllVariables (array $varMatches) { // Search for all variables - foreach ($varMatches[1] as $key=>$var) { + foreach ($varMatches[1] as $key => $var) { // Detect leading equals if (substr($varMatches[2][$key], 0, 1) == "=") { @@ -796,7 +800,7 @@ class BaseTemplateEngine extends BaseFrameworkSystem { 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)) { @@ -836,7 +840,7 @@ class BaseTemplateEngine extends BaseFrameworkSystem { */ private function insertRawTemplates () { // Load all templates - foreach ($this->rawTemplates as $template=>$content) { + foreach ($this->rawTemplates as $template => $content) { // Set the template as a variable with the content $this->assignVariable($template, $content); } @@ -895,7 +899,8 @@ class BaseTemplateEngine extends BaseFrameworkSystem { */ public function assignConfigVariable ($var) { // Sweet and simple... - $this->configVariables[$var] = $this->getConfigInstance()->readConfig($var); + //* DEBUG: */ echo __METHOD__.":var={$var}
\n"; + $this->varStack['config'][$var] = $this->getConfigInstance()->readConfig($var); } /** @@ -916,7 +921,7 @@ class BaseTemplateEngine extends BaseFrameworkSystem { /** * Load a specified code template into the engine * - * @param $template The code template we shall load which is + * @param $template The code template we shall load which is * located in "code" by default * @return void */ @@ -944,14 +949,16 @@ class BaseTemplateEngine extends BaseFrameworkSystem { // 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 !) + // Set the new variable (don't remove the second dollar!) $$validVar = $dummy; // Prepare all configuration variables - $config = $this->configVariables; + $config = null; + if (isset($this->varStack['config'])) { + $config = $this->varStack['config']; + } // END - if // Remove some variables unset($idx); @@ -1184,6 +1191,9 @@ class BaseTemplateEngine extends BaseFrameworkSystem { // Get version number and assign it $this->assignVariable('app_version' , $appInstance->getAppVersion()); + + // Assign extra application-depending data + $appInstance->assignExtraTemplateData($this); } /** diff --git a/inc/classes/main/template/class_TemplateEngine.php b/inc/classes/main/template/class_TemplateEngine.php deleted file mode 100644 index afa0cbb065..0000000000 --- a/inc/classes/main/template/class_TemplateEngine.php +++ /dev/null @@ -1,1208 +0,0 @@ - - * @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 - * - * 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 - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * 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 . - */ -class TemplateEngine extends BaseFrameworkSystem implements CompileableTemplate { - /** - * The local path name where all templates and sub folders for special - * templates are stored. We will internally determine the language plus - * "html" for web templates or "emails" for email templates - */ - private $basePath = ""; - - /** - * The extension for web and email templates (not compiled templates) - */ - private $templateExtension = ".tpl"; - - /** - * The extension for code templates (not compiled templates) - */ - private $codeExtension = ".ctp"; - - /** - * Path relative to $basePath and language code for compiled code-templates - */ - private $compileOutputPath = "templates/_compiled"; - - /** - * The raw (maybe uncompiled) template - */ - private $rawTemplateData = ""; - - /** - * Template data with compiled-in variables - */ - private $compiledData = ""; - - /** - * The last loaded template's FQFN for debugging the engine - */ - private $lastTemplate = ""; - - /** - * The variable stack for the templates. This must be initialized and - * shall become an instance of FrameworkArrayObject. - */ - private $varStack = null; - - /** - * Configuration variables in a simple array - */ - private $configVariables = array(); - - /** - * Loaded templates for recursive protection and detection - */ - private $loadedTemplates = array(); - - /** - * Compiled templates for recursive protection and detection - */ - private $compiledTemplates = array(); - - /** - * Loaded raw template data - */ - private $loadedRawData = null; - - /** - * Raw templates which are linked in code templates - */ - private $rawTemplates = null; - - /** - * A regular expression for variable=value pairs - */ - private $regExpVarValue = '/([\w_]+)(="([^"]*)"|=([\w_]+))?/'; - - /** - * A regular expression for filtering out code tags - * - * E.g.: {?template:variable=value;var2=value2;[...]?} - */ - private $regExpCodeTags = '/\{\?([a-z_]+)(:("[^"]+"|[^?}]+)+)?\?\}/'; - - /** - * Loaded helpers - */ - private $helpers = array(); - - // Exception codes for the template engine - const EXCEPTION_TEMPLATE_TYPE_IS_UNEXPECTED = 0x020; - const EXCEPTION_TEMPLATE_CONTAINS_INVALID_VAR = 0x021; - const EXCEPTION_INVALID_VIEW_HELPER = 0x022; - - /** - * Protected constructor - * - * @return void - */ - protected function __construct () { - // Call parent constructor - parent::__construct(__CLASS__); - - // Clean up a little - $this->removeNumberFormaters(); - $this->removeSystemArray(); - } - - /** - * 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!) - * @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 - * @throws BasePathReadProtectedException If $basePath is - * read-protected - */ - public final static function createTemplateEngine ($basePath, ManageableLanguage $langInstance, FileIoHandler $ioInstance) { - // Get a new instance - $tplInstance = new TemplateEngine(); - - // Is the base path valid? - if (empty($basePath)) { - // Base path is empty - throw new BasePathIsEmptyException($tplInstance, self::EXCEPTION_UNEXPECTED_EMPTY_STRING); - } elseif (!is_string($basePath)) { - // Is not a string - throw new InvalidBasePathStringException(array($tplInstance, $basePath), self::EXCEPTION_INVALID_STRING); - } elseif (!is_dir($basePath)) { - // Is not a path - throw new BasePathIsNoDirectoryException(array($tplInstance, $basePath), self::EXCEPTION_INVALID_PATH_NAME); - } elseif (!is_readable($basePath)) { - // Is not readable - throw new BasePathReadProtectedException(array($tplInstance, $basePath), self::EXCEPTION_READ_PROTECED_PATH); - } - - // Get configuration instance - $cfgInstance = FrameworkConfiguration::getInstance(); - - // Set the base path - $tplInstance->setBasePath($basePath); - - // Initialize the variable stack - $tplInstance->initVariableStack(); - - // Set the language and IO instances - $tplInstance->setLanguageInstance($langInstance); - $tplInstance->setFileIoInstance($ioInstance); - - // Set template extensions - $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')); - - // Return the prepared instance - return $tplInstance; - } - - /** - * 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 - */ - private function isVariableAlreadySet ($var) { - // First everything is not found - $found = false; - - // 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! - $found = $idx->key(); - break; - } - } - - // Return the current position - 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 - * - * @param $var The variable we are looking for - * @param $value The value we want to store in the variable - * @return void - */ - private function addVariable ($var, $value) { - // Add it to the stack - $this->varStack->append(array( - 'name' => trim($var), - 'value' => trim($value) - )); - } - - /** - * Modify an entry on the stack - * - * @param $var The variable we are looking for - * @param $value The value we want to store in the variable - * @return void - */ - private function modifyVariable ($var, $value) { - // It should be there so let's look again... - for ($idx = $this->varStack->getIterator(); $idx->valid(); $idx->next()) { - // Get current entry - $currEntry = $idx->current(); - - // Is this the requested variable? - if ($currEntry['name'] == $var) { - // Change it to the other value - $this->varStack->offsetSet($idx->key(), array( - 'name' => $var, - 'value' => $value - )); - } - } - } - - /** - * Initialize the variable stack. This holds all variables for later - * compilation. - * - * @return void - */ - public final function initVariableStack () { - $this->varStack = new FrameworkArrayObject("FakedVariableStack"); - } - - /** - * Setter for base path - * - * @param $basePath The local base path for all templates - * @return void - */ - public final function setBasePath ($basePath) { - // Cast it - $basePath = (string) $basePath; - - // And set it - $this->basePath = $basePath; - } - - /** - * Getter for base path - * - * @return $basePath The local base path for all templates - */ - public final function getBasePath () { - // And set it - return $this->basePath; - } - - /** - * Setter for template extension - * - * @param $templateExtension The file extension for all uncompiled - * templates - * @return void - */ - public final function setRawTemplateExtension ($templateExtension) { - // Cast it - $templateExtension = (string) $templateExtension; - - // And set it - $this->templateExtension = $templateExtension; - } - - /** - * Setter for code template extension - * - * @param $codeExtension The file extension for all uncompiled - * templates - * @return void - */ - public final function setCodeTemplateExtension ($codeExtension) { - // Cast it - $codeExtension = (string) $codeExtension; - - // And set it - $this->codeExtension = $codeExtension; - } - - /** - * Getter for template extension - * - * @return $templateExtension The file extension for all uncompiled - * templates - */ - public final function getRawTemplateExtension () { - // And set it - return $this->templateExtension; - } - - /** - * Getter for code-template extension - * - * @return $codeExtension The file extension for all code- - * templates - */ - public final function getCodeTemplateExtension () { - // And set it - return $this->codeExtension; - } - - /** - * Setter for path of compiled templates - * - * @param $compileOutputPath The local base path for all - * compiled templates - * @return void - */ - public final function setCompileOutputPath ($compileOutputPath) { - // Cast it - $compileOutputPath = (string) $compileOutputPath; - - // And set it - $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 - * - * @return $templateType The current template's type - */ - public final function getTemplateType () { - 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 - * @return void - */ - public final function assignVariable ($var, $value) { - // First search for the variable if it was already added - $idx = $this->isVariableAlreadySet($var); - - // Was it found? - if ($idx === false) { - // Add it to the stack - $this->addVariable($var, $value); - } elseif (!empty($value)) { - // Modify the stack entry - $this->modifyVariable($var, $value); - } - } - - /** - * 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 - * @return void - */ - public final function removeVariable ($var) { - // First search for the variable if it was already added - $idx = $this->isVariableAlreadySet($var); - - // Was it found? - if ($idx !== false) { - // Remove this variable - $this->varStack->offsetUnset($idx); - } - } - - /** - * Private setter for raw template data - * - * @param $rawTemplateData The raw data from the template - * @return void - */ - private final function setRawTemplateData ($rawTemplateData) { - // Cast it to string - $rawTemplateData = (string) $rawTemplateData; - - // And store it in this class - $this->rawTemplateData = $rawTemplateData; - } - - /** - * Private setter for compiled templates - */ - private final function setCompiledData ($compiledData) { - // Cast it to string - $compiledData = (string) $compiledData; - - // And store it in this class - $this->compiledData = $compiledData; - } - - /** - * Private loader for all template types - * - * @param $template The template we shall load - * @return void - */ - private final function loadTemplate ($template) { - // Cast it to string - $template = (string) $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(); - } - - // Construct the FQFN for the template by honoring the current language - $fqfn = sprintf("%s%s/%s/%s%s", - $this->getBasePath(), - $this->getLanguageInstance()->getLanguageCode(), - $this->getTemplateType(), - $template, - $ext - ); - - // Load the raw template data - $this->loadRawTemplateData($fqfn); - } - - /** - * A private loader for raw template names - * - * @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 - */ - private function loadRawTemplateData ($fqfn) { - // Get a input/output instance from the middleware - $ioInstance = $this->getFileIoInstance(); - - // Validate the instance - if (is_null($ioInstance)) { - // Throw exception - throw new NullPointerException($this, self::EXCEPTION_IS_NULL_POINTER); - } elseif (!is_object($ioInstance)) { - // Throw another exception - throw new NoObjectException($ioInstance, self::EXCEPTION_IS_NO_OBJECT); - } elseif (!method_exists($ioInstance, 'loadFileContents')) { - // Throw yet another exception - throw new MissingMethodException(array($ioInstance, 'loadFileContents'), self::EXCEPTION_MISSING_METHOD); - } - - // Load the raw template - $rawTemplateData = $ioInstance->loadFileContents($fqfn); - - // Store the template's contents into this class - $this->setRawTemplateData($rawTemplateData); - - // Remember the template's FQFN - $this->setLastTemplate($fqfn); - } - - /** - * 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 - */ - private function assignTemplateVariable ($varName, $var) { - // Is it not a config variable? - if ($varName != "config") { - // Regular template variables - $this->assignVariable($var, ""); - } else { - // Configuration variables - $this->assignConfigVariable($var, $this->getConfigInstance()->readConfig($var)); - } - } - - /** - * Extract variables from a given raw data stream - * - * @param $rawData The raw template data we shall analyze - * @return void - */ - private function extractVariablesFromRawData ($rawData) { - // Cast to string - $rawData = (string) $rawData; - - // Search for variables - @preg_match_all('/\$(\w+)(\[(\w+)\])?/', $rawData, $variableMatches); - - // Did we find some variables? - if ((is_array($variableMatches)) && (count($variableMatches) == 4) && (count($variableMatches[0]) > 0)) { - // Initialize all missing variables - foreach ($variableMatches[3] as $key=>$var) { - // Try to assign it, empty strings are being ignored - $this->assignTemplateVariable($variableMatches[1][$key], $var); - } - } - } - - /** - * Main analysis of the loaded template - * - * @param $templateMatches Found template place-holders, see below - * @return void - * - *--------------------------------- - * 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 ":" - */ - private function analyzeTemplate (array $templateMatches) { - // Backup raw template data - $backup = $this->getRawTemplateData(); - - // Initialize some arrays - if (is_null($this->loadedRawData)) { $this->loadedRawData = array(); $this->rawTemplates = array(); } - - // Load all requested templates - foreach ($templateMatches[1] as $template) { - - // Load and compile only templates which we have not yet loaded - // RECURSIVE PROTECTION! BE CAREFUL HERE! - if ((!isset($this->loadedRawData[$template])) && (!in_array($template, $this->loadedTemplates))) { - - // Template not found, but maybe variable assigned? - if ($this->isVariableAlreadySet($template) !== false) { - // Use that content here - $this->loadedRawData[$template] = $this->readVariable($template); - - // Recursive protection: - $this->loadedTemplates[] = $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( ... - - } // for ($templateMatches ... - - // Restore the raw template data - $this->setRawTemplateData($backup); - } - - /** - * Compile a given raw template code and remember it for later usage - * - * @param $code The raw template code - * @param $template The template's name - * @return void - */ - private function compileCode ($code, $template) { - // Is this template already compiled? - if (in_array($template, $this->compiledTemplates)) { - // Abort here... - return; - } - - // Remember this template being compiled - $this->compiledTemplates[] = $template; - - // Compile the loaded code in five steps: - // - // 1. Backup current template data - $backup = $this->getRawTemplateData(); - - // 2. Set the current template's raw data as the new content - $this->setRawTemplateData($code); - - // 3. Compile the template data - $this->compileTemplate(); - - // 4. Remember it's contents - $this->loadedRawData[$template] = $this->getRawTemplateData(); - - // 5. Restore the previous raw content from backup variable - $this->setRawTemplateData($backup); - } - - /** - * 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() - * @return void - */ - private function insertAllTemplates (array $templateMatches) { - // Run through all loaded codes - foreach ($this->loadedRawData as $template=>$code) { - - // Search for the template - $foundIndex = array_search($template, $templateMatches[1]); - - // Lookup the matching template replacement - if (($foundIndex !== false) && (isset($templateMatches[0][$foundIndex]))) { - - // Get the current raw template - $rawData = $this->getRawTemplateData(); - - // Replace the space holder with the template code - $rawData = str_replace($templateMatches[0][$foundIndex], $code, $rawData); - - // Set the new raw data - $this->setRawTemplateData($rawData); - - } // END - if - - } // END - foreach - } - - /** - * Load all extra raw templates - * - * @return void - */ - private function loadExtraRawTemplates () { - // Are there some raw templates we need to load? - if (count($this->rawTemplates) > 0) { - // Try to load all raw templates - foreach ($this->rawTemplates as $key => $template) { - try { - // Load the template - $this->loadWebTemplate($template); - - // Remember it's contents - $this->rawTemplates[$template] = $this->getRawTemplateData(); - - // Remove it from the loader list - unset($this->rawTemplates[$key]); - - // Remember this template for recursion detection - // RECURSIVE PROTECTION! - $this->loadedTemplates[] = $template; - } catch (FilePointerNotOpenedException $e) { - // This template was never found. We silently ignore it - unset($this->rawTemplates[$key]); - } - } - } - } - - /** - * Assign all found template variables - * - * @param $varMatches An array full of variable/value pairs. - * @return void - */ - private function assignAllVariables (array $varMatches) { - // Search for all variables - foreach ($varMatches[1] as $key=>$var) { - - // Detect leading equals - if (substr($varMatches[2][$key], 0, 1) == "=") { - // Remove and cast it - $varMatches[2][$key] = (string) substr($varMatches[2][$key], 1); - } - - // 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... - // @TODO Unfinished work or don't die here. - die("Deeper analysis not yet implemented!"); - } - - } // for ($varMatches ... - } - /** - * Compiles all loaded raw templates - * - * @param $templateMatches See method analyzeTemplate() for details - * @return void - */ - 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) { - - // 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 (($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); - - // Assign all variables - $this->assignAllVariables($varMatches); - - } // END - if (isset($templateMatches ... - - // Compile the loaded template - $this->compileCode($code, $template); - - } // END - foreach ($this->loadedRawData ... - - // Insert all templates - $this->insertAllTemplates($templateMatches); - - } // 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 - * - * @return $rawTemplateData The raw data from the template - */ - public final function getRawTemplateData () { - return $this->rawTemplateData; - } - - /** - * Getter for compiled templates - */ - public final function getCompiledData () { - return $this->compiledData; - } - - /** - * Load a specified web template into the engine - * - * @param $template The web template we shall load which is - * located in "html" by default - * @return void - */ - public final function loadWebTemplate ($template) { - // Set template type - $this->setTemplateType($this->getConfigInstance()->readConfig('web_template_type')); - - // Load the special template - $this->loadTemplate($template); - } - - /** - * Load a specified email template into the engine - * - * @param $template The email template we shall load which is - * located in "emails" by default - * @return void - */ - public final function loadEmailTemplate ($template) { - // Set template type - $this->setTemplateType($this->getConfigInstance()->readConfig('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 - * @return void - */ - public final function loadCodeTemplate ($template) { - // Set template type - $this->setTemplateType($this->getConfigInstance()->readConfig('code_template_type')); - - // Load the special template - $this->loadTemplate($template); - } - - /** - * Compile all variables by inserting their respective values - * - * @return void - */ - public final function compileVariables () { - // Initialize the $content array - $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 - $config = $this->configVariables; - - // Remove some variables - unset($idx); - unset($currVariable); - - // 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("\$result = \"%s\";", - addslashes($this->getRawTemplateData()) - ); - - // 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); - } - - /** - * Compile all required templates into the current loaded one - * - * @return void - * @throws UnexpectedTemplateTypeException If the template type is - * not "code" - * @throws InvalidArrayCountException If an unexpected array - * 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')) { - // Abort here - 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. - $rawData = $this->getRawTemplateData(); - - // Remove double spaces and trim leading/trailing spaces - $rawData = trim(str_replace(" ", " ", $rawData)); - - // Search for raw variables - $this->extractVariablesFromRawData($rawData); - - // Search for code-tags which are {? ?} - preg_match_all($this->regExpCodeTags, $rawData, $templateMatches); - - // Analyze the matches array - if ((is_array($templateMatches)) && (count($templateMatches) == 4) && (count($templateMatches[0]) > 0)) { - // Entries are found: - // - // The main analysis - $this->analyzeTemplate($templateMatches); - - // Compile raw template data - $this->compileRawTemplateData($templateMatches); - - // Are there some raw templates left for loading? - $this->loadExtraRawTemplates(); - - // Are some raw templates found and loaded? - if (count($this->rawTemplates) > 0) { - - // Insert all raw templates - $this->insertRawTemplates(); - - // Remove the raw template content as well - $this->setRawTemplateData(""); - - } // END - if - - } // END - if($templateMatches ... - } - - /** - * Output the compiled page to the outside world. In case of web templates - * this would be vaild (X)HTML code. And in case of email templates this - * would store a prepared email body inside the template engine. - * - * @return void - */ - public final 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:] 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($msg); - die(); - } else { - // Put directly out - // DO NOT REWRITE THIS TO app_die() !!! - die($msg); - } - break; - } - } - - /** - * Loads a given view helper (by name) - * - * @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 - $helperName = ucfirst($helperName); - - // Is this view helper loaded? - if (!isset($this->helpers[$helperName])) { - // 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); - } - - // Generate new instance - $eval = sprintf("\$this->helpers[%s] = %s::create%s();", - $helperName, - $className, - $className - ); - - // Run the code - 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] -?> diff --git a/inc/classes/main/template/image/class_ImageTemplateEngine.php b/inc/classes/main/template/image/class_ImageTemplateEngine.php index 210002ffe9..68d1cbef65 100644 --- a/inc/classes/main/template/image/class_ImageTemplateEngine.php +++ b/inc/classes/main/template/image/class_ImageTemplateEngine.php @@ -100,7 +100,7 @@ class ImageTemplateEngine extends BaseTemplateEngine implements CompileableTempl $tplInstance->setCodeTemplateExtension($cfgInstance->readConfig('code_template_extension')); // Absolute output path for compiled templates - $tplInstance->setCompileOutputPath(PATH . $cfgInstance->readConfig('compile_output_path')); + $tplInstance->setCompileOutputPath($cfgInstance->readConfig('base_path') . $cfgInstance->readConfig('compile_output_path')); // Return the prepared instance return $tplInstance; diff --git a/inc/classes/main/template/mail/class_MailTemplateEngine.php b/inc/classes/main/template/mail/class_MailTemplateEngine.php index fbe229d7cf..8fcd0f9e5f 100644 --- a/inc/classes/main/template/mail/class_MailTemplateEngine.php +++ b/inc/classes/main/template/mail/class_MailTemplateEngine.php @@ -100,7 +100,7 @@ class MailTemplateEngine extends BaseTemplateEngine implements CompileableTempla $tplInstance->setCodeTemplateExtension($cfgInstance->readConfig('code_template_extension')); // Absolute output path for compiled templates - $tplInstance->setCompileOutputPath(PATH . $cfgInstance->readConfig('compile_output_path')); + $tplInstance->setCompileOutputPath($cfgInstance->readConfig('base_path') . $cfgInstance->readConfig('compile_output_path')); // Return the prepared instance return $tplInstance; diff --git a/inc/classes/main/template/web/class_WebTemplateEngine.php b/inc/classes/main/template/web/class_WebTemplateEngine.php index d166f9f019..61a6bbb107 100644 --- a/inc/classes/main/template/web/class_WebTemplateEngine.php +++ b/inc/classes/main/template/web/class_WebTemplateEngine.php @@ -81,7 +81,7 @@ class WebTemplateEngine extends BaseTemplateEngine implements CompileableTemplat $tplInstance->setCodeTemplateExtension($cfgInstance->readConfig('code_template_extension')); // Absolute output path for compiled templates - $tplInstance->setCompileOutputPath(PATH . $cfgInstance->readConfig('compile_output_path')); + $tplInstance->setCompileOutputPath($cfgInstance->readConfig('base_path') . $cfgInstance->readConfig('compile_output_path')); // Return the prepared instance return $tplInstance; diff --git a/inc/classes/middleware/database/class_DatabaseConnection.php b/inc/classes/middleware/database/class_DatabaseConnection.php index 1d9fe9b43e..736ea4b501 100644 --- a/inc/classes/middleware/database/class_DatabaseConnection.php +++ b/inc/classes/middleware/database/class_DatabaseConnection.php @@ -98,25 +98,6 @@ class DatabaseConnection extends BaseMiddleware implements DatabaseConnector, Re $this->dbLayer = $dbLayer; } - /** - * Analyses if a unique ID has already been used or not. This method does - * only pass the given ID through to the "real" database layer. - * - * @param $uniqueID A unique ID number which shall be checked - * before it will be used - * @param $inConstructor If called from a constructor or from - * somewhere else - * @return $isUnused true = The unique ID was not found in the database, - * false = It is already in use by an other object - */ - public function isUniqueIdUsed ($uniqueID, $inConstructor = false) { - // Connect to the database - $this->dbLayer->connectToDatabase(); - - // Pass the returning result through - return $this->dbLayer->isUniqueIdUsed($uniqueID, $inConstructor); - } - /** * Runs a "select" statement on the database layer with given table name * and criteria. If this doesn't fail the result will be returned diff --git a/inc/classes/third_party/api/wernisportal/class_WernisApi.php b/inc/classes/third_party/api/wernisportal/class_WernisApi.php index 4c306dd1a1..cdda5d45d6 100644 --- a/inc/classes/third_party/api/wernisportal/class_WernisApi.php +++ b/inc/classes/third_party/api/wernisportal/class_WernisApi.php @@ -200,7 +200,7 @@ class WernisApi extends BaseFrameworkSystem { // Construct the request string $requestString = $this->config['api_url'] . $scriptName."?api_id=".$this->config['wernis_api_id']."&api_key=".$this->config['wernis_api_key']; - foreach ($requestData as $key=>$value) { + foreach ($requestData as $key => $value) { $requestString .= "&".$key."=".$value; } diff --git a/inc/config.php b/inc/config.php index 4c73950744..d50782a1da 100644 --- a/inc/config.php +++ b/inc/config.php @@ -33,16 +33,16 @@ $cfg = FrameworkConfiguration::createFrameworkConfiguration(); // CFG: SERVER-PATH -$cfg->definePath(dirname(dirname(__FILE__)) . '/'); // DON'T MISS THE TRAILING SLASH!!! +$cfg->setConfigEntry('base_path', (dirname(dirname(__FILE__)) . '/')); // DON'T MISS THE TRAILING SLASH!!! // CFG: BASE-URL $cfg->setConfigEntry('base_url', $cfg->detectBaseUrl()); // CFG: DATABASE-TYPE -$cfg->defineDatabaseType('local'); +$cfg->setConfigEntry('db_type', "local"); // CFG: LOCAL-DB-PATH -$cfg->setConfigEntry('local_db_path', "db/"); +$cfg->setConfigEntry('local_db_path', $cfg->readConfig('base_path') . "db/"); // CFG: TIME-ZONE $cfg->setDefaultTimezone("Europe/Berlin"); @@ -84,7 +84,7 @@ $cfg->setConfigEntry('lang_base_path', "inc/language/"); // DON'T MISS THE TRAIL $cfg->setConfigEntry('compressor_base_path', "inc/classes/main/compressor/"); // DON'T MISS THE TRAILING SLASH! // CFG: APPLICATION-PATH -$cfg->setConfigEntry('application_path', "application"); +$cfg->setConfigEntry('application_path', $cfg->readConfig('base_path') . "application/"); // CFG: COMPILE-OUTPUT-PATH $cfg->setConfigEntry('compile_output_path', "templates/_compiled/"); // DON'T MISS THE TRAILING SLASH! @@ -116,9 +116,6 @@ $cfg->setConfigEntry('tpl_selector_prefix', "selector"); // CFG: WEB-CONTENT-TYPE $cfg->setConfigEntry('web_content_type', "text/html"); -// CFG: HEADER-CHARSET -$cfg->setConfigEntry('header_charset', "utf-8"); - // CFG: VALID-TEMPLATE-VARIABLE $cfg->setConfigEntry('tpl_valid_var', "content"); diff --git a/inc/config/class_FrameworkConfiguration.php b/inc/config/class_FrameworkConfiguration.php index 6bfdfbf7c1..8f6fa15f45 100644 --- a/inc/config/class_FrameworkConfiguration.php +++ b/inc/config/class_FrameworkConfiguration.php @@ -139,7 +139,7 @@ class FrameworkConfiguration implements Registerable { // Base path added? (Uni* / Windows) if ((substr($inc, 0, 1) != "/") && (substr($inc, 1, 1) != ":")) { // Generate FQFN - $fqfn = sprintf("%s/inc/extra/%s", PATH, $inc); + $fqfn = sprintf("%s/inc/extra/%s", $this->readConfig('base_path'), $inc); } // END - if } // END - if @@ -149,63 +149,14 @@ class FrameworkConfiguration implements Registerable { } // END - if } - /** - * Define the database type which must be valid and will not be verified. - * - * @param $type The database type. See path inc/database/. - * @return void - */ - public function defineDatabaseType ($type) { - // Is it defined or not? - if (defined('_DB_TYPE')) { - // Already defined! But we cannot throw an exception here... :( - ApplicationEntryPoint::app_die(sprintf("[%s:] Please define the database type only once in your application!", - __CLASS__ - )); - } - - // Set the constant - define('_DB_TYPE', (string) $type); - } - - /** - * Define the local file path - * - * @param $path Local file path for include files. - * @return void - */ - public function definePath ($path) { - // Cast to string - $path = (string) $path; - - // Replace backslashes with slashes - $path = str_replace("\\", "/", $path); - - // Is it defined or not? - if ((!is_dir($path)) || (!is_readable($path))) { - // Is not a valid path - ApplicationEntryPoint::app_die(sprintf("[%s:] Invalid path (not found) specified. Please make sure it is created.", - __CLASS__ - )); - } elseif (defined('PATH')) { - // Already defined! But we cannot throw an exception here... :( - ApplicationEntryPoint::app_die(sprintf("[%s:] Please define the local file path only once in your application.", - __CLASS__ - )); - } - - // Define path here - define('PATH', $path); - } - /** * Read a configuration element. * - * @param $cfgEntry The configuration element + * @param $cfgEntry The configuration element * @return $cfgValue The fetched configuration value - * @throws ConfigEntryIsEmptyException If $cfgEntry is empty + * @throws ConfigEntryIsEmptyException If $cfgEntry is empty * @throws ConfigEntryNotFoundException If a configuration element - * was not found + * was not found */ public function readConfig ($cfgEntry) { // Cast to string @@ -232,8 +183,8 @@ class FrameworkConfiguration implements Registerable { /** * Set a configuration entry. * - * @param $cfgEntry The configuration entry we want to add/change - * @param $cfgValue The configuration value we want to set + * @param $cfgEntry The configuration entry we want to add/change + * @param $cfgValue The configuration value we want to set * @return void * @throws ConfigEntryIsEmptyException If $cfgEntry is empty */ diff --git a/inc/database.php b/inc/database.php index 1d381d2e2b..03bc377ac5 100644 --- a/inc/database.php +++ b/inc/database.php @@ -23,21 +23,16 @@ */ // Initialize layer -$layer = null; +$layerInstance = null; -// Is the type defined? -if (!defined('_DB_TYPE')) { - // Abort here - ApplicationEntryPoint::app_die("[Main:] Please define a database type first!
-E.g.:
$cfg->defineDatabaseType("local");
-This will choose the local file-based database layer."); -} +// Get config instance +$cfg = FrameworkConfiguration::getInstance(); // Generate FQFN for the database layer $INC = sprintf("%sinc/database/lib-%s%s", - PATH, - _DB_TYPE, - FrameworkConfiguration::getInstance()->readConfig('php_extension') + $cfg->readConfig('base_path'), + $cfg->readConfig('db_type'), + $cfg->readConfig('php_extension') ); // Load the database layer include @@ -47,7 +42,7 @@ if ((file_exists($INC)) && (is_file($INC)) && (is_readable($INC))) { } else { // Layer is missing! ApplicationEntryPoint::app_die(sprintf("[Main:] Database layer is missing! (%s) -> R.I.P.", - _DB_TYPE + $cfg->readConfig('db_type') )); } @@ -56,7 +51,7 @@ unset($INC); // Prepare database instance try { - $db = DatabaseConnection::createDatabaseConnection(DebugMiddleware::getInstance(), $layer); + $db = DatabaseConnection::createDatabaseConnection(DebugMiddleware::getInstance(), $layerInstance); } catch (NullPointerException $e) { ApplicationEntryPoint::app_die(sprintf("[Main:] Database sub-system not initialized for the follwing reason: %s
\n", $e->getMessage() diff --git a/inc/database/lib-local.php b/inc/database/lib-local.php index 7216bedd6e..ae748c5de1 100644 --- a/inc/database/lib-local.php +++ b/inc/database/lib-local.php @@ -24,7 +24,7 @@ // Zum Testen speichern wir in lokale Dateien (LocalFileDatabase) try { - $layer = LocalFileDatabase::createLocalFileDatabase(PATH . FrameworkConfiguration::getInstance()->readConfig('local_db_path'), FileIoHandler::getInstance()); + $layerInstance = LocalFileDatabase::createLocalFileDatabase(FrameworkConfiguration::getInstance()->readConfig('local_db_path'), FileIoHandler::getInstance()); } catch (SavePathIsEmptyException $e) { ApplicationEntryPoint::app_die(sprintf("[Main:] Database layer could not be initialized. Reason: %s", $e->getMessage() diff --git a/inc/includes.php b/inc/includes.php index 41933d9544..54bd39be01 100644 --- a/inc/includes.php +++ b/inc/includes.php @@ -26,7 +26,7 @@ $cfg = FrameworkConfiguration::getInstance(); // Include the class loader function -require(sprintf("%sinc/loader/class_ClassLoader%s", PATH, $cfg->readConfig('php_extension'))); +require(sprintf("%sinc/loader/class_ClassLoader%s", $cfg->readConfig('base_path'), $cfg->readConfig('php_extension'))); // Does the user has an application specified? if (!empty($_GET['app'])) { @@ -71,7 +71,7 @@ function __autoload ($className) { /** * Is the devel package included? */ -if (is_dir(sprintf("%sdevel", PATH))) { +if (is_dir(sprintf("%sdevel", $cfg->readConfig('base_path')))) { /** * Load all development includes */ diff --git a/inc/language.php b/inc/language.php index 3f7c3859cb..6db17c0ba7 100644 --- a/inc/language.php +++ b/inc/language.php @@ -22,7 +22,7 @@ */ try { $lang = LanguageSystem::createLanguageSystem(sprintf("%s%s", - PATH, + $cfg->readConfig('base_path'), FrameworkConfiguration::getInstance()->readConfig('lang_base_path') )); } catch (LanguagePathIsEmptyException $e) { diff --git a/inc/loader/class_ClassLoader.php b/inc/loader/class_ClassLoader.php index 7297c7d199..134b8c10d4 100644 --- a/inc/loader/class_ClassLoader.php +++ b/inc/loader/class_ClassLoader.php @@ -119,8 +119,8 @@ class ClassLoader { // Construct the FQFN for the cache if (!defined('DEVELOPER')) { - $this->listCacheFQFN = PATH . $this->cfgInstance->readConfig('local_db_path') . "list-" . $this->cfgInstance->readConfig('app_name') . ".cache"; - $this->classCacheFQFN = PATH . $this->cfgInstance->readConfig('local_db_path') . "class-" . $this->cfgInstance->readConfig('app_name') . ".cache"; + $this->listCacheFQFN = $this->cfgInstance->readConfig('local_db_path') . "list-" . $this->cfgInstance->readConfig('app_name') . ".cache"; + $this->classCacheFQFN = $this->cfgInstance->readConfig('local_db_path') . "class-" . $this->cfgInstance->readConfig('app_name') . ".cache"; } // END - if // Set suffix and prefix from configuration @@ -208,8 +208,8 @@ class ClassLoader { /** * Scans recursively a local path for class files which must have a prefix and a suffix as given by $this->suffix and $this->prefix * - * @param $basePath The relative base path to PATH constant for all classes - * @param $ignoreList An optional list (array or string) of directory names which shall be ignored + * @param $basePath The relative base path to 'base_path' constant for all classes + * @param $ignoreList An optional list (array or string) of directory names which shall be ignored * @return void */ public function loadClasses ($basePath, $ignoreList = array() ) { @@ -280,7 +280,7 @@ class ClassLoader { $this->prefixLen = strlen($this->prefix); // Set base directory - $basePath = sprintf("%sinc/config/", PATH); + $basePath = sprintf("%sinc/config/", $this->cfgInstance->readConfig('base_path')); // Load all classes from the config directory $this->loadClasses($basePath); @@ -334,7 +334,7 @@ class ClassLoader { */ private function includeExtraConfigs () { // Run through all class names (should not be much) - foreach ($this->classes as $fileName=>$fqfn) { + foreach ($this->classes as $fileName => $fqfn) { // Is this a config? if (substr($fileName, 0, $this->prefixLen) == $this->prefix) { // Then include it diff --git a/inc/selector.php b/inc/selector.php index a1ae868810..ddab76926e 100644 --- a/inc/selector.php +++ b/inc/selector.php @@ -45,8 +45,7 @@ foreach ($configAppIncludes as $inc) { } // Generate a FQFN for the helper class - $fqfn = sprintf("%s%s/%s/%s%s", - PATH, + $fqfn = sprintf("%s%s/%s%s", $cfg->readConfig('application_path'), $cfg->readConfig('app_name'), $inc, diff --git a/index.php b/index.php index 9d61748040..5b3894a379 100644 --- a/index.php +++ b/index.php @@ -68,7 +68,7 @@ class ApplicationEntryPoint { if (empty($message)) { // No message provided $message = "No message provided!"; - } + } // END - if // Get some instances $tpl = FrameworkConfiguration::getInstance()->readConfig('template_class'); @@ -93,13 +93,25 @@ class ApplicationEntryPoint { // Get and prepare backtrace for output $backtraceArray = debug_backtrace(); $backtrace = ""; - foreach ($backtraceArray as $key=>$trace) { + foreach ($backtraceArray as $key => $trace) { if (!isset($trace['file'])) $trace['file'] = __FILE__; if (!isset($trace['line'])) $trace['line'] = __LINE__; if (!isset($trace['args'])) $trace['args'] = array(); $backtrace .= "".basename($trace['file']).":".$trace['line'].", ".$trace['function']."(".count($trace['args']).")
"; } // END - foreach + // Init application instance + $appInstance = null; + + // Is the class there? + if (class_exists('ApplicationHelper')) { + // Get application instance + $appInstance = ApplicationHelper::getInstance(); + + // Assign application data + $templateInstance->assignApplicationData($appInstance); + } // END - if + // Assign variables $templateInstance->assignVariable('message', $message); $templateInstance->assignVariable('code', $code); @@ -150,13 +162,13 @@ class ApplicationEntryPoint { require(dirname(__FILE__) . '/inc/config.php'); // Load all include files - require(PATH . 'inc/includes.php'); + require($cfg->readConfig('base_path') . 'inc/includes.php'); // Load all framework classes - require(PATH . 'inc/classes.php'); + require($cfg->readConfig('base_path') . 'inc/classes.php'); // Include the application selector - require(PATH . 'inc/selector.php'); + require($cfg->readConfig('base_path') . 'inc/selector.php'); } // END - main() } // END - class