Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Je démarre un nouveau projet, et pour la première fois avec ZF1.6.1.
Mon problème est que quand je suis dans default::IndexController::indexAction il me prend bien la bonne view mais pour le rendu final il utilise le layout qui est dans administration !
Est-ce possible d'avoir des layouts dans une sous arborescence des models ?
Et si oui comment obliger IndexController::indexAction du module default à prendre le layout qui est dans son arborescence ?
Ceci dit j'ai un doute sur ma déclaration des layouts dans initView du fichier initializer.php, je suis un peu largué là, merci de me mettre sur la voie.
Voila l'arborescence du projet :
+---application ¦ ¦ bootstrap.php ¦ ¦ Initializer.php ¦ ¦ ¦ +---administration ¦ ¦ +---controllers ¦ ¦ ¦ IndexController.php ¦ ¦ ¦ ¦ ¦ +---layouts ¦ ¦ ¦ main.phtml ¦ ¦ ¦ ¦ ¦ +---models ¦ ¦ +---views ¦ ¦ +---filters ¦ ¦ +---helpers ¦ ¦ +---scripts ¦ ¦ +---index ¦ ¦ index.phtml ¦ ¦ ¦ +---default ¦ ¦ user.ini ¦ ¦ ¦ +---controllers ¦ ¦ ErrorController.php ¦ ¦ IndexController.php ¦ ¦ ¦ +---helpers ¦ +---layouts ¦ ¦ main.phtml ¦ ¦ ¦ +---models ¦ +---views ¦ +---filters ¦ +---helpers ¦ +---scripts ¦ +---error ¦ ¦ error.phtml ¦ ¦ ¦ +---index ¦ index.phtml ¦ +---bin +---library ¦ translate.tmx ¦ +---public ¦ ¦ .htaccess ¦ ¦ index.php ¦ ¦ ¦ +---images ¦ +---scripts ¦ +---styles
Mon fichier initializer.php :
<?php /** * My new Zend Framework project * * @author * @version */ require_once 'Zend/Controller/Plugin/Abstract.php'; require_once 'Zend/Controller/Front.php'; require_once 'Zend/Controller/Request/Abstract.php'; require_once 'Zend/Controller/Action/HelperBroker.php'; /** * * Initializes configuration depndeing on the type of environment * (test, development, production, etc.) * * This can be used to configure environment variables, databases, * layouts, routers, helpers and more * */ class Initializer extends Zend_Controller_Plugin_Abstract { /** * @var Zend_Config */ protected static $_config; /** * @var string Current environment */ protected $_env; /** * @var Zend_Controller_Front */ protected $_front; /** * @var string Path to application root */ protected $_root; /** * Constructor * * Initialize environment, root path, and configuration. * * @param string $env * @param string|null $root * @return void */ public function __construct($env, $root = null) { $this->_setEnv($env); if (null === $root) { $root = realpath(dirname(__FILE__) . '/../'); } $this->_root = $root; $this->initPhpConfig(); $this->_front = Zend_Controller_Front::getInstance(); // set the test environment parameters if ($env == 'test') { // Enable all errors so we'll know when something goes wrong. error_reporting(E_ALL | E_STRICT); ini_set('display_startup_errors', 1); ini_set('display_errors', 1); $this->_front->throwExceptions(true); } } /** * Initialize environment * * @param string $env * @return void */ protected function _setEnv($env) { $this->_env = $env; $registry = Zend_Registry::getInstance(); $niveau = 8; $logplace = 'f:/log'; $redacteur = new Zend_Log_Writer_Stream($logplace.'/reservations.txt'); $formater = new Zend_Log_Formatter_Simple('*%idsession%* %timestamp% %priorityName% (%priority%): %message% - %uri%'.PHP_EOL); $redacteur->setFormatter($formater); $logger = new Zend_Log($redacteur); $logger->setEventItem('uri', $_SERVER['REQUEST_URI']); $logger->setEventItem('idsession', Zend_Session::getId()); $logfiltre = new Zend_Log_Filter_Priority($niveau); $logger->addFilter($logfiltre); $registry->set('logger', $logger); $logger->info('bootstrap '.Zend_Version::VERSION); } /** * Initialize Data bases * * @return void */ public function initPhpConfig() { } /** * Route startup * * @return void */ public function routeStartup(Zend_Controller_Request_Abstract $request) { $this->initDb(); $this->initHelpers(); $this->initView(); $this->initPlugins(); $this->initRoutes(); $this->initControllers(); } /** * Initialize data bases * * @return void */ public function initDb() { } /** * Initialize action helpers * * @return void */ public function initHelpers() { // register the default action helpers Zend_Controller_Action_HelperBroker::addPath('../application/default/helpers', 'Zend_Controller_Action_Helper'); } /** * Initialize view * * @return void */ public function initView() { // Bootstrap layouts $option = array(array( 'layout' => 'main', 'layoutPath' => $this->_root .'/application/default/layouts', 'contentKey' => 'content', ), 'layout' => 'main', 'layoutPath' => $this->_root .'/application/administration/layouts', 'contentKey' => 'content', ); Zend_Layout::startMvc($option); } /** * Initialize plugins * * @return void */ public function initPlugins() { } /** * Initialize routes * * @return void */ public function initRoutes() { } /** * Initialize Controller paths * * @return void */ public function initControllers() { $this->_front->addControllerDirectory($this->_root . '/application/default/controllers', 'default'); $this->_front->addControllerDirectory($this->_root . '/application/administration/controllers', 'administration'); } } ?>
et enfin indexController.php :
<?php /** * IndexController - The default controller class * * @author * @version */ require_once 'Zend/Controller/Action.php'; require_once 'Zend/Form.php'; require_once 'Zend/Translate.php'; require_once 'Zend/Validate.php'; require_once 'Zend/Validate/NotEmpty.php'; require_once 'Zend/Config/Ini.php'; class IndexController extends Zend_Controller_Action { public function getForm() { // En utilisant un fichier ini : Attention aux limites imposées. $config = new Zend_Config_Ini('../application/default/user.ini', 'element'); $form = new Zend_Form($config->user->login); /*$translate = new Zend_Translate('tmx', '../library/translate.tmx', 'fr'); $form->setDefaultTranslator($translate);*/ return $form; } /** * The default action - show the home page */ public function indexAction() { $this->view->pied = 'Pied de page'; if (!$this->getRequest()->isPost()) { $this->view->form = $this->getForm(); } else { $form = $this->getForm(); if (!$form->isValid($_POST)) { // Failed validation; redisplay form $this->view->form = $form; return; } } } }
Hors ligne
Salut,
Oui, il est possible d'avoir des layouts dans l'arbo des models.
Perso, j'ai créer un repertoire layouts dans le dossier views.
Tu peus procéder ainsi :
Dans le bootstrap tu renseigne le chemin vers ton dossier de layouts:
// setup the layout Zend_Layout::startMvc(array('layoutPath' => ROOT_DIR . '/application/views/layouts',));
Par défaut se sera le script de layout "layout.phtml" qui sera executé.
Si maintenant tu veus l'obligé à prendre un autre script de layout->
Tu renseigne le code de ton controlleur comme ceci:
public function init(){ $this->_helper->layout()->setLayout('layout2'); }
++
Hors ligne
Bonjour,
merci pour ta réponse.
En fait je n'ai pas de problème à avoir mon répertoire des layout où je le souhaite.
Mon problème est d'en avoir plusieurs, un par module (j'avais écrit model à tort), donc plusieurs répertoires de layout.
Dans le bootstrap j'ai déclaré mes répertoires de layout mais il va toujours prendre le répertoire administration :
public function initView() { // Bootstrap layouts $option = array(array( 'layout' => 'main01', 'layoutPath' => $this->_root .'/application/default/layouts', 'contentKey' => 'content', ), 'layout' => 'main02', 'layoutPath' => $this->_root .'/application/administration/layouts', 'contentKey' => 'content', ); Zend_Layout::startMvc($option); }
Et si j'utilise :
$this->_helper->layout()->setLayout('main01');
Il me dit qu'il ne le trouve pas dans le répertoire 'administration'.
Je pense que ma déclaration dans le bootstrap est mauvaise.
Hors ligne
Salut,
Je ne crois pas qu'on puisse déclarer un dossier "layout" par module à Zend_Layout.
Par contre si tu ne passes aucune option à la fonction "startMvc", il ira chercher automatiquement les layouts dans le dossier "views/scripts" du module concerné.
Par ex, si tu as une architecture modulaire du genre:
application/ config/ toto/ controllers/ models/ views/ helpers/ scripts/ auth/ error/ index/ main01.phtml main02.phtml default/ controllers/ models/ views/ helpers/ scripts/ auth/ error/ index/ main01.phtml main02.phtml library/ public/ images/ css/ js/ index.php
et que dans une action tu indiques :
$this->_helper->layout()->setLayout('main01');
Il va aller chercher automatiquement le layout 'main01.phtml' dans le dossier 'views/scripts' du module dans lequel se trouve ton action.
Attention par contre, si tu procèdes de cette manière et que tu ne précises pas le layout à utiliser, il s'attendra à trouver un 'layout.phtml' dans le dossier 'views/scripts' du module.
A+ benjamin
Dernière modification par Delprog (14-10-2008 12:35:53)
Hors ligne
Merci delprog,
en effet tu as raison, avec plusieurs modules il semble que l'on doive mettre les layout dans les répertoires script respectifs.
Ce n'est pas un problème mais cela va à l'encontre de l'arborescence créé automatiquement quand on crée un nouveau projet Zend Framework à partir de Zend Studio, qui lui crée un répertoire spécifique pour les layout.
Hors ligne
Si tu veux vraiment une arbo personnalisée, je pense que tu peux passer un plugin à ton 'frontcontroller' qui change le chemin des layouts à la volée en fonction du module en request.
A+ benjamin.
Hors ligne
Bonjour à tous,
Pour ma part et aprés avoir essayé plusieurs méthodes de rangement de mes layouts, je vais à l'encontre de ce que ZEND STUDIO crée et je met mes layouts à la racine des scripts de chaque module.
Le plus gros avantage que j'en retire , c'est de ne pas être obligé de lui dire ou ils se trouvent.
Et en définitive, ca parait assez logique de mettre les layouts un cran au-dessus des views.
C'est peut être pas une solutions qui conviendra à tous, mais elles fonctionne sans que l'on est besoin de coder la moindre la ligne.
(et moi j'aime bien quand ca fonctionne tout seul... ;-) )
Hors ligne
Pages: 1