Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Je débute avec le Zend Framework. J'ai commencé à suivre les différents tutoriaux présents sur le site développez.com. Mon problème est le suivant : je souhaite créer un template pour chaque module présent sur mon site. Actuellement, j'ai seulement un module admin (pour l'administration du site) et default (pour le site) mais je ne sais pas comment creer un template different a l'aide du composant Zend_Layout. Voici un morceau de mon index.php :
$frontController = Zend_Controller_Front::getInstance(); $frontController->setRouter($router); $frontController->setControllerDirectory(array( 'default' => ROOT_DIR .'/zend_layout/app/default/controllers', 'admin' => ROOT_DIR .'/zend_layout/app/admin/controllers' )); $frontController->setRequest(new Zend_Controller_Request_Http()); $frontController->throwExceptions(true); Zend_Layout::startMvc(array( 'layoutPath' => ROOT_DIR .'/zend_layout/app/default/views/layouts/', 'layout' => 'template' ) );
Quelqu'un aurait t-il une solution ? Merci
Dernière modification par mip (24-01-2008 01:08:26)
Hors ligne
normalement, si tu ne spécifie pas le 'layoutPath', le comportement par default du Zend_Layout est celui que tu décris.
il suffit de mettre le fichier template.phtml dans pathVersTonModule/views/scripts/
donc dans ton server tu auras un truc du genre
/zend_layout/app/admin/views/scripts/template.phtml
/zend_layout/app/default/views/scripts/template.phtml
Hors ligne
Merci beaucoup pour ta reponse nemesisTHEone. Effectivement ta solution fonctionne bien mais est t-il possible de specifier un autre chemin tel que :
/zend_layout/app/admin/views/un_autre_repertoire/template.html
/zend_layout/app/default/views/un_autre_repertoire/template.html
Hors ligne
As tu essayer de fournir un tableau à clé pour le layout path?
Zend_Layout::startMvc(array( 'layoutPath' => array( 'default' => ROOT_DIR .'/zend_layout/app/default/views/monrep/', 'module1'=> ROOT_DIR .'/zend_layout/app/module1/views/monrep/' ), 'layout' => 'template'));
Je ne sais pas si ça marche mais ça coute rien d'essayer
)
);
Hors ligne
Oui j'ai deja essayé de faire comme ca mais la propriété $_layoutPath de la classe Layout accepte seulement une chaine de caractere
class Zend_Layout { .... /** * Layout view script path * @var string */ protected $_layoutPath; .... }
Hors ligne
Et hop un petit code pour faire ça! (ça marche pour moi)
Utilisation: simple pour le cas des modules
$frontController->registerPlugin(new Rx_Controller_Plugin_LayoutFromRoute());
Exemple pour un layout par controller (on sait jamais hein?)
$frontController->registerPlugin(new Rx_Controller_Plugin_LayoutFromRoute(array('pieceOfRoute'=>'controller'));
On peux remplacer controller par action mais bon la je doute que ça serve beaucoup
Si vous avez un bug, je vous remercie de m'en prevenir! (mon mail est juste à côté)
<?php /** * Rewix extension for Zend Framework * * LICENSE * * This source file is subject to the new BSD license that is bundled * with this package in the file LICENSE.txt. * It is also available through the world-wide-web at this URL: * http://www.rewix.com/license/new-bsd * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to contact@rewix.com so we can send you a copy immediately. * * @category Rx * @package Rx_Controller_Plugin * @copyright Copyright (c) 2007 Rewix (http://www.rewix.com) * @license http://www.rewix.com/license/new-bsd New BSD License */ require_once 'Zend/Controller/Plugin/Abstract.php'; /** * Rx_Controller_Plugin_LayoutFromRoute * It's a plugin for set the layout from the module name * * @category Rx * @package Rx_Controller_Plugin * @copyright Copyright (c) 2007 Rewix (http://www.rewix.com) * @license http://www.rewix.com/license/new-bsd New BSD License */ class Rx_Controller_Plugin_LayoutFromRoute extends Zend_Controller_Plugin_Abstract { /** * Partie de la route devant être prise du sous domaine... * * @var String */ private $_pieceOfRoute; public function __construct(array $options = array('pieceOfRoute'=>'module')) { extract($options); $this->_pieceOfRoute = $pieceOfRoute; } public function routeShutdown(Zend_Controller_Request_Abstract $request) { switch($this->_pieceOfRoute) { case 'module': case 'controller': case 'action': $fnNameEnd = ucfirst($this->_pieceOfRoute).'Name'; $fnGet = 'get'.$fnNameEnd; $name = $request->$fnGet(); break; //TODO? //case 'param': //$name = $request->getParam(); //break; default: $name = 'default'; } $layout = Zend_Layout::getMvcInstance(); $path = $layout->getLayoutPath(); $suffix = $layout->getViewSuffix(); if (file_exists($path.'/'.$name.'.'.$suffix)) { $layout->setLayout($name); } if ($name=='default') $name = 'www'; //A voir... $layout->assign('moduleName', $name); } }
Dernière modification par Mr.MoOx (11-04-2008 12:13:35)
Hors ligne
bien vu
Je cherche dans le même genre mais avec réorganisation de la structure :
app
--module
--controllers
--views
--layouts
le problème c'est qu'on est obligé de faire un
dirname(Zend_Controller_Front::getInstance()->getControllerDirectory())
pour pouvoir récupérer le repertoire du module (le repertoire views est determiné de la même manière apparement).
Je trouve pas ça très clean, aucun moyen de prendre directement le path du module.
j'as pensé à un truck du style (pour reprendre ta classe):
class X_Controller_Plugin_LayoutPathFromModule extends Zend_Controller_Plugin_Abstract { private $_layoutDir; public function __construct(array $options = array('layoutDir'=>'layouts')) { extract($options); $this->_layoutDir = $layoutDir; } public function routeShutdown(Zend_Controller_Request_Abstract $request) { $dir = Zend_Controller_Front::getInstance()->getControllerDirectory($request->getModuleName()); $dir = dirname($dir).'/'.$this->_layoutDir; Zend_Layout::getMvcInstance()->setLayoutPath($dir); } }
ça marche mais (au dela du fait que ça me semble pas clean) j'aurais aussi aimer mettre le path layouts dans le répertoire views/.
J'ai pas encore regarder de quoi dépend le path du répertoire views.
est-il toujours au même niveau que controller/ ?
Hors ligne
il est possible de spécifier tout cela avec Zend_Config.
j'utilise le fichier config(ini) suivant:
[layout] ; Zend_Config layoutPath = "layouts/Orange" layout = "layout" ;mvcSuccessfulActionOnly = true ;contentKey = "CONTENT"
bootstrap (index.php):
$CONFIG = new Zend_Config_Ini(CONFIG_PATH.MAIN_CONFIG_FILE, null); Zend_Layout::startMvc($CONFIG->layout);
j'utilise cette arbo:
j'en profite pour poser une question, est il possible de changer de layout en fonction de l'action ou l'on se trouve ?
Hors ligne
Pages: 1