Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour à tous.
Je travaille actuellement sur une application multi-templates (pouvoir choisir un template différent facilement).
Pour cela j'ai décidé de séparer complètement la vue des dossiers de modules.
Voilà un bref aperçu de mon arborescence :
|-- modules | `-- default | |-- controllers | `-- models | |-- templates | `-- nomdutemplate | `-- modules | `-- default
Pour pouvoir le faire, j'ai étendu la class Zend_Controller_Action comme ceci :
class My_Controller_Action extends Zend_Controller_Action { public function __construct(Zend_Controller_Request_Abstract $request, Zend_Controller_Response_Abstract $response, array $invokeArgs = array()) { $this->setRequest($request) ->setResponse($response) ->_setInvokeArgs($invokeArgs); $this->_helper = new Zend_Controller_Action_HelperBroker($this); $this->initTemplates(); $this->init(); } private function initTemplates() { $module = $this->getRequest()->getModuleName(); $themes = "base"; //Sera géré dynamiquement $this->view->setScriptPath(APPLICATION_PATH .'/templates/'.$themes.'/modules/'.$module.'/'); } }
Je voudrai savoir si c'est la meilleur méthode pour faire cela?
ou si y en a une plus optimisé?
Merci d'avance.
Dernière modification par overcrach (14-06-2010 21:34:23)
Hors ligne
Vraiment personnes ?
Hors ligne
J'ai réfléchi et je pense qu'il serait mieux de passer par un plugin, il me servira en même temps a déclenché des actions qui me servent à définir mes différents menus.
Maintenant le problème c'est comment récupéré la vue dans un plugin afin de définir le chemin (setScriptPath) ?
Hors ligne
Bonjour,
J'ai une approche un peu bovine, mais qui marche bien :
Je crée une classe qui étends Zend_View, je surcharge la méthode addBasePath de Zend_View.
Ensuite quand le site veut ajouter un répertoire de vue, il ajoute automatiquement le répertoire par défaut (défini par le ViewRenderer ou le Zend_Layout) et le répertoire de template.
Comme ça soit ton fichier de vue existe dans ton thème et il prend celui là, soit il n'existe pas et il se rabat sur ton .phtml par défaut (qui est dans le répertoire standard ZF).
Note si tu utilises Zend_Layout et Zend_Application, dans ton application.ini, il faut utiliser
resources.layout.viewBasePath = APPLICATION_PATH "/layouts" (et non layoutPath qui n'utilise pas la fonction addBasePath de Zend_View...)
class Kitpages_Builder_View extends Zend_View { protected $_modulePath = null; protected $_layoutPath = null; protected $_themePath = null; protected $_themeName = null; public function setModulePath($path) { $path = rtrim($path, '/'); $path = rtrim($path, '\\'); $this->_modulePath = $path; } public function setLayoutPath($path) { $this->_layoutPath = $path; } public function setThemePath($path) { $path = rtrim($path, '/'); $path = rtrim($path, '\\'); $this->_themePath = $path; } public function setThemeName($themeName) { $this->_themeName = $themeName; } public function addBasePath($path, $classPrefix = 'Zend_View') { $path = rtrim($path, '/'); $path = rtrim($path, '\\'); $newPath = str_replace( $this->_layoutPath, $this->_themePath."/".$this->_themeName."/layouts", $path ); $newPath = str_replace( $this->_modulePath, $this->_themePath."/".$this->_themeName."/modules", $newPath ); $newPath = preg_replace("|/views$|", '', $newPath); parent::addBasePath($path, $classPrefix); parent::addBasePath($newPath, $classPrefix); return $this; } }
A+, Philippe
Hors ligne
Je te remercie, je vais m'inspirer de ta classe.
J'ai une question bête : comment tu déclare dans ton application que tu utilise Kitpages_Builder_View plutôt que Zend_view ?
Hors ligne