2
0

quickstart-create-layout.xml 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 19777 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="learning.quickstart.create-layout">
  5. <title>Ein Layout erstellen</title>
  6. <para>
  7. Wie man festgestellen kann waren die View Skripte im vorhergehenden Kapitel HTML Fragmente-
  8. und keine kompletten Seiten. Das ist so gewünscht; wir wollen das unsere Aktionen nur den
  9. Inhalt zurückgeben der für die Aktion selbst relevant ist, und nicht die Anwendung als
  10. ganzes.
  11. </para>
  12. <para>
  13. Jetzt müssen wir den erstellten Inhalt zu einer kompletten HTML Seite zusammenfügen. Wir
  14. wollen auch ein konsistentes Aussehen und Feeling für die Anwendung haben. Wir wollen ein
  15. globales Sitelayout verwenden um beide Arbeiten zu ermöglichen.
  16. </para>
  17. <para>
  18. Es gibt zwei Design Pattern die Zend Framework verwendet um Layouts zu implementieren:
  19. <ulink url="http://martinfowler.com/eaaCatalog/twoStepView.html">Two Step View</ulink> und
  20. <ulink
  21. url="http://java.sun.com/blueprints/corej2eepatterns/Patterns/CompositeView.html">Composite
  22. View</ulink>. <emphasis>Two Step View</emphasis> wird normalerweise mit dem <ulink
  23. url="http://www.martinfowler.com/eaaCatalog/transformView.html">Transform View</ulink>
  24. Pattern assoziiert; die grundsätzliche Idee besteht darin das die View der Anwendung eine
  25. Repräsentation erstellt die dann in die Master View für letzte Transformationen injiziert
  26. wird. Das <emphasis>Composite View</emphasis> Pattern arbeitet mit einer View die aus ein
  27. oder mehreren atomischen Anwendungs Views gemacht ist.
  28. </para>
  29. <para>
  30. Im Zend Framework kombiniert <link linkend="zend.layout">Zend_Layout</link> die Ideen hinter
  31. diesen Pattern. Statt dass jedes Action View Skript Site-weite Artefakte einfügen muss,
  32. können Sie sich einfach auf Ihre eigenen Beantwortungen konzentrieren.
  33. </para>
  34. <para>
  35. Natürlich benötigt man trotzdem Anwendungs-spezifische Informationen im Site-weiten View
  36. Skript. Glücklicherweise bietet Zend Framework eine Anzahl von View
  37. <emphasis>Platzhaltern</emphasis> die es erlauben solche Informationen von den Action View
  38. Skripten zu bekommen.
  39. </para>
  40. <para>
  41. Um mit Zend_Layout zu beginnen müssen wir als erstes die Bootstrap informieren das Sie die
  42. <classname>Layout</classname> Ressource verwenden soll. Das kann getan werden indem die
  43. folgende Linie zur Datei <filename>application/configs/application.ini</filename> im
  44. Abschnitt <constant>production</constant> hinzugefügt wird:
  45. </para>
  46. <programlisting language="ini"><![CDATA[
  47. ; application/configs/application.ini
  48. ; Zum Abschnitt [production] hinzufügen:
  49. resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
  50. ]]></programlisting>
  51. <para>
  52. Die endgültige INI Datei sollte wie folgt aussehen:
  53. </para>
  54. <programlisting language="ini"><![CDATA[
  55. ; application/configs/application.ini
  56. [production]
  57. ; PHP Einstellungen die initialisiert werden sollen
  58. phpSettings.display_startup_errors = 0
  59. phpSettings.display_errors = 0
  60. includePaths.library = APPLICATION_PATH "/../library"
  61. bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
  62. bootstrap.class = "Bootstrap"
  63. resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
  64. resources.layout.layoutPath = APPLICATION_PATH "/layouts/scripts"
  65. [staging : production]
  66. [testing : production]
  67. phpSettings.display_startup_errors = 1
  68. phpSettings.display_errors = 1
  69. [development : production]
  70. phpSettings.display_startup_errors = 1
  71. phpSettings.display_errors = 1
  72. ]]></programlisting>
  73. <para>
  74. Diese Direktive sagt der Anwendung das Sie nach Layout View Skripten unter
  75. <filename>application/layouts/scripts</filename> nachschauen soll. Jetzt müssen diese
  76. Verzeichnisse erstellt werden.
  77. </para>
  78. <para>
  79. Wir wollen auch sicherstellen das wir eine XHTML DocType Deklaration für unsere Anwendung
  80. haben. Um das zu aktivieren mussen wir eine Ressource zu unserer Bootstrap hinzufügen.
  81. </para>
  82. <para>
  83. Der einfachste Weg um eine Bootstrap Ressource hinzuzufügen ist es einfach eine
  84. geschützte Methode zu erstellen die mit der Phrase <methodname>_init</methodname> beginnt.
  85. In diesem Fall wollen wir den Doctype initialisieren, also erstellen wir eine
  86. <methodname>_initDoctype()</methodname> Methode in unserer Bootstrap Klasse:
  87. </para>
  88. <programlisting language="php"><![CDATA[
  89. // application/Bootstrap.php
  90. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  91. {
  92. protected function _initDoctype()
  93. {
  94. }
  95. }
  96. ]]></programlisting>
  97. <para>
  98. In dieser Methode müssen wir der View sagen das Sie den richtigen DocType verwenden soll.
  99. Aber wo kommt das View Objekt her? Die einfachste Lösung ist die Initialisierung der
  100. <classname>View</classname> Ressource; sobald wir Sie haben können wir das View Objekt
  101. aus der Bootstrap holen und verwenden.
  102. </para>
  103. <para>
  104. Um die View Ressource zu initialisieren ist die folgende Zeile in der Sektion
  105. <constant>production</constant> der Datei
  106. <filename>application/configs/application.ini</filename> hinzuzufügen:
  107. </para>
  108. <programlisting language="ini"><![CDATA[
  109. ; application/configs/application.ini
  110. ; Zum Abschnitt [production] hinzufügen:
  111. resources.view[] =
  112. ]]></programlisting>
  113. <para>
  114. Das sagt uns das die View ohne Optionen initialisiert werden soll ('[]' zeigt das der "view"
  115. Schlüssel ein Array ist, und wir Ihm nichts übergeben).
  116. </para>
  117. <para>
  118. Jetzt da wir die View haben, sehen wir uns die <methodname>_initDoctype()</methodname>
  119. Methode an. In Ihr stellen wir zuerst sicher das die <classname>View</classname> Ressource
  120. läuft, holen das View Objekt und konfigurieren es anschließend:
  121. </para>
  122. <programlisting language="php"><![CDATA[
  123. // application/Bootstrap.php
  124. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  125. {
  126. protected function _initDoctype()
  127. {
  128. $this->bootstrap('view');
  129. $view = $this->getResource('view');
  130. $view->doctype('XHTML1_STRICT');
  131. }
  132. }
  133. ]]></programlisting>
  134. <para>
  135. Jetzt da wir <classname>Zend_Layout</classname> initialisiert und den DocType gesetzt haben
  136. erstellen wir unser Site-weites Layout:
  137. </para>
  138. <programlisting language="php"><![CDATA[
  139. // application/layouts/scripts/layout.phtml
  140. echo $this->doctype() ?>
  141. <html xmlns="http://www.w3.org/1999/xhtml">
  142. <head>
  143. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  144. <title>Zend Framework Schnellstart Anwendung</title>
  145. <?php echo $this->headLink()->appendStylesheet('/css/global.css') ?>
  146. </head>
  147. <body>
  148. <div id="header" style="background-color: #EEEEEE; height: 30px;">
  149. <div id="header-logo" style="float: left">
  150. <b>ZF Schnellstart Anwendung</b>
  151. </div>
  152. <div id="header-navigation" style="float: right">
  153. <a href="<?php echo $this->url(
  154. array('controller'=>'guestbook'),
  155. 'default',
  156. true) ?>">Guestbook</a>
  157. </div>
  158. </div>
  159. <?php echo $this->layout()->content ?>
  160. </body>
  161. </html>
  162. ]]></programlisting>
  163. <para>
  164. Wir holen den Inhalt der Anwendung indem der <methodname>layout()</methodname> View Helfer
  165. verwendet, und auf den "content" Schlüssel zugegriffen wird. Man kann andere Antwort
  166. Segmente darstellen wenn man das möchte, aber in den meisten Fällen ist das alles was
  167. notwendig ist.
  168. </para>
  169. <para>
  170. Es ist zu beachten das wir auch den <methodname>headLink()</methodname> Platzhalter
  171. verwenden. Das ist ein einfacher Weg um das HTML für das &lt;link&gt; Element zu erstellen,
  172. sowie um es durch die Anwendung hindurch zu verfolgen. Wenn man zusätzliche CSS Blätter
  173. zur Unterstützung einer einzelnen Aktion benötigt, kann das getan werden indem man
  174. sicherstellt das Sie in der endgültig dargestellten Seite vorhanden sind.
  175. </para>
  176. <note>
  177. <title>Checkpoint</title>
  178. <para>
  179. Jetzt gehen wir zu "http://localhost" und prüfen die Quelle. Man sieht den XHTML Header,
  180. Kopf, Titel und Body Abschnitte.
  181. </para>
  182. </note>
  183. </sect1>