Zend FR

Consultez la FAQ sur le ZF avant de poster une question

Vous n'êtes pas identifié.

#1 12-10-2009 17:57:29

capoucho
Nouveau membre
Date d'inscription: 12-10-2009
Messages: 9

Layout, render et partial

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 :

Code:

<?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

 

#2 13-10-2009 10:37:34

nORKy
Membre
Date d'inscription: 06-03-2008
Messages: 1098

Re: Layout, render et partial

$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


----
Gruiiik !

Hors ligne

 

#3 13-10-2009 13:25:13

capoucho
Nouveau membre
Date d'inscription: 12-10-2009
Messages: 9

Re: Layout, render et partial

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 :

Code:

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

 

#4 13-10-2009 13:36:16

capoucho
Nouveau membre
Date d'inscription: 12-10-2009
Messages: 9

Re: Layout, render et partial

2 ème point avec le même exemple :

Code:

$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

 

#5 13-10-2009 14:07:55

Mr.MoOx
Administrateur
Lieu: Toulouse
Date d'inscription: 27-03-2007
Messages: 1444
Site web

Re: Layout, render et partial

partial() est  une simple aide de vue qui en gros fait un include sans accès au variable de vue.

Code:

//(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)

Code:

//(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

Code:

$this->layout()->test

Ces variables peuvent être initialisé de 'nimporte où avec par exemple

Code:

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

 

#6 13-10-2009 15:49:07

capoucho
Nouveau membre
Date d'inscription: 12-10-2009
Messages: 9

Re: Layout, render et partial

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

 

Pied de page des forums

Propulsé par PunBB
© Copyright 2002–2005 Rickard Andersson
Traduction par punbb.fr

Graphisme réalisé par l'agence Rodolphe Eveilleau
Développement par Kitpages