Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour à tous,
J'ai fait l'acquisition ce week end du livre Zend Framework de Julien Pauli afin d'apprendre et progresser avec Zend.
J'en profite donc pour m'appuyer sur l'ouvrage afin "d'améliorer" mon code et de bien comprendre ce qu'il se passe à chaque ligne,
Cependant quelque chose reste flou :
Jusqu'à présent, mes pages étaient divisées en plusieurs parties, et j'utilisais actionStack pour rendre chaque partie :
$actionStack = Zend_Controller_Action_HelperBroker::getStaticHelper('actionStack'); $actionStack->actionToStack('footer','index'); $actionStack->actionToStack('menu','menu'); $actionStack->actionToStack('header','index');
Dans le livre, page 88, le chapitre sur Zend_Layout est abordé.
Il est expliqué comment structurer le fichier menu seulement il n'est pas expliqué comment est rendue la vue
Ainsi, comment faut il spécifier un truc du genre :
"pour toutes les pages, c'est toi l'unique controlleur MenuControlleur qui appellera ta methode menuAction()" ?
Dans le livre il est simplement écrit :
$this->layout()->menu;
Merci.
Ps :en fait dans le livre, il est ecri que la méthode Init() de ReservationController contient tout le "matériel" de génération du menu, sauf que cette methode sera executée si on appelle le controlleur Réservation, pas si on appelle un autre controlleur. Or, il faut que le menu soit généré peut importe la page...
Merci encore
Dernière modification par gostbuster (24-03-2009 10:08:31)
Hors ligne
Après, c'est un peu de la logique j'ai envie de dire.
Soit tu te bases sur la POO, tu fais un contrôleur qui définit la méthode init() pour tout le monde. Puis, tes contrôleurs héritent du contrôleur dont je parle précédemment. Le fait que le nom d'une classe contrôleur dans un projet modulaire ne respecte pas la convention Zend pose un soucis avec l'autoload. L'une des solutions est de faire un Zend_Loader:loadClass() mais c'est un peu dommage ^^
Soit tu te bases sur l'architecture Zend, tu as besoin d'une action commune à plusieurs contrôleurs. Cela signifie utiliser une aide d'action. Tu appelles cette aide d'action dans chaque méthode init() de contrôleur où tu as besoin de ton menu.
Voilà
Hors ligne
Bonjour et merci pour ces informations, en effet si je me base sur l'architecture Zend, cela signifie que dans chaque controlleur, je vais devoir spécifier une ligne pour mon menu (communs à tous).
Je trouve cela bizarre puisque je pensais que le but de Zend était "don't repeat yourself", or ici ce serait le cas, non ?
Hors ligne
class ControllerAction extends Zend_Controller_Action { public function init() { //... ton init commun $this->myInit(); } // a surcharger dans les classes filles public function myInit() {} } class MonController1 extends ControllerAction { public function myInit() { ///... inint propre au controller si besoin } public function trucBiduleAction() { //.. } }
Ca t'inspire ça ?
Hors ligne
Absolument, je pense que ca va m'inspirer.
Merci
Hors ligne
bonjour question bete:
MonController1 prend la priorité dans toute l'application ?
Hors ligne
gostbuster a écrit:
Bonjour et merci pour ces informations, en effet si je me base sur l'architecture Zend, cela signifie que dans chaque controlleur, je vais devoir spécifier une ligne pour mon menu (communs à tous).
Je trouve cela bizarre puisque je pensais que le but de Zend était "don't repeat yourself", or ici ce serait le cas, non ?
Bonjour,
Dans mon application (en cours de refonte ZF1.0 => ZF1.8), j'ai également un menu qui doit s'afficher dans toutes les pages de mon application.
Je me suis orienté vers la création d'un plugin au niveau "controller".
Dans sa fonction "postDispatch", je génère le HTML du menu et je l'injecte dans la "réponse" via un "this->getResponse()->append('menu', $html);
Comme j'utilise Zend_Layout, il me suffit ensuite dans le fichier "layout.phtml" de restituer ce code html via un simple "echo $this->layout()->menu"
Du coup, je n'ai plus rien à coder dans les controlleurs, ni ailleurs !
Pour l'instant j'ai juste prototypé la solution.
Ca fonctionne correctement et je n'ai pas encore vu de risques ou d'inconvénients particuliers.
Cordialement
Philippe
PS : j'avais également testé la solution "actionstack" comme indiqué dans le 1er message et ça fonctionnait bien aussi. Par contre je n'ai pas compris la question "comment est rendue la vue" ? A priori elle est rendue comme pour action "classique". Donc dans l'exemple en question, l'action "menu" du controlleur "menu" doit construire le menu et il sera rendu automatique par "menu.phtml". Et comme "menu/menu" est dans la pile, il sera appelé systématiquement pour chaque action de l'application.
Dernière modification par pronorama (11-05-2009 22:21:33)
Hors ligne