Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Bonjour à tous,
Je commence à découvrir Zend Framework, et j'avais donc une petite question sur ces trois méthodes. J'ai bien sûr déjà regarder la doc de Zend, les forums, tutos, etc...
En fait, j'ai mon application que j'ai réalisé grâce à un tuto français sur le framework 1.8. Tout fonctionne, sauf que je ne comprends pas bien quelle est la différence entre ces trois méthodes. Je voudrais tout simplement découper ma page html avec un header.phtml et footer.phtml dans mon layout.phtml.
Dans le tutotiel, la personne réalise cette méthode dans le layout.phtml : $this->layout()->header. D'accord, mais ça ne marche pas chez moi.
En allant regarder plusieurs forum, certaines personnes utilisent cette méthode : $this->partial('header.phtml'). Ceci fonctionne très bien.
D'autres utilisent : $this->render('header.phtml').
Mes questions sont donc : quelle est la différence entre ces trois méthodes ? Et pourquoi la méthode avec le layout ne fonctionne pas ?
Voici le code de mon fichier layout.phtml :
<?php echo $this->partial('header.phtml') ?> <body> <div id="container"> <?php echo $this->layout()->content ?> </div> <?php echo $this->layout()->footer ?>
Mes trois fichiers sont dans un dossier layouts. Le header fonctionne avec la méthode partial, le footer ne fonctionne pas.
Merci d'avance pour vos réponses.
Hors ligne
$this->layout()->header => signifie de récupérer le code générer dans le segment nommé "header (donc, explicitement configurer dans le code)
$this->partial('header.phtml') => fait un rendu du fichier header.phtml ($this => Zend_View)
$this->render('header') => fait un rendu du fichier header.phtml ($this => Zend_Controller_Action) et permet de bloquer "le choix auto" de viewRenderer
Pour le dernier point :
le suffitx .phtml ne doit pas être en place
Si le viewRenderer est activé, le résultat sera place dans le segment "content"
Si le deuxième paramètre facultatif est préciser, il sera placé dans le segment de cet argument (et ainsi, on utilise le 1er point pour récupérer le code générer)
Si le viewrenderer est désactivé, le rendu est fait via la fonction $reponse->appendBody
Hors ligne
Merci bien pour cette réponse.
En fait, pour faire afficher mon footer avec le layout ($this->layout()->footer). J'ai du ajouter ce bout de code dans mon IndexController :
function init() { $response = $this->getResponse(); $response->insert('footer', $this->view->render('footer.phtml')); }
Ma question est donc : pourquoi passer autant de temps à le faire afficher de cette manière, alors que la méthode "partial" réalise exactement la même chose en une ligne ?
Hors ligne
2 ème point avec le même exemple :
$response = $this->getResponse(); $response->insert('footer', $this->view->render('footer.phtml'));
J'ai l'impression qu'on ajoute à la réponse le rendu de notre segment "footer.phtml". Pourquoi alors ne pas faire directement le rendu dans le fichier "layout.phtml" de cette manière :
$this->render('footer')
Je suis désolé, mais je ne comprends vraiment pas pourquoi tout le monde n'utilise pas tout simplement les méthodes "partial" ou "render" pour faire un afficher un bout de template.
Hors ligne
partial() est une simple aide de vue qui en gros fait un include sans accès au variable de vue.
//(view).phtml $this->test = true; $this->partial('path/to/test.phtml', array('autreTest' => 'Autre test')); ... //path/to/test.phtml echo $this->test; //erreur echo $this->autreTest; //Autre test
render() (méthode de vue) permet d'effectuer un rendu d'une vue tout comme partial à la différence que les variables de vue sont accessibles dans le script. A ne pas confondre avec la méthode Zend_Controller_Action::render('scriptname') (celle qu'a expliquer nORKy)
//(view).phtml $this->test = true; $this->render('path/to/test.phtml'); //path/to/test.phtml echo $this->test; //test
Simple accès au variable de layout
$this->layout()->test
Ces variables peuvent être initialisé de 'nimporte où avec par exemple
Zend_Layout::getMvcInstance()->variableName
Pour ce qui est d'utiliser directement la réponse pour insérer du rendu dedans, je trouve ça pas très orienté objet...
Pour les header/footer, j'utiliserai partial si c'est plutôt statique, render si c'est un peu dynamique (ex: Bonjour User), ou un segment de layout si c'est très dynamique et donc générer dans une action éventuellement.
Hors ligne
Très bien expliqué. Je vous remercie.
C'est ce que j'avais cru comprendre vers la fin : le helper partial est plutôt pour les parties statiques. Et si l'on veut des parties dynamiques selon nos différentes pages, autant passer par un traitement personnalisé avec un segment de layout (comme pour une barre de navigation par exemple).
En vous remerciant pour vos réponses...
Hors ligne