* @version 0.0.0 * @copyright Copyright (c) 2007, 2008 Roland Haeder, 2009 - 2011 Core Developer Team * @license GNU GPL 3.0 or any newer version * @link http://www.ship-simu.org * @todo This template engine does not make use of setTemplateType() * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ class MailTemplateEngine extends BaseTemplateEngine implements CompileableTemplate { /** * Main nodes in the XML tree */ private $mainNodes = array( 'mail-data' ); /** * Sub nodes in the XML tree */ private $subNodes = array( 'subject-line', 'sender-address', 'recipient-address', 'message' ); /** * Mailer instance */ private $mailerInstance = null; /** * Current main node */ private $currMainNode = ''; /** * Protected constructor * * @return void */ protected function __construct () { // Call parent constructor parent::__construct(__CLASS__); } /** * Creates an instance of the class TemplateEngine and prepares it for usage * * @return $templateInstance An instance of TemplateEngine * @throws BasePathIsEmptyException If the provided $templateBasePath is empty * @throws InvalidBasePathStringException If $templateBasePath is no string * @throws BasePathIsNoDirectoryException If $templateBasePath is no * directory or not found * @throws BasePathReadProtectedException If $templateBasePath is * read-protected */ public static final function createMailTemplateEngine () { // Get a new instance $templateInstance = new MailTemplateEngine(); // Get the application instance from registry $applicationInstance = Registry::getRegistry()->getInstance('app'); // Determine base path $templateBasePath = $templateInstance->getConfigInstance()->getConfigEntry('application_base_path') . $applicationInstance->getRequestInstance()->getRequestElement('app') . '/'; // Is the base path valid? if (empty($templateBasePath)) { // Base path is empty throw new BasePathIsEmptyException($templateInstance, self::EXCEPTION_UNEXPECTED_EMPTY_STRING); } elseif (!is_string($templateBasePath)) { // Is not a string throw new InvalidBasePathStringException(array($templateInstance, $templateBasePath), self::EXCEPTION_INVALID_STRING); } elseif (!is_dir($templateBasePath)) { // Is not a path throw new BasePathIsNoDirectoryException(array($templateInstance, $templateBasePath), self::EXCEPTION_INVALID_PATH_NAME); } elseif (!is_readable($templateBasePath)) { // Is not readable throw new BasePathReadProtectedException(array($templateInstance, $templateBasePath), self::EXCEPTION_READ_PROTECED_PATH); } // Set the base path $templateInstance->setTemplateBasePath($templateBasePath); // Set template extensions $templateInstance->setRawTemplateExtension($templateInstance->getConfigInstance()->getConfigEntry('raw_template_extension')); $templateInstance->setCodeTemplateExtension($templateInstance->getConfigInstance()->getConfigEntry('code_template_extension')); // Absolute output path for compiled templates $templateInstance->setCompileOutputPath($templateInstance->getConfigInstance()->getConfigEntry('base_path') . $templateInstance->getConfigInstance()->getConfigEntry('compile_output_path')); // Return the prepared instance return $templateInstance; } /** * Getter for current main node * * @return $currMainNode Current main node */ public final function getCurrMainNode () { return $this->currMainNode; } /** * Getter for main node array * * @return $mainNodes Array with valid main node names */ public final function getMainNodes () { return $this->mainNodes; } /** * Getter for sub node array * * @return $subNodes Array with valid sub node names */ public final function getSubNodes () { return $this->subNodes; } /** * Handles the start element of an XML resource * * @param $resource XML parser resource (currently ignored) * @param $element The element we shall handle * @param $attributes All attributes * @return void * @throws InvalidXmlNodeException If an unknown/invalid XML node name was found */ protected function startElement ($resource, $element, array $attributes) { // Initial method name which will never be called... $methodName = 'initEmail'; // Make the element name lower-case $element = strtolower($element); // Is the element a main node? //* DEBUG: */ echo "START: >".$element."<
\n"; if (in_array($element, $this->getMainNodes())) { // Okay, main node found! $methodName = 'setEmail' . $this->convertToClassName($element); } elseif (in_array($element, $this->getSubNodes())) { // Sub node found $methodName = 'setEmailProperty' . $this->convertToClassName($element); } elseif ($element != 'text-mail') { // Invalid node name found throw new InvalidXmlNodeException(array($this, $element, $attributes), XmlParser::EXCEPTION_XML_NODE_UNKNOWN); } // Call method //* DEBUG: */ echo "call: ".$methodName."
\n"; call_user_func_array(array($this, $methodName), $attributes); } /** * Ends the main or sub node by sending out the gathered data * * @param $resource An XML resource pointer (currently ignored) * @param $nodeName Name of the node we want to finish * @return void * @throws XmlNodeMismatchException If current main node mismatches the closing one */ protected function endElement ($resource, $nodeName) { // Make all lower-case $nodeName = strtolower($nodeName); // Does this match with current main node? //* DEBUG: */ echo "END: >".$nodeName."<
\n"; if (($nodeName != $this->getCurrMainNode()) && (in_array($nodeName, $this->getMainNodes()))) { // Did not match! throw new XmlNodeMismatchException (array($this, $nodeName, $this->getCurrMainNode()), XmlParser::EXCEPTION_XML_NODE_MISMATCH); } elseif (in_array($nodeName, $this->getSubNodes())) { // Silently ignore sub nodes return; } // Construct method name $methodName = 'finish' . $this->convertToClassName($nodeName); // Call the corresponding method call_user_func_array(array($this, $methodName), array()); } /** * Adds the message text to the template engine * * @param $resource XML parser resource (currently ignored) * @param $characters Characters to handle * @return void */ protected function characterHandler ($resource, $characters) { // Trim all spaces away $characters = trim($characters); // Is this string empty? if (empty($characters)) { // Then skip it silently return false; } // END - if // Add the message now $this->assignVariable('message', $characters); } /** * Intializes the mail * * @return void * @todo Add cache creation here */ private function initEmail () { // Unfinished work! } /** * Setter for mail data node * * @return void * @todo Should we call back the mailer class here? */ private function setEmailMailData () { // Set current main node $this->currMainNode = 'mail-data'; } /** * Setter for sender address property * * @param $senderAddress Sender address to set in email * @return void */ private function setEmailPropertySenderAddress ($senderAddress) { // Set the template variable $this->assignVariable('sender', $senderAddress); } /** * Setter for recipient address property * * @param $recipientAddress Recipient address to set in email * @return void */ private function setEmailPropertyRecipientAddress ($recipientAddress) { // Set the template variable $this->assignVariable('recipient', $recipientAddress); } /** * Setter for subject line property * * @param $subjectLine Subject line to set in email * @return void */ private function setEmailPropertySubjectLine ($subjectLine) { // Set the template variable $this->assignVariable('subject', $subjectLine); } /** * Method stub to avoid output * * @return void */ private function setEmailPropertyMessage () { // Empty for now } /** * Gets the template variable "message", stores it back as raw template data * and compiles all variables so the mail message got prepared for output * * @return void */ private function finishMailData () { // Get the message and set it as new raw template data back $message = $this->readVariable('message'); $this->setRawTemplateData($message); // Get some variables to compile //$sender = $this->compileRawCode($this->readVariable('sender')); //$this->assignVariable('sender', $sender); // Then compile all variables $this->compileVariables(); } /** * Invokes the final mail process * * @return void */ private function finishTextMail () { $this->getMailerInstance()->invokeMailDelivery(); } /** * Getter for image cache file (FQFN) * * @return $fqfn Full-qualified file name of the image cache * @todo 0% done */ public function getMailCacheFqfn () { // Initialize FQFN $fqfn = ''; $this->debugBackTrace(); // Return it return $fqfn; } /** * Setter for mailer instance * * @param $mailerInstance A mailer instance * @return void */ public final function setMailerInstance (DeliverableMail $mailerInstance) { $this->mailerInstance = $mailerInstance; } /** * Getter for mailer instance * * @return $mailerInstance A mailer instance */ protected final function getMailerInstance () { return $this->mailerInstance; } /** * Outputs the mail to the world. This should only the mailer debug class do! * * @param $responseInstance An instance of a Responseable class * @return void */ public function transferToResponse (Responseable $responseInstance) { $responseInstance->writeToBody($this->getCompiledData()); } } // [EOF] ?>