quickstart-create-layout.xml 8.3 KB

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