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 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326
|
<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: 22917 -->
<sect1 id="zend.view.introduction">
<title>Einführung</title>
<para>
<classname>Zend_View</classname> ist eine Klasse für die Verarbeitung des "View" Teils des
Model-View-Controller Entwurfsmusters. Er existiert, um das View-Skript von den Model- und
Controller-Skripten zu trennen. Es stellt ein System an Helfern, Ausgabefiltern und
Variablenmaskierung bereit.
</para>
<para>
<classname>Zend_View</classname> ist unabhängig von einem Template-System. Du kannst
<acronym>PHP</acronym> als Template-Sprache verwenden oder Instanzen anderer Template-
Systeme erstellen und diese in deinem View-Skript verarbeiten.
</para>
<para>
Im wesentlichen verläuft die Verwendung von <classname>Zend_View</classname> in zwei
Hauptschritten: 1. Dein Controller-Skript erstellt eine Instanz von
<classname>Zend_View</classname> und übergibt Variablen an diese Instanz. 2. Der Controller
teilt <classname>Zend_View</classname> mit, ein bestimmtes View-Skript zu verarbeiten. Dabei
wird die Kontrolle an das View-Skript übergeben, welches die Ausgabe erstellt.
</para>
<sect2 id="zend.view.introduction.controller">
<title>Controller-Skript</title>
<para>
In einem einfachen Beispiel hat dein Controller-Skript eine Liste von Buchdaten, die
von einem View-Skript verarbeitet werden sollen. Dieses Controller-Skript kann ungefähr
so aussehen:
</para>
<programlisting language="php"><![CDATA[
// verwende ein Modell, um die Daten der Bücher und Autoren zu erhalten
$data = array(
array(
'author' => 'Hernando de Soto',
'title' => 'The Mystery of Capitalism'
),
array(
'author' => 'Henry Hazlitt',
'title' => 'Economics in One Lesson'
),
array(
'author' => 'Milton Friedman',
'title' => 'Free to Choose'
)
);
// nun übergebe die Buchdaten an die Zend_View Instanz
Zend_Loader::loadClass('Zend_View');
$view = new Zend_View();
$view->books = $data;
// und verarbeite ein View Skript mit Namen "booklist.php"
echo $view->render('booklist.php');
]]></programlisting>
</sect2>
<sect2 id="zend.view.introduction.view">
<title>View Skript</title>
<para>
Nun benötigen wir das zugehörige View-Skript "booklist.php". Dies ist ein
<acronym>PHP</acronym>-Skript wie jedes andere mit einer Ausnahme: es wird innerhalb der
Instanz <classname>Zend_View</classname> ausgeführt, was bedeutet, dass Referenzen auf
$this auf die Eigenschaften und Methoden der Instanz <classname>Zend_View</classname>
weisen. (Variablen, die vom Controller an die Instanz übergeben wurden, sind öffentliche
(public) Eigenschaften der <classname>Zend_View</classname> Instanz). Dadurch kann ein
sehr einfaches View-Skript wie folgt aussehen:
</para>
<programlisting language="php"><![CDATA[
<?php if ($this->books): ?>
<!-- Eine Tabelle mit einigen Büchern. -->
<table>
<tr>
<th>Autor</th>
<th>Titel</th>
</tr>
<?php foreach ($this->books as $key => $val): ?>
<tr>
<td><?php echo $this->escape($val['author']) ?></td>
<td><?php echo $this->escape($val['title']) ?></td>
</tr>
<?php endforeach; ?>
</table>
<?php else: ?>
<p>Es gibt keine Bücher zum Anzeigen.</p>
<?php endif;?>
]]></programlisting>
<para>
Beachte, wie wir die "escape()" Methode verwenden, um die Variablen für die Ausgabe zu
maskieren.
</para>
</sect2>
<sect2 id="zend.view.introduction.options">
<title>Optionen</title>
<para>
<classname>Zend_View</classname> hat einige Optionen, die gesetzt werden können, um
das Verhalten deiner View-Skripte zu konfigurieren.
</para>
<itemizedlist>
<listitem>
<para>
<property>basePath</property>: zeigt den Basispfad von dem der Skript-, Helfer-
und Filterpfad gesetzt wird. Es nimmt folgende Verzeichnisstruktur an:
</para>
<programlisting language="php"><![CDATA[
base/path/
helpers/
filters/
scripts/
]]></programlisting>
<para>
Das kann über <methodname>setBasePath()</methodname>,
<methodname>addBasePath()</methodname>, oder die <property>basePath</property>
Option dem Konstruktor gesetzt werden.
</para>
</listitem>
<listitem>
<para>
<property>encoding</property>: gibt das Verschlüsseln der Zeichen für die
Verwendung mit <methodname>htmlentities()</methodname>,
<methodname>htmlspecialchars()</methodname>, und anderen Operationen an.
Standardwert ist UTF-8. Kann über
<methodname>setEncoding()</methodname>, oder die Option <property>encoding</property>
im Constructor, gesetzt werden.
</para>
</listitem>
<listitem>
<para>
<property>escape</property>: gibt eine Callback-Funktion an, welche durch
<methodname>escape()</methodname> benutzt wird. Kann über
<methodname>setEscape()</methodname>, oder die Option <property>escape</property>
im Konstruktor, gesetzt werden.
</para>
</listitem>
<listitem>
<para>
<property>filter</property>: gibt einen Filter an, welcher nach dem Rendern des
View Skripts verwendet wird. Kann über <methodname>setFilter()</methodname>,
<methodname>addFilter()</methodname>, oder die Option <property>filter</property>
im Konstruktor, gesetzt werden.
</para>
</listitem>
<listitem>
<para>
<property>strictVars:</property> zwingt <classname>Zend_View</classname> Notizen
und Warnungen auszugeben, wenn auf nicht initialisierte View-Variablen
zugegriffen wird. Das kann durch den Aufruf von
<methodname>strictVars(true)</methodname>, oder der Übergabe der
Option <property>strictVars</property> im Konstruktor, gesetzt werden.
</para>
</listitem>
</itemizedlist>
</sect2>
<sect2 id="zend.view.introduction.shortTags">
<title>View Skripte mit Short Tags</title>
<para>
In unseren Beispielen verwenden wir <acronym>PHP</acronym> Long
Tags: <emphasis><?php</emphasis>. Wir empfehlen auch die <ulink
url="http://us.php.net/manual/en/control-structures.alternative-syntax.php">
alternative Syntax für Kontrollstrukturen</ulink>. Diese sind übliche Abkürzungen
die verwendet werden, wenn View-Skripte geschrieben werden, da sie Konstrukte
verständlicher machen, die Anweisungen auf einer einzelnen Zeile belassen und die
Notwendigkeit eleminieren nach Klammern im <acronym>HTML</acronym> zu suchen.
</para>
<para>
In vorhergehenden Versionen haben wir oft die Verwendung von Short Tags empfohlen
(<emphasis><?</emphasis> und <emphasis><?=</emphasis>), da sie die View-Skripte
weniger kompliziert machen. Trotzdem ist der Standardwert der
<filename>php.ini</filename>-Option <constant>short_open_tag</constant> typischerweise
in Produktion oder bei Shared Hosts deaktiviert -- was deren Verwendung nicht wirklich
portabel macht. Wenn man <acronym>XML</acronym> in View-Skripten als Template verwendet,
werden Short Open Tags dazu führen das die Prüfung der Templates fehlschlägt.
Letztendlich, wenn man Short Tags verwendet, während <constant>short_open_tag</constant>
ausgeschaltet ist, werden die View Skripte entweder Fehler verursachen oder einfach den
<acronym>PHP</acronym>-Code an den Betrachter zurücksenden.
</para>
<para>
Wenn man trotz der Warnungen Short Tags verwenden will, diese aber ausgeschaltet sind,
hat man zwei Optionen:
</para>
<itemizedlist>
<listitem>
<para>
Die Short Tags in der <filename>.htaccess</filename> Datei einschalten:
</para>
<programlisting language="apache"><![CDATA[
php_value "short_open_tag" "on"
]]></programlisting>
<para>
Das ist nur dann möglich, wenn es erlaubt ist <filename>.htaccess</filename>
Dateien zu erstellen und anzupassen. Diese Direktive kann auch in der
Datei <filename>httpd.conf</filename> hinzugefügt werden.
</para>
</listitem>
<listitem>
<para>
Einen optionalen Stream Wrapper einschalten um Short Tags zu Long Tags on the
fly zu konvertieren:
</para>
<programlisting language="php"><![CDATA[
$view->setUseStreamWrapper(true);
]]></programlisting>
<para>
Das registriert <classname>Zend_View_Stream</classname> als Stream Wrapper für
View-Skripte, und stellt sicher, dass der Code weiterhin funktioniert, wie wenn
Short Tags eingeschaltet wären.
</para>
</listitem>
</itemizedlist>
<warning>
<title>View Stream Wrapper verringert die Geschwindigkeit</title>
<para>
Die Verwendung des Stream Wrapper <emphasis>wird</emphasis> die Geschwindigkeit der
Anwendung verringern, auch wenn es nicht möglich ist, Benchmarks durchzuführen um
den Grad der Verlangsamung festzustellen. Wir empfehlen, dass entweder Short Tags
aktiviert werden, die Skripte volle Tags verwenden, oder eine gute Strategie für
das Cachen von partiellen, und/oder volle Seiteninhalten vorhanden ist.
</para>
</warning>
</sect2>
<sect2 id="zend.view.introduction.accessors">
<title>Zugriff auf Dienstprogramme</title>
<para>
Typischerweise ist es nur notwendig <methodname>assign()</methodname>,
<methodname>render()</methodname>, oder eine der Methoden für das Setzen/Hinzufügen von
Filtern, Helfern und Skript-Pfade aufzurufen. Wenn <classname>Zend_View</classname>
trotzdem selbst erweitert werden soll, oder auf einige der
Internas zugegriffen werden soll, existieren hierfür einige Zugriffsmöglichkeiten:
</para>
<itemizedlist>
<listitem>
<para>
<methodname>getVars()</methodname> gibt alle zugeordneten Variablen zurück.
</para>
</listitem>
<listitem>
<para>
<methodname>clearVars()</methodname> löscht alle zugeordneten Variablen;
Nützlich wenn ein View-Objekt wiederverwendet werden, aber auch kontrolliert
werden soll welche Variablen vorhanden sind.
</para>
</listitem>
<listitem>
<para>
<methodname>getScriptPath($script)</methodname> ruft den aufgelösten Pfad zu
einem gegebenen View-Skript ab.
</para>
</listitem>
<listitem>
<para>
<methodname>getScriptPaths()</methodname> ruft alle registrierten
Skript-Pfade ab.
</para>
</listitem>
<listitem>
<para>
<methodname>getHelperPath($helper)</methodname> ruft den aufgelösten Pfad
zur angegebenen Helferklasse ab.
</para>
</listitem>
<listitem>
<para>
<methodname>getHelperPaths()</methodname> ruft alle registrierten
Helferpfade ab.
</para>
</listitem>
<listitem>
<para>
<methodname>getFilterPath($filter)</methodname> ruft den aufgelösten Pfad
zur angegebenen Filterklasse ab.
</para>
</listitem>
<listitem>
<para>
<methodname>getFilterPaths()</methodname> ruft alle registrierten
Filterpfade ab.
</para>
</listitem>
</itemizedlist>
</sect2>
</sect1>
|