<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 15617 -->
<!-- Reviewed: no -->
<sect1 id="zend.view.introduction">
    <title>Introduction</title>

    <para>
        <classname>Zend_View</classname> est une classe qui permet de travailler avec la
        partie "Vue" du motif de conception Modèle-Vue-Contrôleur. Elle existe pour aider à garder
        la vue séparée du modèle et des scripts du contrôleur. Elle fournie un système d'aide, de
        filtres d'affichage, et d'échappement de variables.
    </para>

    <para>
        <classname>Zend_View</classname> est un système de template agnostique ; vous pouvez
        utiliser PHP comme langage de template, ou créer des instances d'autres systèmes de
        templates, et les manipuler à travers les scripts de vue.
    </para>

    <para>
        L'utilisation de <classname>Zend_View</classname> se déroule en deux étapes
        principales : 1. Votre script de contrôleur crée une instance de
        <classname>Zend_View</classname> et assigne des variables à cette instance. 2. Le contrôleur
        dit à <classname>Zend_View</classname> d'effectuer le rendu d'une vue particulière, et de ce
        fait va donner le contrôle au script de vue, qui va générer l'affichage.
    </para>

    <sect2 id="zend.view.introduction.controller">
        <title>Script du Contrôleur</title>

        <para>
            Comme exemple simple, imaginons que votre contrôleur aie une liste de données sur
            des livres qu'il veut afficher en passant par une vue. Le contrôleur pourrait alors
            ressembler à ceci :
        </para>

        <programlisting language="php"><![CDATA[
// utilise un modèle pour obtenir les données sur les livres :
// auteurs et titres
$data = array(
    array(
        'auteur' => 'Hernando de Soto',
        'titre' => 'Le mystère du capitalisme'
    ),
    array(
        'auteur' => 'Henry Hazlitt',
        'titre' => 'Les sciences économique en un cours'
    ),
    array(
        'auteur' => 'Milton Friedman',
        'titre' => 'Libre de choisir'
    )
);

// assigniation des données du livre à une instance Zend_View
Zend_Loader::loadClass('Zend_View');
$view = new Zend_View();
$view->books = $data;

// et appel du script de rendu d'affichage appelé "booklist.php"
echo $view->render('booklist.php');
]]></programlisting>
    </sect2>

    <sect2 id="zend.view.introduction.view">
        <title>Script de vue</title>

        <para>
            Maintenant, nous avons besoin d'associer le script de vue
            "<filename>booklist.php</filename>". C'est un script PHP comme les autres, à une
            exception près : il s'exécute dans la portée de l'instance
            <classname>Zend_View</classname>, ce qui veut dire que les référence à
            <code>$this</code> pointent vers les attributs et les méthodes de
            <classname>Zend_View</classname>. (Les variables assignées à l'instance par le
            contrôleur sont des propriétés publiques de l'instance
            <classname>Zend_View</classname>). Ainsi un script de vue de base pourrait ressembler à
            ceci :
        </para>

        <programlisting language="php"><![CDATA[
<?php if ($this->books): ?>

    <!-- La table des livres -->
    <table>
        <tr>
            <th>Auteur</th>
            <th>Titre</th>
        </tr>

        <?php foreach ($this->books as $key => $val): ?>
        <tr>
            <td><?php echo $this->escape($val['auteur']) ?></td>
            <td><?php echo $this->escape($val['titre']) ?></td>
        </tr>
        <?php endforeach; ?>

    </table>

<?php else: ?>

    <p>Aucun livre à afficher</p>

<?php endif; ?>
]]></programlisting>

        <para>
            Notez l'utilisation de la méthode <code>escape</code> pour échapper les variables
            à afficher.
        </para>
    </sect2>

    <sect2 id="zend.view.introduction.options">
        <title>Options</title>

        <para>
            <classname>Zend_View</classname> possède plusieurs options qui peuvent être
            réglées pour changer le comportement de vos scripts de vues.
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    <code>basePath</code> : indique le chemin de base où peuvent être trouvés
                    les dossiers de scripts, d'aides et de filtres. Il considère une structure de
                    dossiers de ce type :
                </para>

                <programlisting language="php"><![CDATA[
chemin/vers/
    helpers/
    filters/
    scripts/
]]></programlisting>

                <para>
                    Ceci peut être paramétré via les méthodes <code>setBasePath()</code>,
                    <code>addBasePath()</code>, ou l'option <code>basePath</code> du
                    constructeur.
                </para>
            </listitem>

            <listitem>
                <para>
                    <code>encoding</code> : indique l'encodage de caractère à utiliser avec
                    <code>htmlentities()</code>, <code>htmlspecialchars()</code>, et tout autre
                    opération. La valeur par défaut est ISO-8859-1 (latin1). Il peut être paramétré
                    avec la méthode <code>setEncoding()</code> ou l'option <code>encoding</code> du
                    constructeur.
                </para>
            </listitem>

            <listitem>
                <para>
                    <code>escape</code> : indique le callback que doit utiliser
                    <code>escape()</code>. Ceci pet être paramétré avec la méthode
                    <code>setEscape()</code> ou l'option <code>escape</code> du constructeur.
                </para>
            </listitem>

            <listitem>
                <para>
                    <code>filter</code> : indique un filtre à utiliser avant d'effectuer le
                    rendu d'un script de vue. Ceci peut être paramétré avec les méthodes
                    <code>setFilter()</code>, <code>addFilter()</code>, ou l'option
                    <code>filter</code> du constructeur.
                </para>
            </listitem>

            <listitem>
                <para>
                    <code>strictVars</code> : force <classname>Zend_View</classname> à émettre
                    des "notices" et des "warnings" quand des variables non initialisées sont lues.
                    Ceci peut être activé en appelant <code>strictVars(true)</code> ou en passant
                    l'option <code>strictVars</code> au constructeur.
                </para>
            </listitem>
        </itemizedlist>
    </sect2>

    <sect2 id="zend.view.introduction.shortTags">
        <title>Balises courtes dans les scripts de vue</title>

        <para>
            Dans nos exemples et notre documentation, nous utilisons les balises courtes PHP :
            <code>&lt;?</code> and <code>&lt;?=</code>. De plus, nous utilisons parfois <ulink
            url="http://us.php.net/manual/en/control-structures.alternative-syntax.php">la syntaxe
            alternative des structures de contrôle</ulink>. Ce sont des éléments pratiques à
            utiliser lors de la rédaction de vos scripts de vue, car elles rendent les constructions
            plus laconiques, et maintiennent les instructions sur des lignes uniques.
        </para>

        <para>
            Ceci étant dit, de nombreux développeurs préfère utiliser la forme complète pour
            des questions de validation ou de portabilité. Par exemple, <code>short_open_tag</code>
            est désactivé dans le <firstterm>php.ini.recommended</firstterm>, et si vous avez du XML
            dans vos scripts de vue, alors les balises courtes entraîneront un échec de validation
            du modèle.
        </para>

        <para>
            De plus, si vous utilisez les balises courtes avec un réglage du paramètre à
            "off", alors les scripts de vue vont soit entraîner des erreurs, soit simplement
            afficher le code à l'utilisateur.
        </para>

        <para>
            Pour ce dernier cas, quand vous souhaitez utiliser les balises courtes mais
            qu'elles sont désactivées, vous avez deux options :
        </para>

        <itemizedlist>
            <listitem>
                <para>Activer les dans votre fichier <code>.htaccess</code> :</para>

                <programlisting language="apache"><![CDATA[
php_value "short_open_tag" "on"
]]></programlisting>

                <para>
                    Ceci est seulement possible si vous êtes autorisé à créer et utiliser les
                    fichiers <code>.htaccess</code>. Cette directive peut aussi être ajoutée à votre
                    fichier <code>httpd.conf</code>.
                </para>
            </listitem>

            <listitem>
                <para>
                    Activer une enveloppe de flux ("stream wrapper") optionnelle pour
                    convertir les balises courtes en balises longues à la volée :
                </para>

                <programlisting language="php"><![CDATA[
$view->setUseStreamWrapper(true);
]]></programlisting>

                <para>
                    Ceci enregistre <classname>Zend_View_Stream</classname> en tant que
                    enveloppe de flux pour les scripts de vue, et permet de s'assurer que votre code
                    continue à fonctionner comme si les balises courtes étaient activées.
                </para>
            </listitem>
        </itemizedlist>

        <note>
            <title>Les enveloppes de flux de vue dégradent les performances</title>

            <para>
                L'utilisation d'enveloppe de flux <emphasis>dégradera</emphasis> les
                performances de votre application, bien que les tests de performance réels sont
                indisponibles pour quantifier le niveau de dégradation. Nous recommandons donc soit
                d'activer les balises courtes, soit de convertir vos scripts pour utiliser la forme
                longue, ou d'avoir une bonne stratégie de mise en cache partielle ou totale du
                contenu de vos pages.
            </para>
        </note>
    </sect2>

    <sect2 id="zend.view.introduction.accessors">
        <title>Accesseurs utiles</title>

        <para>
            Typiquement, vous ne devriez seulement avoir besoin d'appeler les méthodes
            <code>assign()</code>, <code>render()</code>, ou une des méthodes pour le
            paramétrage/l'ajout de chemins de filtre, d'aide et de script de vues. Cependant, si
            vous souhaitez étendre <classname>Zend_View</classname> vous-même, ou avez besoin
            d'accéder à quelques unes de ces méthodes internes, un certain nombre d'accesseurs
            existent :
        </para>

        <itemizedlist>
            <listitem>
                <para><code>getVars()</code> retournera toutes les variables assignées.</para>
            </listitem>

            <listitem>
                <para>
                    <code>clearVars()</code> effacera toutes les variables assignées ; utile
                    si vous souhaitez ré-utiliser un objet de vue, ou contrôler les variables qui
                    sont disponibles.
                </para>
            </listitem>

            <listitem>
                <para>
                    <code>getScriptPath($script)</code> récupérera le chemin résolu vers un
                    script donné..
                </para>
            </listitem>

            <listitem>
                <para>
                    <code>getScriptPaths()</code> récupérera tous les chemins vers les scripts
                    de vues enregistrés.
                </para>
            </listitem>

            <listitem>
                <para>
                    <code>getHelperPath($helper)</code> récupérera le chemin résolu vers une
                    classe d'aide nommée.
                </para>
            </listitem>

            <listitem>
                <para>
                    <code>getHelperPaths()</code> récupérera tous les chemins vers les aides
                    enregistrés.
                </para>
            </listitem>

            <listitem>
                <para>
                    <code>getFilterPath($filter)</code> récupérera le chemin résolu vers une
                    classe de filtre nommée.
                </para>
            </listitem>

            <listitem>
                <para>
                    <code>getFilterPaths()</code> récupérera tous les chemins vers les filtres
                    enregistrés.
                </para>
            </listitem>
        </itemizedlist>
    </sect2>
</sect1>