File: Zend_View-Introduction.xml

package info (click to toggle)
zendframework 1.12.9%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: jessie-kfreebsd
  • size: 133,584 kB
  • sloc: xml: 1,311,829; php: 570,173; sh: 170; makefile: 125; sql: 121
file content (326 lines) | stat: -rw-r--r-- 13,276 bytes parent folder | download | duplicates (2)
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>&lt;?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>&lt;?</emphasis> und <emphasis>&lt;?=</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>