Zend_Layout-Advanced.xml 12 KB

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