Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
Je débute avec ZF mais j'avance à grands pas.
J'ai une page avec 2 colonnes (menu + contenu) et pour un certain contrôleur je voudrais ajouter au début de mon menu un calendrier qui est contenu dans un phtml à part.
Pour toutes les actions de tous les contrôleurs, je n'affiche pas le calendrier sauf pour 2 actions d'un contrôleur.
En gros dans individuelleAction de StatistiquesController je voudrais que app/views/scripts/statistiques/calendar.phtml s'affiche dans la colonne de menu du layout app/layouts/scripts/layout.phtml et app/views/scripts/statistiques/individuelle.phtml dans la colonne contenu du même layout.
pour individuelle.phtml pas de problème il s'affiche grâce à $this->layout()->content; mais je ne trouve pas comment ajouter calendar.phtml
D'avance merci,
Devether
Hors ligne
Salut,
C'est dans la vue qu'il faudrait invoquer le rendu de ton phtml.
Essai avec un:
<?php echo $this->render('calendar.phtml'); ?>
A+ benjamin.
Hors ligne
En fait la vue est contenue dans la colonne de gauche (le contenu).
Mon calendrier doit apparaitre dans la colonne de droite (le menu) qui est contenue par le layout.
Si j'applique ce que tu dis mon calendar.phtml apparaitra dans la colonne de contenu et pas dan le menu.
J'ai bien penser faire un render('calendar.phtml') dans le layout mais comme il ne doit apparaitre que dans certaines actions...
Hors ligne
De mon côté, considérant ça comme un paramètre, j'aurais tendance à le sortir du code, dans un fichier .ini de paramètres, exemple :
[calendar] action1 action2
(un peu au hasard ça, mais dans l'idée)
Et ensuite passer par le registre pour tester la présence de l'action dans la section calendar et rendre ou non calendar.phtml.
Autre solution, si tu as déjà dérivé Zend_Controller_Action pour faire un controller commun à tous les autres, tu peux y ajouter une variable globale, par défaut à false (si c'est le cas le plus fréquent), que tu passes à la vue en postDispatch() par ex.
Dans les actions concernées tu passes la variable à true, et dans ta vue tu fais le test pour afficher ou non ton partial.
Après il existe peut-être des solutions avec les partial et les placeHolder, mais je ne sais pas te répondre directement avec ces outils, je t'invite à lire la doc à ce sujet.
A+ benjamin.
Hors ligne
J'ai pas tout compris mais je vais regarder ça.
Merci
Hors ligne
Bon j'ai trouvé un moyen de le faire en ajoutant un segment au Zend_Layout.
Comme le calendrier est commun à tous les contrôleurs, j'ai placé le calendar.phtml dans app/views/scripts/communs/
dans mon layout.html
<table width="100%" cellspacing="0" cellpadding="0" border="0"> <tr> <td class="sidebar"> <?php echo $this->layout()->sidebar; ?> </td> <td class="content"> <?php echo $this->layout()->content; ?> </td> </tr> </table>
et dans StatistiquesController.php
<?php class StatistiquesController extends Zend_Controller_Action { ... public function individuelleAction() { ... if ($condition) { $this->getResponse()->insert('sidebar', $this->view->render('communs/calendar.phtml')); } ... } ... }
En plus on peut mettre autre chose dans la sidebar en fonction de la condition.
Si le calendrier doit s'afficher pour toutes les actions du contrôleur, il suffit juste de placer le insert() dans le init() du contrôleur.
Et voila!!
Merci pour ton aide Delprog.
Hors ligne
est ce qu'un layout doit toujours etre associé à une vue propre à lui meme ?
Hors ligne
gné ???
un layout est associé un rien du tout.
Un layout c'est un "container".
Si tu parles de vue et d'action, et non pas de layout, la réponse est non.
Le viewrenderer fait l'association par soucis de "simplicité" pour le codeur. Rien ne t'empêche de faire render('youpi/toto.phtml') dans l'action "zarmaAction()"
Dernière modification par nORKy (14-04-2009 14:46:38)
Hors ligne
voila mon layout principal ou
Code:
<div id="nav"> <?php echo $this->layout()->nav; ?> </div> --- <?php echo $this->layout()->content; ?>
mon fichier "nav.phtml" se trouve dans layouts/nav.phtml avec layout.phtml
dans mon "controllers/IndexController.php"
j'ai
Code:
public function init() { $response = $this->getResponse(); $response->insert('nav', $this->view->render('index/nav.phtml')); mais je voudrais qu il fasse reference au fichier "layouts/nav.phtml" la ca m oblige à le mettre dans "views/scripts/index" ok admettons que j'ai pas le choix } et la fonction function lirechapitreAction() { $models = new albums(); $this->view->albums = $albums->fetchall(); }
mon fichier "layout.php" affiche le content de mon IndexController avec les resultats de ma table albums
cool c'est bien ce que je veux
maitnenant je voudrais faire la meme chose avec nav.phtml qui accede aussi une autre table de la meme maniere que layout.phtml qui est appeler via scripts/index/index.phtml
mais je veux que le contenu de ma table "nav" s'affiche partout c'est mon menu d une table sql ...
je suis paumé
j'ai pourtant mis dans models un fichier "albums.php" et un autre "nav.php"
albums.php
Code:
class Albums extends Zend_Db_Table_Abstract { protected $_name = 'albums' } et class Pages extends Zend_Db_Table_Abstract { protected $_name = 'pages' }
et 2 fichiers "controllers/INdexController.php" et "controllers/NavController.php"
navcontroller.php
Code:
class NavController extends Zend_Controller_Action { function navAction() { $this->view->titre = "test"; } }
ca ne marche pas ...
j'ai toujours la variable titre de mon "indexcontroller" et pas celui de mon "navcontroller"
Dernière modification par forevermoon (14-04-2009 15:13:37)
Hors ligne
hello
encore moi
bon je crois que j'ai réussi avec actionstack
mais j'ai le contenu de nav.phtml dans
le content aussi ...
Hors ligne
controllers/IndexController.php
class IndexController extends Zend_Controller_Action { public function init() { $this->view->titre = "chapitres"; $this->view->num = (int)$this->_request->getParam('num', 0); $chapitres = new chapitres(); $this->view->chapitres = $chapitres->menuChapitre(); $this->_helper->actionStack->actionToStack('nav','nav'); }
et controllers/NavController.php
class NavController extends Zend_Controller_Action { function navAction() { $this->view->Titre = "nav titre2 ..."; $pages = new pages(); $this->view->pages = $pages->menuPage(); } }
et dans mon "layouts/layout.phtml"
<?ph p echo $this->render('nav/nav.phtml'); ?> <?php echo $this->layout()->content; ?>
j'ai 2 fois le contenu de nav.php qui s'affiche ...
une idée ?
Hors ligne
ce ne serais pas plutôt, de cette façon ?
<?php echo $this->layout()->nav; ?> <?php echo $this->layout()->content; ?>
car en faisant un render tu appel à nouveau le script qui contient la génération de la navigation.
a+
Hors ligne
apparement en rendant le segment dans le nav controller c'est mieux
<?php class NavController extends Zend_Controller_Action { function navAction() { $this->view->Titre = "nav titre1 ..."; $this -> _helper -> viewRenderer -> setResponseSegment( 'nav' ); //$pages = new pages(); //$this->view->pages = $pages->menuPage(); //$this->view->pages = $pages->menuChapitreSelect(); $chapitres = new chapitres(); $this->view->chapitres = $chapitres->menuChapitreSelect(); } }
Hors ligne
Pages: 1