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