| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 |
- <?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>
|