| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 15156 -->
- <!-- 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 Kontroller Plugins.</emphasis> <classname>Zend_Layout</classname> wird mit einem
- Standard Front Kontroller 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/<code>startMvc()</code>
- übergeben werden, oder es mit der <code>setView()</code> Zugriffsmethode gesetzt werden:
- </para>
- <programlisting role="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 <code>render()</code> 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 role="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 MVC Komponenten verwendet wird, registriert es ein Front
- Kontroller Plugin das 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 <code>pluginClass</code> Option an die <code>startMvc()</code> 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 MVC 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 <code>helperClass</code> Option an die <code>startMvc()</code> 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 <classname>Zend_Layout::setInflector()</classname>.
- </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 role="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ärend ':suffix' eine statische Regel der Beugung ist.
- </para>
- <para>
- Angenommen man will das 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 role="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 role="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 <code>enableInflection()</code> und <code>disableInflection()</code>
- Methoden verwendet werden.
- </para>
- </note>
- </sect2>
- </sect1>
- <!--
- vim:se ts=4 sw=4 et:
- -->
|