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