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