Zend_Layout-Advanced.xml 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 22432 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.layout.advanced">
  5. <title>Erweiterte Verwendung von Zend_Layout</title>
  6. <para>
  7. <classname>Zend_Layout</classname> hat eine Vielzahl an Verwendungsmöglichkeiten für den
  8. fortgeschrittenen Entwickler der es für seine unterschiedlichen View Implementationen,
  9. Dateisystem Layouts, und anderes adaptieren will.
  10. </para>
  11. <para>
  12. Die Hauptpunkte der Erweiterung sind:
  13. </para>
  14. <itemizedlist>
  15. <listitem>
  16. <para>
  17. <emphasis>Eigene View Objekte.</emphasis> <classname>Zend_Layout</classname> erlaubt
  18. es jede Klasse zu verwenden die <classname>Zend_View_Interface</classname>
  19. implementiert.
  20. </para>
  21. </listitem>
  22. <listitem>
  23. <para>
  24. <emphasis>Eigene Front Controller Plugins.</emphasis>
  25. <classname>Zend_Layout</classname> wird mit einem Standard Front Controller Plugin
  26. ausgeliefert der das Layout automatisch darstellt bevor die Antwort zurückgegeben
  27. wird. Es kann ein eigenes Plugin verwendet werden.
  28. </para>
  29. </listitem>
  30. <listitem>
  31. <para>
  32. <emphasis>Eigene Action Helfer.</emphasis> <classname>Zend_Layout</classname> wird
  33. mit einem Standard Action Helfer ausgeliefert der für die meiden Zwecke ausreichend
  34. sein sollte da er ein dummer Proxy für das Layout Objekt selbst ist.
  35. </para>
  36. </listitem>
  37. <listitem>
  38. <para>
  39. <emphasis>Eigene Auflösung von Layout Skript Pfaden</emphasis>.
  40. <classname>Zend_Layout</classname> erlaubt es einen eigenen <link
  41. linkend="zend.filter.inflector">Beugungsmechanismum</link> für die Auflösung
  42. der Layout Skript Pfade zu verwenden, oder einfach die beigefügte Beugung zu
  43. verändern und eigene Beugungsregeln zu spezifizieren.
  44. </para>
  45. </listitem>
  46. </itemizedlist>
  47. <sect2 id="zend.layout.advanced.view">
  48. <title>Eigene View Objekte</title>
  49. <para>
  50. <classname>Zend_Layout</classname> erlaubt es jede Klasse für die Darstellung der Layout
  51. Skripte zu verwenden die <classname>Zend_View_Interface</classname> implementiert oder
  52. <classname>Zend_View_Abstract</classname> erweitert. Es muß einfach das eigene View
  53. Objekt als Parameter dem Konstruktor/<methodname>startMvc()</methodname> übergeben
  54. werden, oder es mit der <methodname>setView()</methodname> Zugriffsmethode gesetzt
  55. werden:
  56. </para>
  57. <programlisting language="php"><![CDATA[
  58. $view = new My_Custom_View();
  59. $layout->setView($view);
  60. ]]></programlisting>
  61. <note>
  62. <title>Nicht alle Zend_View Implementationen sind gleich</title>
  63. <para>
  64. Wärend es <classname>Zend_Layout</classname> erlaubt jede Klasse zu verwenden die
  65. <classname>Zend_View_Interface</classname> implementiert, können Fälle auftreten in
  66. denen es nicht möglich ist die verschiedenen <classname>Zend_View</classname> Helfer
  67. anzupassen, speziell die Layout und <link
  68. linkend="zend.view.helpers.initial.placeholder">Platzhalter</link> Helfer. Das
  69. ist weil <classname>Zend_Layout</classname> die Variablen die im Objekt gesetzt
  70. werden über sich selbst und <link
  71. linkend="zend.view.helpers.initial.placeholder">Platzhalter</link> bereitstellt.
  72. </para>
  73. <para>
  74. Wenn eine eigene <classname>Zend_View</classname> Implementation verwendet werden
  75. soll die diese Helfer nicht unterstützt, muß ein Weg gefunden werden um die Layout
  76. Variablen in die View zu bekommen. Das kann entweder durch die Erweiterung vom
  77. <classname>Zend_Layout</classname> Objekt und der Anpassung der
  78. <methodname>render()</methodname> Methode zur Übergabe von Variablen zur View
  79. geschehen, oder durch die Erstellung einer eigenen Plugin Klasse die diese vor der
  80. Darstellung des Layouts übergibt.
  81. </para>
  82. <para>
  83. Alternativ kann auf diese Variablen, wenn die View Implementation jegliche Art von
  84. Plugin Möglichkeiten unterstützt, über die 'Zend_Layout' Platzhalter zugegriffen
  85. werden, indem der <link linkend="zend.view.helpers.initial.placeholder">Platzhalter
  86. Helfer</link> verwendet wird:
  87. </para>
  88. <programlisting language="php"><![CDATA[
  89. $placeholders = new Zend_View_Helper_Placeholder();
  90. $layoutVars = $placeholders->placeholder('Zend_Layout')->getArrayCopy();
  91. ]]></programlisting>
  92. </note>
  93. </sect2>
  94. <sect2 id="zend.layout.advanced.plugin">
  95. <title>Eigene Front Controller Plugins</title>
  96. <para>
  97. Wenn <classname>Zend_Layout</classname> mit den <acronym>MVC</acronym> Komponenten
  98. verwendet wird, registriert es ein Front Controller Plugin dass das Layout als letzte
  99. Aktion darstellt bevor die Bearbeitungsschleife beendet wird. In den meisten Fällen,
  100. wird das Standardplugin ausreichen, aber sollte es gewünscht sein ein eigenes zu
  101. schreiben, kann der Name der Pluginklasse die geladen werden soll durch die Übergabe der
  102. <property>pluginClass</property> Option an die <methodname>startMvc()</methodname>
  103. Methode spezifiziert werden.
  104. </para>
  105. <para>
  106. Jede Plugin Klasse die für diesen Zweck geschrieben wird, muß
  107. <classname>Zend_Controller_Plugin_Abstract</classname> erweitern, und sollte eine
  108. Instanz eines Layout Objektes als Instanz für den Konstruktor akzeptieren. Andernfalls
  109. sind die Details der Implementation in eigenen Händen.
  110. </para>
  111. <para>
  112. Die Standardmäßig verwendete Plugin Klasse ist
  113. <classname>Zend_Layout_Controller_Plugin_Layout</classname>.
  114. </para>
  115. </sect2>
  116. <sect2 id="zend.layout.advanced.helper">
  117. <title>Eigene Action Helfer</title>
  118. <para>
  119. Wenn <classname>Zend_Layout</classname> mit den <acronym>MVC</acronym> Komponenten
  120. verwendet wird, registriert es einen Action Controller Helfer mit dem Helfer Broker. Der
  121. Standardhelfer, <classname>Zend_Layout_Controller_Action_Helper_Layout</classname>
  122. arbeitet als dummer Proxy zur Layout Objekt Instanz selbst, und sollte für die meisten
  123. Zwecke ausreichend sein.
  124. </para>
  125. <para>
  126. Sollte es gewünscht sein eigene Funktionalitäten zu schreiben, kann einfach eine Action
  127. Helfer Klasse geschrieben werden die
  128. <classname>Zend_Controller_Action_Helper_Abstract</classname> erweitert und den
  129. Klassennamen als <property>helperClass</property> Option an die
  130. <methodname>startMvc()</methodname> Methode übergeben werden. Details der Implementiert
  131. oblieben jedem selbst.
  132. </para>
  133. </sect2>
  134. <sect2 id="zend.layout.advanced.inflector">
  135. <title>Auflösung eigener Layout Skript Pfade: Verwenden der Beugung</title>
  136. <para>
  137. <classname>Zend_Layout</classname> verwendet
  138. <classname>Zend_Filter_Inflector</classname> um eine Filterkette zu erstellen für die
  139. Übersetzung eines Layout Namens zu einem Layout Skript Pfad. Standardmäßig verwendet es
  140. die 'Word_CamelCaseToDash' Regeln gefolgt von 'StringToLower' und dem Anhang 'phtml' um
  141. den Namen in einen Pfad zu transformieren. Einige Beispiele:
  142. </para>
  143. <itemizedlist>
  144. <listitem><para>'foo' wird zu 'foo.phtml' transformiert.</para></listitem>
  145. <listitem><para>'FooBarBaz' wird zu 'foo-bar-baz.phtml' transformiert.</para></listitem>
  146. </itemizedlist>
  147. <para>
  148. Es gibt drei Optionen für die Änderung der Beugung: Änderung des Beuzungszieles und/oder
  149. des View Suffix über <classname>Zend_Layout</classname> Zugriffsmethoden, änderung der
  150. Beugungsregeln und des Ziels der Beugung die mit der <classname>Zend_Layout</classname>
  151. Instanz gekoppelt ist, oder Erstellung einer eigenen Beugungsinstanz und dessen Übergabe
  152. an <methodname>Zend_Layout::setInflector()</methodname>.
  153. </para>
  154. <example id="zend.layout.advanced.inflector.accessors">
  155. <title>Verwenden von Zend_Layout Zugriffsmethoden zur Änderung der Beugung</title>
  156. <para>
  157. Der standardmäßige <classname>Zend_Layout</classname> Beugungsmechanismus verwendet
  158. statische Referenzen für das Ziel und View Skript Suffix, und besitzt
  159. Zugriffsmethoden für das setzen dieser Werte.
  160. </para>
  161. <programlisting language="php"><![CDATA[
  162. // Setzen des Beugungsziel:
  163. $layout->setInflectorTarget('layouts/:script.:suffix');
  164. // Setzen des Layout View Skript Suffix:
  165. $layout->setViewSuffix('php');
  166. ]]></programlisting>
  167. </example>
  168. <example id="zend.layout.advanced.inflector.directmodification">
  169. <title>Direkte Änderung der Zend_Layout Beugung</title>
  170. <para>
  171. Beugung hat ein Ziel und ein oder mehrere Regeln. Das Standardziel das von
  172. <classname>Zend_Layout</classname> verwendet wird ist: ':script.:suffix'; ':script'
  173. wird als registrierter Layoutname übergeben, während ':suffix' eine statische Regel
  174. der Beugung ist.
  175. </para>
  176. <para>
  177. Angenommen man will dass das Layout Skript mit der Endung 'html' endet, und es ist
  178. gewünscht das MixedCase und camelCased Wörter mit Unterstrichen statt Bindestrichen
  179. getrennt werden und der Name nicht kleingeschrieben wird. Zusätzlich ist es
  180. gewünscht in einem 'layouts' Unterverzeichnis nach den Skripten nachzuschauen.
  181. </para>
  182. <programlisting language="php"><![CDATA[
  183. $layout->getInflector()->setTarget('layouts/:script.:suffix')
  184. ->setStaticRule('suffix', 'html')
  185. ->setFilterRule(array('Word_CamelCaseToUnderscore'));
  186. ]]></programlisting>
  187. </example>
  188. <example id="zend.layout.advanced.inflector.custom">
  189. <title>Eigene Beugung</title>
  190. <para>
  191. In den meisten Fällen ist es ausreichend den bestehenden Beugungsmechanismus zu
  192. verändern. Trotzdem kann man eine Beugung haben die in verschiedenen Orten verwendet
  193. werden soll, mit unterschiedlichen Objekten von unterschiedlichen Typen.
  194. <classname>Zend_Layout</classname> unterstützt das.
  195. </para>
  196. <programlisting language="php"><![CDATA[
  197. $inflector = new Zend_Filter_Inflector('layouts/:script.:suffix');
  198. $inflector->addRules(array(
  199. ':script' => array('Word_CamelCaseToUnderscore'),
  200. 'suffix' => 'html'
  201. ));
  202. $layout->setInflector($inflector);
  203. ]]></programlisting>
  204. </example>
  205. <note>
  206. <title>Beugung kann ausgeschaltet werden</title>
  207. <para>
  208. Beugung kann ausgeschaltet und eingeschaltet werden indem eine zugriffsmethode auf
  209. dem <classname>Zend_Layout</classname> Objekt verwendet wird. Das kann nützlich sein
  210. wenn man einen absoluten Pfad für ein Layout Skript spezifizieren will, oder man
  211. weiß das der Mechanismus den man für die Spezifikation des Layout Skripts verwenden
  212. will, keine Beugung benötigt. Es können einfach die
  213. <methodname>enableInflection()</methodname> und
  214. <methodname>disableInflection()</methodname> Methoden verwendet werden.
  215. </para>
  216. </note>
  217. </sect2>
  218. </sect1>