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