quickstart-create-layout.xml 8.5 KB

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