From 77760e7d3fafba0fbfb622d26bef5b33d48cef69 Mon Sep 17 00:00:00 2001 From: Etienne Roudeix Date: Wed, 13 Nov 2013 14:48:35 +0100 Subject: [PATCH] module template inclusion --- core/lib/Thelia/Action/HttpException.php | 2 +- .../Controller/Admin/BaseAdminController.php | 2 +- .../Controller/Front/BaseFrontController.php | 2 +- .../Core/EventListener/ViewListener.php | 2 +- .../Core/Template/Smarty/SmartyParser.php | 59 +++++++++++++++++-- .../Core/Template/TemplateDefinition.php | 22 ++++--- .../Thelia/Core/Template/TemplateHelper.php | 9 +++ core/lib/Thelia/Core/Thelia.php | 53 +++++++++++++++-- .../{ => backoffice/default}/admin.html | 0 9 files changed, 129 insertions(+), 22 deletions(-) rename local/modules/Colissimo/templates/{ => backoffice/default}/admin.html (100%) diff --git a/core/lib/Thelia/Action/HttpException.php b/core/lib/Thelia/Action/HttpException.php index eff2f7586..6448f5b2d 100755 --- a/core/lib/Thelia/Action/HttpException.php +++ b/core/lib/Thelia/Action/HttpException.php @@ -56,7 +56,7 @@ class HttpException extends BaseAction implements EventSubscriberInterface $parser = $this->container->get("thelia.parser"); // Define the template thant shoud be used - $parser->setTemplate(TemplateHelper::getInstance()->getActiveFrontTemplate()->getPath()); + $parser->setTemplate(TemplateHelper::getInstance()->getActiveFrontTemplate()); //$event->getRequest()->attributes->set('_view', ConfigQuery::getPageNotFoundView()); diff --git a/core/lib/Thelia/Controller/Admin/BaseAdminController.php b/core/lib/Thelia/Controller/Admin/BaseAdminController.php index 5d10c65b6..849438539 100755 --- a/core/lib/Thelia/Controller/Admin/BaseAdminController.php +++ b/core/lib/Thelia/Controller/Admin/BaseAdminController.php @@ -201,7 +201,7 @@ class BaseAdminController extends BaseController $parser = $this->container->get("thelia.parser"); // Define the template that should be used - $parser->setTemplate($template ?: TemplateHelper::getInstance()->getActiveAdminTemplate()->getPath()); + $parser->setTemplate($template ?: TemplateHelper::getInstance()->getActiveAdminTemplate()); return $parser; } diff --git a/core/lib/Thelia/Controller/Front/BaseFrontController.php b/core/lib/Thelia/Controller/Front/BaseFrontController.php index 124a91296..e0f4ce105 100755 --- a/core/lib/Thelia/Controller/Front/BaseFrontController.php +++ b/core/lib/Thelia/Controller/Front/BaseFrontController.php @@ -97,7 +97,7 @@ class BaseFrontController extends BaseController $parser = $this->container->get("thelia.parser"); // Define the template that should be used - $parser->setTemplate($template ?: TemplateHelper::getInstance()->getActiveFrontTemplate()->getPath()); + $parser->setTemplate($template ?: TemplateHelper::getInstance()->getActiveFrontTemplate()); return $parser; } diff --git a/core/lib/Thelia/Core/EventListener/ViewListener.php b/core/lib/Thelia/Core/EventListener/ViewListener.php index 53f525e65..4bdfd2195 100755 --- a/core/lib/Thelia/Core/EventListener/ViewListener.php +++ b/core/lib/Thelia/Core/EventListener/ViewListener.php @@ -78,7 +78,7 @@ class ViewListener implements EventSubscriberInterface { $parser = $this->container->get('thelia.parser'); - $parser->setTemplate(TemplateHelper::getInstance()->getActiveFrontTemplate()->getPath()); + $parser->setTemplate(TemplateHelper::getInstance()->getActiveFrontTemplate()); $request = $this->container->get('request'); try { diff --git a/core/lib/Thelia/Core/Template/Smarty/SmartyParser.php b/core/lib/Thelia/Core/Template/Smarty/SmartyParser.php index 96aa3dd24..53cedbede 100755 --- a/core/lib/Thelia/Core/Template/Smarty/SmartyParser.php +++ b/core/lib/Thelia/Core/Template/Smarty/SmartyParser.php @@ -13,6 +13,7 @@ use Thelia\Core\Template\ParserInterface; use Thelia\Core\Template\Smarty\AbstractSmartyPlugin; use Thelia\Core\Template\Exception\ResourceNotFoundException; use Thelia\Core\Template\ParserContext; +use Thelia\Core\Template\TemplateDefinition; use Thelia\Model\ConfigQuery; use Thelia\Core\Template\TemplateHelper; @@ -23,13 +24,15 @@ use Thelia\Core\Template\TemplateHelper; */ class SmartyParser extends Smarty implements ParserInterface { - public $plugins = array(); protected $request; protected $dispatcher; protected $parserContext; + protected $backOfficeTemplateDirectories = array(); + protected $frontOfficeTemplateDirectories = array(); + protected $template = ""; protected $status = 200; @@ -101,15 +104,59 @@ class SmartyParser extends Smarty implements ParserInterface } } - public function setTemplate($template_path_from_template_base) + public function addBackOfficeTemplateDirectory($templateName, $templateDirectory, $key) { - $this->template = $template_path_from_template_base; + $this->backOfficeTemplateDirectories[$templateName][$key] = $templateDirectory; + } - $this->addTemplateDir(THELIA_TEMPLATE_DIR.$this->template, 0); + public function addFrontOfficeTemplateDirectory($templateName, $templateDirectory, $key) + { + $this->frontOfficeTemplateDirectories[$templateName][$key] = $templateDirectory; + } - $config_dir = THELIA_TEMPLATE_DIR.$this->template.'/configs'; + /** + * @param TemplateDefinition $templateDefinition + */ + public function setTemplate(TemplateDefinition $templateDefinition) + { + $this->template = $templateDefinition->getPath(); - $this->setConfigDir($config_dir); + /* init template directories */ + $this->setTemplateDir(array()); + + /* add main template directory */ + $this->addTemplateDir(THELIA_TEMPLATE_DIR . $this->template, 0); + + /* define config directory */ + $configDirectory = THELIA_TEMPLATE_DIR . $this->template . '/configs'; + $this->setConfigDir($configDirectory); + + /* add modules template directories */ + switch($templateDefinition->getType()) { + case TemplateDefinition::FRONT_OFFICE: + /* do not pass array directly to addTemplateDir since we cant control on keys */ + if(isset($this->frontOfficeTemplateDirectories[$templateDefinition->getName()])) { + foreach($this->frontOfficeTemplateDirectories[$templateDefinition->getName()] as $key => $directory) { + $this->addTemplateDir($directory, $key); + } + } + break; + + case TemplateDefinition::BACK_OFFICE: + /* do not pass array directly to addTemplateDir since we cant control on keys */ + if(isset($this->backOfficeTemplateDirectories[$templateDefinition->getName()])) { + foreach($this->backOfficeTemplateDirectories[$templateDefinition->getName()] as $key => $directory) { + $this->addTemplateDir($directory, $key); + } + } + break; + + case TemplateDefinition::PDF: + break; + + default: + break; + } } public function getTemplate() diff --git a/core/lib/Thelia/Core/Template/TemplateDefinition.php b/core/lib/Thelia/Core/Template/TemplateDefinition.php index 34e6740a8..7fa05c7cb 100644 --- a/core/lib/Thelia/Core/Template/TemplateDefinition.php +++ b/core/lib/Thelia/Core/Template/TemplateDefinition.php @@ -54,14 +54,20 @@ class TemplateDefinition $this->name = $name; $this->type = $type; - if ($type == self::BACK_OFFICE) - $this->path = self::BACK_OFFICE_SUBDIR . $name; - else if ($type == self::PDF) - $this->path = self::PDF_SUBDIR . $name; - else if ($type == self::FRONT_OFFICE) - $this->path = self::FRONT_OFFICE_SUBDIR . $name; - else - $this->path = $name; + switch($type) { + case TemplateDefinition::FRONT_OFFICE: + $this->path = self::FRONT_OFFICE_SUBDIR . $name; + break; + case TemplateDefinition::BACK_OFFICE: + $this->path = self::BACK_OFFICE_SUBDIR . $name; + break; + case TemplateDefinition::PDF: + $this->path = self::PDF_SUBDIR . $name; + break; + default: + $this->path = $name; + break; + } } public function getName() diff --git a/core/lib/Thelia/Core/Template/TemplateHelper.php b/core/lib/Thelia/Core/Template/TemplateHelper.php index f1a2ec8b9..e7880c733 100644 --- a/core/lib/Thelia/Core/Template/TemplateHelper.php +++ b/core/lib/Thelia/Core/Template/TemplateHelper.php @@ -46,6 +46,9 @@ class TemplateHelper return self::$instance; } + /** + * @return TemplateDefinition + */ public function getActivePdfTemplate() { return new TemplateDefinition( ConfigQuery::read('active-pdf-template', 'default'), @@ -53,6 +56,9 @@ class TemplateHelper ); } + /** + * @return TemplateDefinition + */ public function getActiveAdminTemplate() { return new TemplateDefinition( ConfigQuery::read('active-admin-template', 'default'), @@ -60,6 +66,9 @@ class TemplateHelper ); } + /** + * @return TemplateDefinition + */ public function getActiveFrontTemplate() { return new TemplateDefinition( ConfigQuery::read('active-front-template', 'default'), diff --git a/core/lib/Thelia/Core/Thelia.php b/core/lib/Thelia/Core/Thelia.php index f4187b5a5..b48d2736f 100755 --- a/core/lib/Thelia/Core/Thelia.php +++ b/core/lib/Thelia/Core/Thelia.php @@ -45,6 +45,7 @@ use Thelia\Core\Bundle; use Thelia\Core\Event\TheliaEvents; use Thelia\Config\DatabaseConfiguration; use Thelia\Config\DefinePropel; +use Thelia\Core\Template\TemplateDefinition; use Thelia\Core\TheliaContainerBuilder; use Thelia\Core\DependencyInjection\Loader\XmlFileLoader; use Thelia\Model\ConfigQuery; @@ -126,7 +127,6 @@ class Thelia extends Kernel $modules = \Thelia\Model\ModuleQuery::getActivated(); $translationDirs = array(); - $templateDirs = array(); $parser = $container->getDefinition('thelia.parser'); foreach ($modules as $module) { @@ -151,9 +151,54 @@ class Thelia extends Kernel $translationDirs[] = $dir; } - if (is_dir($dir = THELIA_MODULE_DIR . "/" . $code . "/templates")) { - //$templateDirs[$code] = $dir; - $parser->addMethodCall('addTemplateDir', array($dir, $code)); + /* is there a front-office template directory ? */ + $frontOfficeModuleTemplateDirectory = sprintf("%s%s%stemplates%s%s", THELIA_MODULE_DIR, $code, DS, DS, TemplateDefinition::FRONT_OFFICE_SUBDIR); + if (is_dir($frontOfficeModuleTemplateDirectory)) { + try { + $moduleFrontOfficeTemplateBrowser = new \DirectoryIterator($frontOfficeModuleTemplateDirectory); + } catch (\UnexpectedValueException $e) { + throw $e; + } + + /* browse the directory */ + foreach ($moduleFrontOfficeTemplateBrowser as $moduleFrontOfficeTemplateContent) { + /* is it a directory which is not . or .. ? */ + if ($moduleFrontOfficeTemplateContent->isDir() && !$moduleFrontOfficeTemplateContent->isDot()) { + $parser->addMethodCall( + 'addFrontOfficeTemplateDirectory', + array( + $moduleFrontOfficeTemplateContent->getFilename(), + $frontOfficeModuleTemplateDirectory, + $code, + ) + ); + } + } + } + + /* is there a back-office template directory ? */ + $backOfficeModuleTemplateDirectory = sprintf("%s%s%stemplates%s%s", THELIA_MODULE_DIR, $code, DS, DS, TemplateDefinition::BACK_OFFICE_SUBDIR); + if (is_dir($backOfficeModuleTemplateDirectory)) { + try { + $moduleBackOfficeTemplateBrowser = new \DirectoryIterator($backOfficeModuleTemplateDirectory); + } catch (\UnexpectedValueException $e) { + throw $e; + } + + /* browse the directory */ + foreach ($moduleBackOfficeTemplateBrowser as $moduleBackOfficeTemplateContent) { + /* is it a directory which is not . or .. ? */ + if ($moduleBackOfficeTemplateContent->isDir() && !$moduleBackOfficeTemplateContent->isDot()) { + $parser->addMethodCall( + 'addBackOfficeTemplateDirectory', + array( + $moduleBackOfficeTemplateContent->getFilename(), + $backOfficeModuleTemplateDirectory, + $code, + ) + ); + } + } } } catch (\InvalidArgumentException $e) { // TODO: process module configuration exception diff --git a/local/modules/Colissimo/templates/admin.html b/local/modules/Colissimo/templates/backoffice/default/admin.html similarity index 100% rename from local/modules/Colissimo/templates/admin.html rename to local/modules/Colissimo/templates/backoffice/default/admin.html