view-placeholders-basics.xml 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="learning.view.placeholders.basics">
  5. <title>Grundsätzliche Verwendung von Platzhaltern</title>
  6. <para>
  7. Zend Framework definiert einen generischen <methodname>placeholder()</methodname> View
  8. Helfer den man für so viele eigene Platzhalter verwenden kann wie man will. Er bietet auch
  9. eine Vielzahl an Platzhalter Implementationen für oft benötigte Funktionalitäten, wie die
  10. Spezifikation der <emphasis>DocType</emphasis> Deklaration, den Titel des Dokuments und
  11. mehr.
  12. </para>
  13. <para>
  14. Alle Platzhalter arbeiten einigermaßen auf die selbe Art und Weise. Sie sind Container und
  15. erlauben es deshalb das man mit Ihnen als Kollektion arbeitet. Mit Ihnen kann man:
  16. </para>
  17. <itemizedlist>
  18. <listitem>
  19. <para>
  20. <emphasis>Anhängen</emphasis> oder <emphasis>voranstellen</emphasis> von Elementen
  21. an die Kollektion.
  22. </para>
  23. </listitem>
  24. <listitem>
  25. <para>
  26. <emphasis>Ersetzen</emphasis> der kompletten Kollektion mit einem einzelnen Wert.
  27. </para>
  28. </listitem>
  29. <listitem>
  30. <para>
  31. Einen String spezifizieren welcher der <emphasis>Ausgaben vorangestellt</emphasis>
  32. wird wenn die Kollektion dargestellt wird.
  33. </para>
  34. </listitem>
  35. <listitem>
  36. <para>
  37. Einen String spezifizieren welcher der <emphasis>Ausgaben angehängt</emphasis>
  38. wird wenn die Kollektion dargestellt wird.
  39. </para>
  40. </listitem>
  41. <listitem>
  42. <para>
  43. Einen String spezifizieren mit dem <emphasis>Elemente geteilt</emphasis> werden wenn
  44. die Kollektion dargestellt wird.
  45. </para>
  46. </listitem>
  47. <listitem>
  48. <para>
  49. <emphasis>Inhalte holen</emphasis> die sich in der Kollektion befinden.
  50. </para>
  51. </listitem>
  52. <listitem>
  53. <para>
  54. <emphasis>Darstellen</emphasis> der gesammelten Inhalte.
  55. </para>
  56. </listitem>
  57. </itemizedlist>
  58. <para>
  59. Typischerweise ruft man den Helper ohne Argumente auf, damit er einen Container zurückgibt
  60. mit dem man arbeiten kann. Man gibt diesen Container aus (echo) um Ihn darzustellen, oder
  61. ruft auf Ihm Methoden auf um Ihn zu konfigurieren oder auszugeben. Wenn der Container leer
  62. ist, wird seine Darstellung einfach einen leeren String zurückgeben; andernfalls wird der
  63. Inhalt zusammengefasst entsprechend der Regeln welche konfiguriert worden sind.
  64. </para>
  65. <para>
  66. Als Beispiel erstellen wir eine Sidebar die aus einer Anzahl an "Blöcken" von Inhalten
  67. besteht. Man wird normalerweise die Struktur jeden Blocks aus dem Bauch heraus wissen;
  68. nehmen wir für dieses Beispiel an dass Sie wie folgt aussieht:
  69. </para>
  70. <programlisting language="html"><![CDATA[
  71. <div class="sidebar">
  72. <div class="block">
  73. <p>
  74. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus
  75. consectetur aliquet odio ac consectetur. Nulla quis eleifend
  76. tortor. Pellentesque varius, odio quis bibendum consequat, diam
  77. lectus porttitor quam, et aliquet mauris orci eu augue.
  78. </p>
  79. </div>
  80. <div class="block">
  81. <ul>
  82. <li><a href="/some/target">Link</a></li>
  83. <li><a href="/some/target">Link</a></li>
  84. </ul>
  85. </div>
  86. </div>
  87. ]]></programlisting>
  88. <para>
  89. Der Inhalt veriiert basieren auf dem Controller und der Aktion, aber die Struktur ist die
  90. gleiche. Zuerst stellen wir die Sidebar in der Sidebar einer Ressource Methode unserer
  91. Bootstrap ein:
  92. </para>
  93. <programlisting language="php"><![CDATA[
  94. class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
  95. {
  96. // ...
  97. protected function _initSidebar()
  98. {
  99. $this->bootstrap('View');
  100. $view = $this->getResource('View');
  101. $view->placeholder('sidebar')
  102. // "prefix" -> Markup der einmalig vor allen Elementen
  103. // der Kollektion auszugeben ist
  104. ->setPrefix("<div class=\"sidebar\">\n <div class=\"block\">\n")
  105. // "separator" -> Markup der zwischen Elementen
  106. // der Kollektion auszugeben ist
  107. ->setSeparator("</div>\n <div class=\"block\">\n")
  108. // "postfix" -> Markup der einmalig nach allen Elementen
  109. // der Kollektion auszugeben ist
  110. ->setPostfix("</div>\n</div>");
  111. }
  112. // ...
  113. }
  114. ]]></programlisting>
  115. <para>
  116. Das obige definiert den Platzhalter "sidebar" der keine Elemente hat. Er konfiguriert die
  117. grundsätzliche Struktur des Markups dieses Platzhalter, aber basieren auf unseren
  118. Anforderungen.
  119. </para>
  120. <para>
  121. Jetzt nehmen wir für den "user" Controller an das wir für alle Aktionen einen Block ganz
  122. oben wollen der einige Informationen enthält. Wir können das auf zwei Wegen erreichen: (a)
  123. wir könnten den Inhalt direkt dem Platzhalter mit der Methode
  124. <methodname>preDispatch()</methodname> des Controllers hinzufügen, oder (b) wir könnten ein
  125. View Skript in der <methodname>preDispatch()</methodname> Methode darstellen. Wir verwenden
  126. (b) da es einer besseren Trennung der Wünsche folgt (indem es View-betreffende Logik und
  127. Funktionalität im View Skript behält).
  128. </para>
  129. <para>
  130. Wir benennen das View Skript "<filename>user/_sidebar.phtml</filename>", und machen es wir
  131. folgt bekannt:
  132. </para>
  133. <programlisting language="php"><![CDATA[
  134. <?php $this->placeholder('sidebar')->captureStart() ?>
  135. <h4>Benutzer Administration</h4>
  136. <ul>
  137. <li><a href="<?php $this->url(array('action' => 'list')) ?>">
  138. Liste</a></li>
  139. <li><a href="<?php $this->url(array('action' => 'create')) ?>">
  140. Erstellen</a></a></li>
  141. </ul>
  142. <?php $this->placeholder('sidebar')->captureEnd() ?>
  143. ]]></programlisting>
  144. <para>
  145. Das obige Beispiel verwendet das Capture Feature für den Inhalt des Platzhalters.
  146. Standardmäßig wird Inhalt dem Container als neues Element angehängt, was es erlaubt Ihn zu
  147. sammeln. Dieses Beispiel verwendet View Helfer und statisches <acronym>HTML</acronym> um
  148. Markup zu erzeugen. Der Inhalt wird anschließend gefangen und dem Platzhalter selbst
  149. angehängt.
  150. </para>
  151. <para>
  152. Um das oben stehende View Skript einzubinden würden wir das folgende in unserer
  153. <methodname>preDispatch()</methodname> Methode schreiben:
  154. </para>
  155. <programlisting language="php"><![CDATA[
  156. class UserController extends Zend_Controller_Action
  157. {
  158. // ...
  159. public function preDispatch()
  160. {
  161. // ...
  162. $this->view->render('user/_sidebar.phtml');
  163. // ...
  164. }
  165. // ...
  166. }
  167. ]]></programlisting>
  168. <para>
  169. Es ist zu beachten das wir den dargestellten Wert nicht fangen; es gibt keine Notwendigkeit
  170. dafür da die komplette View in einem Platzhalter gefangen wird.
  171. </para>
  172. <para>
  173. Nehmen wir also an das unsere "view" Aktion die im selben Controlle ist einige Informationen
  174. anzeigen muss. Im View Skript "<filename>user/view.phtml</filename>" könnten wie den
  175. folgende Inhalts Abschnitt haben:
  176. </para>
  177. <programlisting language="php"><![CDATA[
  178. $this->placeholder('sidebar')
  179. ->append('<p>Benutzer: ' . $this->escape($this->username) . '</p>');
  180. ]]></programlisting>
  181. <para>
  182. Dieses Beispiel verwendet die <methodname>append()</methodname> Methode und übergibt Ihr
  183. etwas einfachen Markup zum sammeln.
  184. </para>
  185. <para>
  186. Letztendlich verändern wir das Layout View Skript und stellen den Platzhalter dar.
  187. </para>
  188. <programlisting language="php"><![CDATA[
  189. <html>
  190. <head>
  191. <title>Meine Site</title>
  192. </head>
  193. <body>
  194. <div class="content">
  195. <?php echo $this->layout()->content ?>
  196. </div>
  197. <?php echo $this->placeholder('sidebar') ?>
  198. </body>
  199. </html>
  200. ]]></programlisting>
  201. <para>
  202. Für Controller und Aktionen welche den "sidebar" Platzhalter nicht verwenden wird kein
  203. Inhalt dargestellt; für jene die es tun wird, wenn der Platzhalter ausgegeben wird der
  204. Inhalt, entsprechend der Regeln die in unserer Bootstrap erstellt wurden, dargestellt als
  205. auch der Inhalt den wir über die Anwendung hinaus sammeln. Im Falle der
  206. "<filename>/user/view</filename>" Aktion, und der Annahme des Benutzernamens "matthew"
  207. würden wir den folgenden Inhalt der Sidebar erhalten (aus Gründen der Lesbarkeit
  208. formatiert):
  209. </para>
  210. <programlisting language="html"><![CDATA[
  211. <div class="sidebar">
  212. <div class="block">
  213. <h4>Benutzer Administration</h4>
  214. <ul>
  215. <li><a href="/user/list">Liste</a></li>
  216. <li><a href="/user/create">Erstellen</a></a></li>
  217. </ul>
  218. </div>
  219. <div class="block">
  220. <p>Benutzer: matthew</p>
  221. </div>
  222. </div>
  223. ]]></programlisting>
  224. <para>
  225. Es gibt eine große Anzahl an Dinge die man tun kann wenn Platzhalter und Layout Skripte
  226. kombiniert werden; man sollte mit Ihnen experimentieren und das <link
  227. linkend="zend.view.helpers.initial.placeholder">betreffende Kapitel im Handbuch</link>
  228. für weitere Informationen lesen.
  229. </para>
  230. </sect1>