| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 24249 -->
- <!-- Reviewed: no -->
- <sect1 id="zend.view.controllers">
- <title>Controller Skripte</title>
- <para>
- Der Controller ist der Ort, wo du <classname>Zend_View</classname> instanziieren und
- konfigurieren kannst. Du übergibst dann die Variablen an den View und teilst ihm mit,
- welches bestimmte Skript für die Ausgabe benutzt werden soll.
- </para>
- <sect2 id="zend.view.controllers.assign">
- <title>Variablen übergeben</title>
- <para>
- Dein Controller Skript sollte notwendige Variablen an den View übergeben, bevor es die
- Kontrolle an das View Skript übergibt. Normalerweise kannst du eine Variable nach der
- anderen übergeben und an den bezeichneten Eigenschaften der View Instanz zuordnen.
- </para>
- <programlisting language="php"><![CDATA[
- $view = new Zend_View();
- $view->a = "Hay";
- $view->b = "Bee";
- $view->c = "Sea";
- ]]></programlisting>
- <para>
- Allerdings kann dies mühsam sein, wenn du bereits alle Werte gesammelt hast, um sie
- einem Array oder einem Objekt zuzuordnen.
- </para>
- <para>
- Mit der assign() Methode kannst Du auch ein Array oder ein Objekt auf einmal übergeben.
- Das folgende Beispiel hat den selben Effekt wie die obigen einzelnen Übergaben.
- </para>
- <programlisting language="php"><![CDATA[
- $view = new Zend_View();
- // übergebe ein Array mit Schlüssel-Wert Paaren,
- // wo der Schlüssel der Variablenname und der
- // Wert die übergebene Variable ist
- $array = array(
- 'a' => "Hay",
- 'b' => "Bee",
- 'c' => "Sea",
- );
- $view->assign($array);
- // mache das selbe mit den öffentlichen Eigenschaften
- // eines Objektes; beachte wir wir das Objekt beim
- // Übergeben in ein Array umwandeln
- $obj = new StdClass;
- $obj->a = "Hay";
- $obj->b = "Bee";
- $obj->c = "Sea";
- $view->assign((array) $obj);
- ]]></programlisting>
- <para>
- Alternativ kannst du die assign() Methode auch benutzen, um nacheinander einen
- Variablennamen und den Wert der Variable zu übergeben.
- </para>
- <programlisting language="php"><![CDATA[
- $view = new Zend_View();
- $view->assign('a', "Hay");
- $view->assign('b', "Bee");
- $view->assign('c', "Sea");
- ]]></programlisting>
- </sect2>
- <sect2 id="zend.view.controllers.render">
- <title>Verarbeitung eines View Skripts</title>
- <para>
- Sobald du alle notwendigen Variablen übergeben hast, sollte der Controller dem
- <classname>Zend_View</classname> mitteilen, ein bestimmtes View Skript zu verarbeiten.
- Dies funktioniert über die render() Methode. Beachte, dass diese Methode die
- verarbeitete Ausgabe zurück- aber nicht ausgibt, so dass du die Ausgabe selber zur
- passenden Zeit per echo() oder print() ausgeben musst.
- </para>
- <programlisting language="php"><![CDATA[
- $view = new Zend_View();
- $view->a = "Hay";
- $view->b = "Bee";
- $view->c = "Sea";
- echo $view->render('someView.php');
- ]]></programlisting>
- </sect2>
- <sect2 id="zend.view.controllers.script-paths">
- <title>Pfade für View Skripte</title>
- <para>
- Standardmäßig erwartet <classname>Zend_View</classname>, dass deine View Skripte im
- selben Verzeichnis wie das Conntroller Skript liegen. Wenn dein Controller Skript zum
- Beispiel im Pfad "/path/to/app/controllers" liegt und es $view->render('someView.php')
- aufruft, wird <classname>Zend_View</classname> nach der Datei
- "/path/to/app/controllers/someView.php" schauen.
- </para>
- <para>
- Es ist durchaus wahrscheinlich, dass deine View Skripte woanders liegen. Verwende
- die setScriptPath() Methode, um <classname>Zend_View</classname> mitzuteilen, wo es nach
- View Skripten schauen soll.
- </para>
- <programlisting language="php"><![CDATA[
- $view = new Zend_View();
- $view->setScriptPath('/path/to/app/views');
- ]]></programlisting>
- <para>
- Wenn du nun $view->render('someView.php') aufrufst, wird es nach der Datei
- "/path/to/app/views/someView.php" schauen.
- </para>
- <para>
- Durch Verwendung der addScriptPath() Methode können die Pfade "gestapelt" werden. Wenn
- du Pfade zu diesem Stapelspeicher hinzufügst, wird <classname>Zend_View</classname> im
- zuletzt hinzugefügten Pfad nach dem angeforderten View Skript schauen. Dies erlaubt dir,
- Standard Views mit spezialisierten Views zu überschreiben, so dass Du "Themen"
- oder "Skins" für einige Views erstellen kannst, während du andere bestehen lässt.
- </para>
- <programlisting language="php"><![CDATA[
- $view = new Zend_View();
- $view->addScriptPath('/path/to/app/views');
- $view->addScriptPath('/path/to/custom/');
- // wenn du nun $view->render('booklist.php') aufrufst, wird
- // Zend_View zuerst nach der Datei "/path/to/custom/booklist.php",
- // dann nach "/path/to/app/views/booklist.php" und zuguterletzt
- // im aktuellen Pfad nach der Datei "booklist.php" schauen
- ]]></programlisting>
- <note>
- <title>Benutze nie Eingaben des Benutzers um den Skriptpfad zu setzen</title>
- <para>
- <classname>Zend_View</classname> verwendet Skriptpfade um Viewskripte zu eruieren
- und Sie darzustellen. Deshalb sollten diese Verzeichnisse im Vorhinein bekannt sein,
- und unter der eigenen Kontrolle. <emphasis>Niemals</emphasis> sollten Pfade von
- Viewskripten basierend auf Benutzereingaben gesetzt werden, da diese dazu führen
- können das man sich potentiell gegen Local File Inclusion Angriffe öffnet wenn der
- spezifizierte Pfad den Übergang in das Elternverzeichnis enthält. Die folgende
- Eingabe könnte zu Beispiel so einen Fall verursachen:
- </para>
- <programlisting language="php"><![CDATA[
- // $_GET['foo'] == '../../../etc'
- $view->addScriptPath($_GET['foo']);
- $view->render('passwd');
- ]]></programlisting>
- <para>
- Obwohl dieses Beispiel erfunden ist, zeigt es doch sehr klar das potentielle
- Problem. Wenn man Benutzereingaben vertrauen <emphasis>muß</emphasis> um den eigenen
- Skriptpfad zu setzen, muß man die Eingabe entsprechend Filtern und prüfen um
- sicherzustellen das Sie in dem Pfaden existiert die von der eigenen Anwendung
- kontrolliert werden.
- </para>
- </note>
- </sect2>
- </sect1>
|