1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- EN-Revision: 21825 -->
4 <sect1 id="learning.quickstart.create-layout">
5 <title>Créer une layout</title>
8 Vous avez remarqué que les scripts de vue dans les sections précédentes étaient des
9 fragments de <acronym>HTML</acronym>, pas des pages complètes. C'est le design :
10 nous voulons que nos actions retournent du contenu uniquement relatif à elles mêmes et
11 non de l'application en général.
15 Maintenant nous devons introduire le contenu généré dans une page entière
16 <acronym>HTML</acronym>. Nous utiliserons un layout global pour tout le site dans ce but.
20 Il y a deux designs pattern que le Zend Framework utilise pour les layouts : <ulink
21 url="http://martinfowler.com/eaaCatalog/twoStepView.html">Two Step View</ulink> et
23 url="http://java.sun.com/blueprints/corej2eepatterns/Patterns/CompositeView.html">Composite
24 View</ulink>. <emphasis>Two Step View</emphasis> est souvent associé au pattern <ulink
25 url="http://www.martinfowler.com/eaaCatalog/transformView.html">Transform View</ulink>
26 l'idée de base est que les vues de l'application créent une représentation qui est ensuite
27 injectée dans une vue plus globale. Le pattern <emphasis>Composite View</emphasis>
28 traite avec une vue fabriquée à partir de plusieurs vues applicatives.
32 Dans Zend Framework, <link linkend="zend.layout">Zend_Layout</link> combine les idées de
33 ces patterns. Plutôt que chaque vue inclue tout le design, chacune ne contient que ses
38 Par contre vous pourriez avoir besoin occasionnellement d'informations globales dans la vue
39 générale. Heureusement, le Zend Framework propose une variété de conteneurs appelés
40 <emphasis>placeholders</emphasis> pour permettre de stocker de telles informations depuis
41 les scripts de vue des actions.
45 Pour démarrer avec <classname>Zend_Layout</classname>, nous devons d'abord informer le
46 bootstrap de l'objet <classname>Layout</classname> (ressource). On peut activer cela au
47 moyen de la commande <command>zf enable layout</command>:
50 <programlisting language="shell"><![CDATA[
52 Layouts have been enabled, and a default layout created at
53 application/layouts/scripts/layout.phtml
54 A layout entry has been added to the application config file.
58 Comme le suggère la commande, <filename>application/configs/application.ini</filename>
59 est mis à jour et contient maintenant les informations suivantes dans la section
60 <constant>production</constant> :
63 <programlisting language="ini"><![CDATA[
64 ; application/configs/application.ini
66 ; Add to [production] section:
67 resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
71 Le fichier <acronym>INI</acronym> final devrait ressembler à ceci :
74 <programlisting language="ini"><![CDATA[
75 ; application/configs/application.ini
78 ; PHP settings we want to initialize
79 phpSettings.display_startup_errors = 0
80 phpSettings.display_errors = 0
81 includePaths.library = APPLICATION_PATH "/../library"
82 bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
83 bootstrap.class = "Bootstrap"
84 appnamespace = "Application"
85 resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
86 resources.frontController.params.displayExceptions = 0
87 resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
89 [staging : production]
91 [testing : production]
92 phpSettings.display_startup_errors = 1
93 phpSettings.display_errors = 1
95 [development : production]
96 phpSettings.display_startup_errors = 1
97 phpSettings.display_errors = 1
101 Cette directive indique à l'application de chercher les scripts de layout dans
102 <filename>application/layouts/scripts</filename>. Si vous examinez votre structure de
103 répertoires, vous verrez que ce dossier a été créé pour vous, avec le fichier
104 <filename>layout.phtml</filename>.
108 Nous voulons aussi nous assurer que nous avons une déclaration de DocType XHTML pour notre
109 application. Pour activer cela, nous devons ajouter une ressource à notre bootstrap.
113 La manière la plus simple d'ajouter une ressource au bootstrap est de définir une méthode
114 protégée qui commence par <methodname>_init</methodname>. Dans notre cas, nous voulons
115 initialiser le doctype et donc nous créons une méthode
116 <methodname>_initDoctype()</methodname> :
119 <programlisting language="php"><![CDATA[
120 // application/Bootstrap.php
122 class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
124 protected function _initDoctype()
131 Dans cette méthode, nous devons renseigner la vue au sujet du doctype. Mais d'où va
132 provenir notre objet de vue ? La solution simple consiste à initialiser la ressource
133 <classname>View</classname> et la récupérer dans la méthode de bootstrap pour l'utiliser.
137 Pour initialiser la vue, ajoutez la ligne suivante dans le fichier
138 <filename>application/configs/application.ini</filename>, dans la section
139 <constant>production</constant> :
142 <programlisting language="ini"><![CDATA[
143 ; application/configs/application.ini
145 ; Add to [production] section:
150 Ceci indique de charger la vue avec aucune option (les '[]' indiquent que la clé "view" est
151 un tableau et nous ne lui passons rien du tout).
155 Maintenant que nous possédons une vue, retournons à notre méthode
156 <methodname>_initDoctype()</methodname>. A l'intérieur, nous allons d'abord nous assurer
157 que la ressource <classname>View</classname> existe, puis nous la récupèrerons et la
161 <programlisting language="php"><![CDATA[
162 // application/Bootstrap.php
164 class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
166 protected function _initDoctype()
168 $this->bootstrap('view');
169 $view = $this->getResource('view');
170 $view->doctype('XHTML1_STRICT');
176 Maintenant que <classname>Zend_Layout</classname> est initialisé et que le Doctype est
177 réglé, créons notre vue globale de layout :
180 <programlisting language="php"><![CDATA[
181 <!-- application/layouts/scripts/layout.phtml -->
182 <?php echo $this->doctype() ?>
183 <html xmlns="http://www.w3.org/1999/xhtml">
185 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
186 <title>Zend Framework Quickstart Application</title>
187 <?php echo $this->headLink()->appendStylesheet('/css/global.css') ?>
190 <div id="header" style="background-color: #EEEEEE; height: 30px;">
191 <div id="header-logo" style="float: left">
192 <b>ZF Quickstart Application</b>
194 <div id="header-navigation" style="float: right">
195 <a href="<?php echo $this->url(
196 array('controller'=>'guestbook'),
198 true) ?>">Guestbook</a>
202 <?php echo $this->layout()->content ?>
209 Nous récupérons le contenu de l'application au moyen de l'aide de vue
210 <methodname>layout()</methodname> et nous accédons à la clé "content". Vous pouvez utiliser
211 d'autres segments de l'objet de réponse, mais dans la plupart des cas ce n'est pas
216 Notez aussi l'utilisation du placeholer <methodname>headLink()</methodname>. C'est un moyen
217 simple de générer du <acronym>HTML</acronym> pour les éléments <link> et ca permet de
218 les garder sous le coude au travers de l'application. Si vous devez ajouter des feuilles
219 CSS c'est aussi possible.
223 <title>Checkpoint</title>
226 Allez maintenant sur "http://localhost" et regarder le code source rendu. Vous devriez
227 voir votre entête XHTML et vos sections head, title et body.