Programmer's Reference Guide

Introduction

Zend_Layout - Démarrage rapide

Il y a deux modes d'utilisation de Zend_Layout : avec Zend Framework MVC, et sans.

Scripts de layout

Dans tous les cas, un script de layout est nécessaire. Les scripts de layout utilisent simplement Zend_View (ou une implémentation particulière personnalisée). Les variables de layout sont enregistrées dans le placeholder Layout, et peuvent être accédées via l'aide de vue placeholder ou directement en tant que propriétés de l'objet layout.

Par exemple :

  1. <!DOCTYPE html
  2.     PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  3.     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  4. <html>
  5. <head>
  6.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  7.     <title>Mon Site</title>
  8. </head>
  9. <body>
  10. <?php
  11.     // récupère la clé "content" via l'aide de vue layout :
  12.     echo $this->layout()->content;
  13.  
  14.     // récupère la clé "foo" via l'aide de vue placeholder :
  15.     echo $this->placeholder('Zend_Layout')->foo;
  16.  
  17.     // récupère l'objet layout, et accède à diverses clés :
  18.     $layout = $this->layout();
  19.     echo $layout->bar;
  20.     echo $layout->baz;
  21. ?>
  22. </body>
  23. </html>

Toutes les aides de vue enregistrées sont accessibles dans Zend_Layout car il utilise Zend_View pour son propre rendu. Vous pouvez aussi accéder aux variables de la vue. Les aides placeholder sont très pratiques pour l'accès aux éléments tels que <head>, les scripts, les méta, etc. :

  1. <!DOCTYPE html
  2.     PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
  3.     "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  4. <html>
  5. <head>
  6.     <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  7.     <?php echo $this->headTitle() ?>
  8.     <?php echo $this->headScript() ?>
  9.     <?php echo $this->headStyle() ?>
  10. </head>
  11. <body>
  12.     <?php echo $this->render('header.phtml') ?>
  13.  
  14.     <div id="nav"><?php echo $this->placeholder('nav') ?></div>
  15.  
  16.     <div id="content"><?php echo $this->layout()->content ?></div>
  17.  
  18.     <?php echo $this->render('footer.phtml') ?>
  19. </body>
  20. </html>

Utilisation de Zend_Layout avec le système MVC de Zend Framework

Zend_Controller propose une manière d'étendre ses fonctionnalités au travers de plugins de contrôleur frontal et d'aides d'action. Zend_View propose aussi des aides. Zend_Layout utilise toutes ces possibilités lorsqu'employé avec les composants MVC.

Zend_Layout::startMvc() crée une instance de Zend_Layout avec des paramètres de configuration optionnels. Cette méthode enregistre aussi un plugin de contrôleur frontal qui s'occupe du rendu du layout rempli, lorsque la boucle de distribution est terminée. Elle enregistre également une aide d'action qui permet aux actions d'accéder à l'objet layout. Enfin, l'aide de vue layout, elle, donne accès à l'objet layout depuis la vue.

Regardons d'abord comment initialiser Zend_Layout afin de l'utiliser dans un contexte MVC

  1. // Dans le fichier de démarrage (bootstrap)
  2. Zend_Layout::startMvc();

startMvc() peut prendre en paramètre un tableau d'options ou un objet Zend_Config pour personnaliser l'instance. Ces options sont détaillées dans Zend_Layout options de configuration.

Dans le contrôleur d'action, vous pouvez donc accéder à l'instance de layout via l'aide d'action :

  1. class FooController extends Zend_Controller_Action
  2. {
  3.     public function barAction()
  4.     {
  5.         // désactive les layouts pour cette action
  6.         $this->_helper->layout->disableLayout();
  7.     }
  8.  
  9.     public function bazAction()
  10.     {
  11.         // utilise un script de layout différent pour
  12.         // cette action
  13.         $this->_helper->layout->setLayout('foobaz');
  14.     };
  15. }

Dans vos scripts de vue, utiliser l'aide layout pour accéder à l'instance de Zend_Layout. Notez que cette aide est différente des autres car elle ne retourne pas une chaîne, mais bien un objet. Vous pouvez donc enchaîner une méthode immédiatement :

  1. $this->layout()->setLayout('foo'); // utilise un script de layout spécifique

Autrement, vous pouvez n'importe où accéder à votre instance de Zend_Layout via la méthode statique getMvcInstance() :

  1. // Retourne null si startMvc() n'a pas été appelée auparavant
  2. $layout = Zend_Layout::getMvcInstance();

Enfin, le plugin de contrôleur frontal Zend_Layout dispose d'une caractéristique annexe au rendu automatique du layout : il analyse les segments de l'objet de réponse et les assigne en tant que variables de layout dans vos scripts de layout. Le segment "default" est assigné à la variable "content". Ceci permet de mettre la main sur le contenu rendu dans l'action principale.

Par exemple, supposons que votre code rencontre d'abord FooController::indexAction(), qui va rendre du contenu dans le segment par défaut de la réponse. Ensuite il forward vers NavController::menuAction(), qui rend son contenu dans un segment nommé 'nav'. Enfin, vous forwardez vers CommentController::fetchAction() pour récupérer des commentaires, mais vous les rendez aussi dans le segment par défaut de la réponse (ce qui va rajouter du contenu). Votre script de layout peut alors rendre chaque segment de manière séparée :

  1. <body>
  2.     <!-- rend /nav/menu -->
  3.     <div id="nav"><?php echo $this->layout()->nav ?></div>
  4.  
  5.     <!-- rend /foo/index + /comment/fetch -->
  6.     <div id="content"><?php echo $this->layout()->content ?></div>
  7. </body>

Cette approche est particulièrement utile avec l'aide d'action ActionStack et son plugin du même nom. Vous pouvez les utiliser pour gérer une pile d'actions et ainsi décomposer vos processus.

Utilisation de Zend_Layout en composant indépendant

Pris indépendamment des composants MVC, Zend_Layout n'offre pas tout à fait les mêmes possibilités et la même flexibilité. Cependant, vous bénéficiez de deux avantages :

  • Des variables propres aux layouts.

  • Isolation du script de layout, de son contenu issu des scripts de vue.

En tant que composant indépendant, instanciez un objet Zend_Layout, configurez le au moyen d'accesseurs, passez vos variables comme des propriétés de l'objet, et rendez le layout :

  1. $layout = new Zend_Layout();
  2.  
  3. // Spécification du chemin des scripts layout:
  4. $layout->setLayoutPath('/chemin/vers/layouts');
  5.  
  6. // passage de quelques variables :
  7. $layout->content = $content;
  8. $layout->nav     = $nav;
  9.  
  10. // Utilisation d'un script de layout "foo" :
  11. $layout->setLayout('foo');
  12.  
  13. // rendu du layout :
  14. echo $layout->render();

Layout d'exemple

Une image valant mieux qu'un paragraphe, voyez donc celle-ci qui décrit l'utilisation :

zend.layout.quickstart.example.png

Avec cette approche, vous pouvez régler vos mises en forme CSS. En positionnement absolu, par exemple, vous pourriez rendre la barre de navigation plus tard, en fin. Le mécanisme d'obtention du contenu reste le même cependant.


Introduction

Comments

Hi, thanks for your doc, but how do you create $layout->nav ?
Hi, thanks for your doc, but how do you create $layout->nav ?
Muy bien todo, pero como michi creo eso, donde coloco el codigo ? lol
@Donbrico, you don't. use Zend_Navigation and the navigation helper instead.
The most stupid explanation i've ever seen.

What's all the first bla-bla-bal about? What's the first script? Layout? View? What's the difference between "Layout helper" and "layout placeholder helper"?
i want to initialize a layout variable in any of my controller and want to use that variable in layouts

How to do this?


also tell me if there is a way to call a method which will work on each page without calling it in each page controller


In my application, the header contains information about the logged in user(His name and profile picture.). But Zend_Auth::getInstance()->getIdentity() method is not working while using in layout. How to do that using zend layouts.???
When you mention:

// In your bootstrap:
Zend_Layout::startMvc();

What's mean?, for example it will be that?:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
....

protected function _initForLayout()
{
Zend_Layout::startMvc();
return null;
}
...
}


Is that?

Regards
It is so complicate! and hard to understan! What is the purpose of this document ?
Hi, there are some variables used but there is no explanation about where they are set. Where do the variables called in the head get set? For exalmple, headTitle and headScript. My layout is now being called but I would like to set these.
you could learn how to use layout on this page:
http://framework.zend.com/manual/en/learning.layout.usage.html#learning.layout.usage.access

+ Add A Comment

Please do not report issues via comments; use the ZF Issue Tracker.

If you have a JIRA/Crowd account, we suggest you login first before commenting.

  • BBCode is allowed in the comment markup

  • Select a Version

    Languages Available

    Components

    Search the Manual