Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
je m'excuse du manque de précision de cette question,
mais est ce que quelque chose peut empêcher le passage
de variables entre un contrôleur et une vue ?
Controleur :
public function postDispatch() { $actionName = $this->getRequest()->getActionName(); $this->render('menu', 'left'); $this->render($actionName, 'right'); } public function indexAction() { $this->view->mon_message = "Du blabla ..."; } public function menuAction() { $this->view->message = 'Un autre blabla'; }
Layout :
<?php echo $this->layout()->left ?>
Curieusement le message de l'action index est correctement affiché
mais pas celui du menu.
D'avance merci d'aider un débutant troublé par ce comportement :-(
Dernière modification par deviltaz (16-09-2008 08:19:20)
Hors ligne
Nouvel élément surprenant, j'utilise une fonction init dans mon controleur :
public function init() { $this->view->user = Zend_Auth::getInstance()->getIdentity(); }
La variable user est bien accessible à ma vue en revanche.
Je m'y perds :?
Hors ligne
Un doute affreux me traverse l'esprit après avoir épluché la doc.
L'appel de la fonction $this->render( ... ) provoque l'affichage de la vue
mais j'ai l'impression que l'action n'est pas pour autant éxécutée.
Ainsi les assignements de variables précisées dans les actions n'aboutissent pas.
Finalement, je ne suis pas certain que l'utilisation de cette fonction render
ne soit l'idéal pour palier à mon souci de layout. (voir ce thread )
Hors ligne
L'action demandé est index.
D'après ton code :
- Execution de indexAction
- Execution de postDispatch
-- Rendu de la vue menu avec le nom 'left'
-- Rendu de la vue $actionName avec le nom 'right'
Comme tu le vois, je n'ai pas marqué 'execution de l'action menuAction()
Render en fait que rendre des vues basé sur l'action courante (je paraphrase la doc), et l'action courante, c'est 'index'.
Donc, tu l'as bien compris toi même, une action n'est appelé par Render
Hors ligne
Ca va alors, j'avais bien compris la doc ;-)
Bon, comme solution à mon problème de layout,
render n'est donc pas la solution idéale.
Je vais me pencher sur la notion d'actionStack.
Hors ligne
Salut,
Peut tu preciser l'arborescence de tes dossiers (au moins pour les controllers et les vues).
Je pense que ton probleme vien de la.
@ bientot
Hors ligne
En fait, j'essaie d'implémenter au mieux mon layout.
Je souhaite un header, une barre de navigation et un footer communs
à l'ensemble du site.
Là où ça se complique pour moi, c'est pour le contenu dynamique.
Celui-ci serait pour mon cas divisé en deux parties :
un menu qui serait géré par une action de chaque contrôleur
et le contenu en lui-même.
Le souci est surtout pour le menu.
J'ignore au niveau du layout quel menu afficher,
l'utilisation de action() me parait donc impossible.
Du côté des actionStack je suppose que ça pourrait fonctionner
à condition d'injecter l'action menu du contrôleur appelé par la requête.
C'est pour l'instant la piste que j'essaie de suivre.
En réponse à cotre question, voici à quoi ressemble mon arborescence :
mon_appli /application /controllers IndexController.php indexAction navAction headerAction footerAction menuAction AuthController.php indexAction loginAction logoutAction menuAction CompoundController.php indexAction menuAction /models /views /layouts /scripts /index index.phtml nav.phtml header.phtml footer.phtml menu.phtml /auth login.phtml menu.phtml /compound index.phtml menu.phtml /db /library /web_root
D'avance merci si vous avez des conseils pouvant m'aider.
Dernière modification par deviltaz (15-09-2008 07:39:14)
Hors ligne
deviltaz, tu n'es pas assez imaginatif.
Pense à tous les composants que t'offre le Zf.
- Tu peux initialiser les composants ou tu veux
- Tu peux greffer du code n'import ou dans le processus d'execution du framework
Par exemple, tu peux utiliser un plugin qui initialise des valeurs dans ta vue qui corresponds aux actions demandé :
public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request) { $viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer'); $viewRenderer->init(); $view = $viewRenderer->view; $view->module = $request->getModuleName(); $view->controller = $request->getControllerName(); $view->action = $request->getActionName(); }
Ainsi, dans ton layout, tu peux maintenant appelé action comme tu le veux (action->($this->crion))
Ce n'est qu'un exemple, réfléchi et trouve ce qui te convient le mieux
Rien n'est impossible
Dernière modification par nORKy (15-09-2008 09:36:59)
Hors ligne
Ton problème bien qu’intéressant n’est pas, à mon sens, décrit de manière assez précise (peut-être n’est ce pas très clair pour toi même ), en tout cas pour la partie variable de ton layout. Donc il serait bon à mon avis que tu formules, d’une part l’objectif de ton site et d’autre part les cas d’utilisation qui vont amener à faire varier certains éléments de ton layout .
Pour ma part j’ai l’impression qu’au départ tu as une action utilisateur sur ton menu principal et que celle-ci aboutit (outre la partie fixe du layout) à l’affichage d’un certain contenu et sur une sorte de menu contextuel . Mais je ne suis pas sur que ce soit cela et même si c’est celà ,ça reste vague il faut aller plus loin dans ton analyse.
D’autre part je suis curieux de savoir ce qui se cache au moins fonctionnellement derrière ce « CompoundController.php ».
ZF est une excellente boîte à outils mais il faut reconnaître que pour certains composants qui sont déjà difficiles à comprendre, comme c’est le cas du Zend_Layout , il manque cruellement de démarche standard entre un problème type et sa solution ( mais peut-être n’y en a-t-il pas dans le cas du Zend_Layout par ex pour savoir si on doit utiliser ActionStack ou action view helper).
Indépendamment de celà je ne vois pas très bien non plus de cas d’utilisation du plugin de nOrky.
Hors ligne
Merci de ces réponses, c'est toujours encourageant d'avoir des réponses ;-)
Suite à votre demande, je vais vous préciser les objectifs du site en question.
J'étais passé rapidement là-dessus pour que la lecture du post ne soit pas trop fastidieuse
mais ça doit être nécessaire pour avoir une bonne compréhension de mon souci.
Le site sera utilisé exclusivement en intra et son but premier est une gestion de formulations.
Vous pouvez imaginer cela comme une liste de recettes de cuisine.
J'ai deux accès possibles que j'ai baptisé 'visu' et 'admin' qui me permettent de distinguer
des utilisateurs qui pourront seulement visualiser les recettes et d'autres qui auront des
responsabilités d'ajout, édition et suppression de recettes.
C'est cette gestion de recettes qui est baptisée 'Compound'.
A côté de cela, il existera une fonction de traçabilité des réalisations de chacune de ces recettes.
Il s'agit là d'un autre volet de l'application, soit pour moi un autre contrôleur dans ce que j'ai compris de MVC.
D'un point de vue fonctionnel, c'est une gestion de d'enregistrements de bdr sans souci majeur.
Là où je patauge, c'est davantage du côté du découpage du site étant novice en la matière.
J'imaginais un header, footer et une navigation fixe et en plus de cela un menu associé à chaque section de l'appli.
Je parviens en utilisant la fonction render à afficher du code html et ainsi afficher mon menu
mais sans appeler d'action spécifique pour le menu ce qui rend l'utilisation de variables impossible.
Voilà, j'ai essayé de synthétiser l'analyse de mes besoins au mieux, merci à ceux qui ont lu jusqu'ici ;-)
--> nORKy
JE vois à peu près le concept de ton plugin (du moins je crois)
mais mon souci serait plutôt d'appeler une action menu dans le layout
correspondant à l'action menu du contrôleur appelé dans la requête.
Et là je vois pas comment faire le lien.
Dernière modification par deviltaz (15-09-2008 11:19:39)
Hors ligne
Je te l'ai dit deviltaz, y'a toujours une solution
Il me semble que lorsque tu apelles action(), tu peux passé les valeurs null à controller et module pour indiquer d'utiliser les valeurs courantes. C'est ce que tu veux,non ?
Autre solution :
Regarde dans mon plugin plus haut comment j'ai obtenu le nom de l'action et du controller.
Tu as tout sous la main !
Rajoute une action dans l'actionStack avec 'action' qui vaut 'menu' et 'controller' qui vaut $controller
Dans ton layout, tu utilises les segments pour récupérer la vue de ton menu
Dernière modification par nORKy (15-09-2008 15:33:57)
Hors ligne
Merci de ces encouragements, l'essentiel est qu'il y ait toujours une solution ;-)
J'ai essayé d'appeler action() en mettant null en guise de controller mais ça ne semble pas faire ce que je souhaite.
Apparemment, dans ce cas c'est mon contrôleur Index qui serait utilisé.
Dommage, ce mode avait l'avantage de rester simple.
Deuxième solution proposée, le plugin actionStack dont j'ai du mal à m'imprégner.
Je vais faire des essais dans cette voie et relire le tuto de Julien Pauli,
il me semble qu'il utilise l'actionStack.
Hors ligne
Je m’aperçois que ma réponse très longue vient après celle de nORky qui est bcp plus compétent que moi mais bon je l’envois quand même au cas où ça pourrait t’intéresser (ou d’autres).
Tout d’abord on peut se tutoyer :je suis sur le même genre de pbmes avec peut-être un peu d’avance sur
certaines choses mais encore beaucoup d’interrogations que je n’ai peut-être pas d’ailleurs suffisamment fait
partager sur ce forum (jusqu’à maintenant).
Il y a des choses qui me paraissent encore floues dans ton projet :
-Ta distinction admin et visu pour distinguer ceux qui vont créer les recettes et ceux qui vont les voir.
Pour la distinction d’accord mais plutôt que les termes choisis, si je peux me permettre, je dirais plutôt inscrits , visiteurs et pour la gestion du site (modérateur et webmaster par ex) qu’il faut tjs prévoir à mon avis : admin.
A mon avis à ces 3 types d’acteurs peuvent correspondre 2 ou 3 modules selon qu’on distingue inscrits et
visiteurs .
1)-La structure du fichier layout qui décrit la mise en page ( ce layout contient–il 1 ou 2 menus ?)
avec un seul menu et en se limitant au <body> tu pourrais avoir qqc de classique comme :
<div id="header">
<?php echo $this->layout()->header ?>
</div>
<div id="menu">
<?php echo $this->layout()->menu ?>
</div>
<div id=”content”>
<?php echo $this->layout()->content ?>
</div>
<div id="footer">
<?php echo $this->layout()->header ?>
</div>
rem : l’utilisation d’expression telle que $this->layout()->header plutôt que $this->(‘header.phtml’) va permettre de faire évoluer le contenu du segment header sans toucher à ce fichier layout qui étant sensible ne doit pas être trop modifié.
Concernant ActionStack et les segments il y a des bons tutos sur le sujet connexe du layout comme celui de Julien Pauli :
http://julien-pauli.developpez.com/tuto … nd-layout/ ainsi que : http://www.kitpages.fr/zf_helper_plugin.php ).
-Concernant les segments je dirais simplement qu’en dehors du segment très particulier « content » les autres peuvent nécessiter de faire appel à ActionStack pour demander à une action d’insérer un segment dans l’objet réponse. Il est également possible d’insérer un segment dans l’objet réponse à d’autres endroits : au niveau du bootstrap, dans l’action appelée par l’url, dans la fonction init()du controlleur appellé etc..
-Concernant ActionStack je ne résiste pas à dire ce que j’ai compris du mécanisme car cela n’a pas été sans peine et comme il est possible que je me trompe celà m'intéresse qu'on me le dise (quoique ce ne soit peut être pas très bien de squatter ce thread pour ça) : l'ActionStack est un mécanisme qui permet de simuler une requête à une action mais au lieu de passer par une url on peut partir d’une autre action ou du bootstrap. Il utilise le fait que pour une même requête le dispatcheur peut appeler à l’intèrieur d’une boucle plusieurs actions .
-Tout d’abord on inscrit sa demande d’appel via un action helper
-Lorsque le dispatcheur atteint l’état postdispatch suivant le plugin met la demande d’appel dans la pile des requêtes du dispatcheur
-Au pas suivant de la boucle de dispatching l’action qu’on a demandée est appellée (là j’ai un doute et j’invite nORky ou d’autres à corriger si nécessaire) .
2)-la structure contenu dans le ou les fichiers qui vont alimenter le segment content :
le « sous-menu » en fait-il partie ou bien est ce une variable du layout.
3)-et finalement quel est le contenu de ce « sous menu » (distinction des recettes par pays, par nature : entrée, soupes , plat principal, dessert) et surtout est ce qu’il dépend et comment de l’action rendue dans le segment content.
Excuse moi si je rentre un peu trop dans les détails de ton projet mais mon expérience personnelle de dvpt sur un site de e-commerce me dis qu’on ne se pose pas tjs toutes les questions qu’il faudrait.
Hors ligne
Votre persévérance a fini par payer !
L'étude approfondie du schéma de la séquence globale proposé sur kitPages m'a été d'un grand secours.
Malgré mes lectures, le rôle des plugins, helpers, viewHelpers n'était toujours pas clair pour moi
et le processus MVC l'était encore moins.
Je pense avoir compris un peu mieux les rudiments ce qui m'a permis de m'en sortir.
Pour les curieux, j'utilise donc un plugin dans lequel j'ai personnalisé la fonction dispatchLoopStartup.
Dans cette fonction, j'utilise l'actionStack pour y ajouter un appel à l'action menu du contrôleur appelé par la requête.
C'est pourtant ce qui m'a été conseillé assez tôt dans le thread mais je ne l'avais pas saisi.
Pour les conseils sur l'analyse de mon site :
En effet, l'utilisation d'un rôle admin me sera utile par la suite et la notion d'invité est plus juste.
Je vais donc revoir mes définitions d'acl en ce sens.
Encore une fois, merci de votre patience.
Pour ma part, je poursuis mon ascension vers une meilleure maitrise de zf
et ceci en très grande partie grâce à la communauté
Dernière modification par deviltaz (16-09-2008 08:23:24)
Hors ligne
Pages: 1