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
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
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
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+// 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",
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
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]
// Set the compressor channel
$this->setCompressorChannel(CompressorChannel::createCompressorChannel(sprintf("%s%s",
- PATH,
+ $this->getConfigInstance()->readConfig('base_path'),
$this->getConfigInstance()->readConfig('compressor_base_path')
)));
$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
*
} // 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')
} // 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("<span id=\"code_line\">%s</span>: %s\n",
($lineNo + 1),
// Prepare a template instance
$templateInstance = $this->prepareTemplateInstance($appInstance);
+ // Assign application data with template engine
+ $templateInstance->assignApplicationData($appInstance);
+
// Load the master template
$masterTemplate = $appInstance->getMasterTemplate();
--- /dev/null
+<?php
+/**
+ * A command for logout
+ *
+ * @author Roland Haeder <webmaster@ship-simu.org>
+ * @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 <http://www.gnu.org/licenses/>.
+ */
+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]
+?>
// Prepare a template instance
$templateInstance = $this->prepareTemplateInstance($appInstance);
+ // Assign application data
+ $templateInstance->assignApplicationData($appInstance);
+
// Load the master template
$masterTemplate = $appInstance->getMasterTemplate();
--- /dev/null
+<?php
+/**
+ * The default controller for logout page
+ *
+ * @author Roland Haeder <webmaster@ship-simu.org>
+ * @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 <http://www.gnu.org/licenses/>.
+ */
+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]
+?>
$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
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
*
// 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);
// 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);
} // END - if
// Entry found, so update it
- foreach ($criteriaArray as $criteriaKey=>$criteriaValue) {
+ foreach ($criteriaArray as $criteriaKey => $criteriaValue) {
$dataArray[$criteriaKey] = $criteriaValue;
} // END - foreach
$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']);
$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
$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
// Set the image string
//* DEBUG: */ echo __METHOD__.": size={$size}, x={$x}, y={$y}, string={$imageString}<br />\n";
- imagestring($this->imageResource, $size, $x, $y, $imageString, $foreColor);
+ imagestring($this->getImageResource(), $size, $x, $y, $imageString, $foreColor);
} // END - foreach
break;
}
// 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);
}
$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
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 {
* @return void
*/
public function prepareRequestData () {
- // Copy the $_REQUEST array
- $this->requestData = $_REQUEST;
+ // Copy GET then POST data
+ $this->requestData = array_merge($_GET, $_POST);
}
/**
* @return void
*/
public function setRequestElement ($element, $value) {
+ error_log(__METHOD__.":{$element}={$value}");
$this->requestData[$element] = $value;
}
$isValid = true;
} // END - if
- // Debug output
- //* DEBUG: */ $this->debugBackTrace();
-
// Set action name
$this->setActionName($actionName);
$isValid = true;
} // END - if
- // Debug output
- //* DEBUG: */ $this->debugBackTrace();
-
// Set command name
$this->setCommandName($commandName);
}
} // END - while
- // Debug output
- //* DEBUG: */ $this->debugBackTrace();
-
// Return the result
return $isValid;
}
* controller class is missing (bad!)
*/
private function loadController ($controllerName) {
- // Debug message
- //* DEBUG: */ $this->debugBackTrace();
-
// Cache default command
$defaultController = $this->getConfigInstance()->readConfig('default_image_command');
* controller class is missing (bad!)
*/
private function loadController ($controllerName) {
- // Debug message
- //* DEBUG: */ $this->debugBackTrace();
-
// Cache default command
$defaultController = $this->getConfigInstance()->readConfig('default_web_command');
--- /dev/null
+<?php
+/**
+ * A generic request class
+ *
+ * @author Roland Haeder <webmaster@ship-simu.org>
+ * @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 <http://www.gnu.org/licenses/>.
+ *
+ * The extended headers are taken from phpMyAdmin setup tool, written by
+ * Michal Cihar <michal@cihar.com>, 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}<br />\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]
+?>
+++ /dev/null
-<?php
-/**
- * A class for an HTTP response on an HTTP request
- *
- * @author Roland Haeder <webmaster@ship-simu.org>
- * @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 <http://www.gnu.org/licenses/>.
- *
- * The extended headers are taken from phpMyAdmin setup tool, written by
- * Michal Cihar <michal@cihar.com>, 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."<br />\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]
-?>
+++ /dev/null
-<?php
-/**
- * A class for an image response on an HTTP request
- *
- * @author Roland Haeder <webmaster@ship-simu.org>
- * @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 <http://www.gnu.org/licenses/>.
- *
- * The extended headers are taken from phpMyAdmin setup tool, written by
- * Michal Cihar <michal@cihar.com>, 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]
-?>
--- /dev/null
+Deny from all
--- /dev/null
+<?php
+/**
+ * A class for an HTTP response on an HTTP request
+ *
+ * @author Roland Haeder <webmaster@ship-simu.org>
+ * @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 <http://www.gnu.org/licenses/>.
+ *
+ * The extended headers are taken from phpMyAdmin setup tool, written by
+ * Michal Cihar <michal@cihar.com>, 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."<br />\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]
+?>
--- /dev/null
+Deny from all
--- /dev/null
+<?php
+/**
+ * A class for an image response on an HTTP request
+ *
+ * @author Roland Haeder <webmaster@ship-simu.org>
+ * @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 <http://www.gnu.org/licenses/>.
+ *
+ * The extended headers are taken from phpMyAdmin setup tool, written by
+ * Michal Cihar <michal@cihar.com>, 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]
+?>
$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;
$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}<br />\n";
if (isset($currentEntry[$key])) {
*/
private $varStack = array();
- /**
- * Configuration variables in a simple array
- */
- private $configVariables = array();
-
/**
* Loaded templates for recursive protection and detection
*/
// 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}<br />\n";
// Is the entry found?
if ($currEntry['name'] == $var) {
// Found!
+ //* DEBUG: */ echo __METHOD__.":FOUND!<br />\n";
$found = $idx;
break;
} // END - if
// 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];
if ((!isset($this->loadedRawData[$template])) && (!in_array($template, $this->loadedTemplates))) {
// Template not found, but maybe variable assigned?
+ //* DEBUG: */ echo __METHOD__.":template={$template}<br />\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 {
if (in_array($template, $this->compiledTemplates)) {
// Abort here...
return;
- }
+ } // END - if
// Remember this template being compiled
$this->compiledTemplates[] = $template;
*/
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]);
*/
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) == "=") {
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)) {
*/
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);
}
*/
public function assignConfigVariable ($var) {
// Sweet and simple...
- $this->configVariables[$var] = $this->getConfigInstance()->readConfig($var);
+ //* DEBUG: */ echo __METHOD__.":var={$var}<br />\n";
+ $this->varStack['config'][$var] = $this->getConfigInstance()->readConfig($var);
}
/**
/**
* 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
*/
// Transfer it's name/value combination to the $content array
//* DEBUG: */ echo $currVariable['name']."=<pre>".htmlentities($currVariable['value'])."</pre>\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);
// Get version number and assign it
$this->assignVariable('app_version' , $appInstance->getAppVersion());
+
+ // Assign extra application-depending data
+ $appInstance->assignExtraTemplateData($this);
}
/**
+++ /dev/null
-<?php
-/**
- * The own template engine for loading caching and sending out the web pages
- * and emails.
- *
- * @author Roland Haeder <webmaster@ship-simu.org>
- * @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 <http://www.gnu.org/licenses/>.
- */
-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=<pre>".htmlentities($currEntry['value'])."</pre>\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']."=<pre>".htmlentities($currVariable['value'])."</pre>\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, "<?") !== false) {
- // Get left part before "<?"
- $evalLeft = substr($eval, 0, strpos($eval, "<?"));
-
- // Get all from right of "<?"
- $evalRight = substr($eval, (strpos($eval, "<?") + 2));
-
- // Is this a full PHP tag?
- if (substr(strtolower($evalRight), 0, 3) == "php") {
- // Remove "php" string from full PHP tag
- $evalRight = substr($evalRight, 3);
- } // END - if
-
- // Cut middle part out and remove escapes
- $evalMiddle = trim(substr($evalRight, 0, strpos($evalRight, "?>")));
- $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: <pre><em>%s</em></pre><br />\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 <strong>%s</strong> 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]
-?>
$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;
$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;
$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;
$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
// 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;
}
$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");
$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!
// 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");
// 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
} // 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
/**
* 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
*/
*/
// 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!<br />
-E.g.:<pre>$cfg->defineDatabaseType("local");</pre>
-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
} else {
// Layer is missing!
ApplicationEntryPoint::app_die(sprintf("[Main:] Database layer is missing! (%s) -> R.I.P.",
- _DB_TYPE
+ $cfg->readConfig('db_type')
));
}
// 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: <strong>%s</strong><br />\n",
$e->getMessage()
// 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: <strong>%s</strong>",
$e->getMessage()
$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'])) {
/**
* Is the devel package included?
*/
-if (is_dir(sprintf("%sdevel", PATH))) {
+if (is_dir(sprintf("%sdevel", $cfg->readConfig('base_path')))) {
/**
* Load all development includes
*/
*/
try {
$lang = LanguageSystem::createLanguageSystem(sprintf("%s%s",
- PATH,
+ $cfg->readConfig('base_path'),
FrameworkConfiguration::getInstance()->readConfig('lang_base_path')
));
} catch (LanguagePathIsEmptyException $e) {
// 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
/**
* 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() ) {
$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);
*/
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
}
// 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,
if (empty($message)) {
// No message provided
$message = "No message provided!";
- }
+ } // END - if
// Get some instances
$tpl = FrameworkConfiguration::getInstance()->readConfig('template_class');
// 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 .= "<span class=\"backtrace_file\">".basename($trace['file'])."</span>:".$trace['line'].", <span class=\"backtrace_function\">".$trace['function']."(".count($trace['args']).")</span><br />";
} // 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);
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