view-placeholders-basics.xml 9.3 KB

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