| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 24249 -->
- <!-- Reviewed: no -->
- <sect1 id="zend.view.controllers">
- <title>Scripts de contrôleur</title>
- <para>
- Le contrôleur est l'endroit où vous instanciez et configurez
- <classname>Zend_View</classname>. Vous assignez ensuite des variables à la vue, et lui dites
- comment effectuer le rendu en utilisant un script particulier.
- </para>
- <sect2 id="zend.view.controllers.assign">
- <title>Assigner des variables</title>
- <para>
- Votre script de contrôleur devrait assigner les variables nécessaires à la vue
- avant de passer le contrôle au script de vue. Normalement vous pouvez faire les
- assignations une par une en assignant les noms des propriétés de l'instance de la vue
- :
- </para>
- <programlisting language="php"><![CDATA[
- $view = new Zend_View();
- $view->a = "Ha";
- $view->b = "Bé";
- $view->c = "Cé";
- ]]></programlisting>
- <para>
- Cependant, ceci peut être pénible quand vous avez déjà collecté (dans un tableau
- ou dans un objet) les valeurs à assigner.
- </para>
- <para>
- La méthode <methodname>assign()</methodname> vous laisse assigner "en vrac" depuis un tableau
- ou un objet. Les exemples suivants ont le même effet que celui ci-dessus.
- </para>
- <programlisting language="php"><![CDATA[
- $view = new Zend_View();
- // assigne un tableau de paires clés/valeurs, où la clé
- // est le nom de la variable, et la valeur, sa valeur assignée
- $array = array(
- 'a' => "Ha",
- 'b' => "Bé",
- 'c' => "Cé",
- );
- $view->assign($array);
- // fait pareil avec les propriétés publiques d'un objet
- // notez le transtypage lors de l'assignation
- $obj = new StdClass;
- $obj->a = "Ha";
- $obj->b = "Bé";
- $obj->c = "Cé";
- $view->assign((array) $obj);
- ]]></programlisting>
- <para>
- Alternativement, vous pouvez utiliser la méthode <methodname>assign()</methodname> pour
- assigner les variables une par une, en passant le nom de la variable, et sa
- valeur.
- </para>
- <programlisting language="php"><![CDATA[
- $view = new Zend_View();
- $view->assign('a', "Ha");
- $view->assign('b', "Bé");
- $view->assign('c', "Cé");
- ]]></programlisting>
- </sect2>
- <sect2 id="zend.view.controllers.render">
- <title>Effectuer le rendu d'un script de vue</title>
- <para>
- Une fois que vous avez assigné toutes les variables dont vous avez besoin, le
- contrôleur devrait demander à <classname>Zend_View</classname> de rendre un script de
- vue particulier. Faites cela en appelant la méthode <methodname>render()</methodname>. Notez que la
- méthode va retourner la vue rendue, mais ne va pas l'afficher, vous devez donc
- l'afficher vous même avec <code>print</code> ou <code>echo</code>, au moment
- voulu.
- </para>
- <programlisting language="php"><![CDATA[
- $view = new Zend_View();
- $view->a = "Ha";
- $view->b = "Bé";
- $view->c = "Cé";
- echo $view->render('uneVue.php');
- ]]></programlisting>
- </sect2>
- <sect2 id="zend.view.controllers.script-paths">
- <title>Chemin des scripts de vue</title>
- <para>
- Par défaut, <classname>Zend_View</classname> s'attend à ce que vos scripts de vues
- soient dans le même dossier que celui du contrôleur. Par exemple, si le script du
- contrôleur est dans "/chemin/des/controleurs" et qu'il appelle
- <code>$view->render('uneVue.php')</code>, <classname>Zend_View</classname> va
- rechercher "/chemin/des/controleurs/uneVue.php".
- </para>
- <para>
- Évidemment, vos scripts sont peut-être localisés ailleurs. Pour dire à
- <classname>Zend_View</classname> ou il doit chercher, utilisez la méthode
- <methodname>setScriptPath()</methodname>.
- </para>
- <programlisting language="php"><![CDATA[
- $view = new Zend_View();
- $view->setScriptPath('/chemin/des/vues');
- ]]></programlisting>
- <para>
- Maintenant, vous appelez <code>$view->render('uneVue.php')</code>, il va
- rechercher dans "<filename>/chemin/des/vues/uneVue.php</filename>".
- </para>
- <para>
- En fait, vous pouvez "empiler" les chemins en utilisant la méthode
- <methodname>setScriptPath()</methodname>. Comme vous ajoutez des chemins dans la pile,
- <classname>Zend_View</classname> va rechercher le script de vue dans le chemin le plus
- récemment ajouté. Cela vous permet de passer outre les vues par défaut, pour des vues
- personnalisées. Ainsi vous pouvez créer des "thèmes" ou des "skins" pour certaines vues,
- pendant que vous laissez les autres intactes.
- </para>
- <programlisting language="php"><![CDATA[
- $view = new Zend_View();
- $view->addScriptPath('/chemin/des/vues');
- $view->addScriptPath('/chemin/des/vues-personnalisees');
- // maintenant, lorsque vous appelerez $view->render('listelivre.php'),
- // Zend_View va rechercher en premier dans
- // "/chemin/des/vues-personnalisees/listelivre.php", puis
- // dans "/chemin/des/vues/listelivre.php", et ensuite dans le répertoire
- // courant pour trouver le fichier "listelivre.php".
- ]]></programlisting>
- <note>
- <title>Ne jamais utiliser une entrée utilisateur pour spécifier les chemins vers les
- scripts de vues</title>
- <para>
- <classname>Zend_View</classname> utilise des chemins dans lesquels elle
- cherche et effectue le rendu des scripts de vues. En soi, ces dossiers devraient
- être connus à l'avance, et sous votre contrôle. <emphasis>Ne jamais</emphasis>
- spécifier des dossiers de scripts de vues sur la base d'une entrée utilisateur, car
- vous pourriez ainsi avoir une vulnérabilité d'inclusion de fichier non voulu si les
- chemins spécifiés par l'utilisateur sont traversant. Par exemple, le code suivant
- peut générer un problème :
- </para>
- <programlisting language="php"><![CDATA[
- // $_GET['foo'] == '../../../etc'
- $view->addScriptPath($_GET['foo']);
- $view->render('passwd');
- ]]></programlisting>
- <para>
- De la manière dont cet exemple est conçu, il montre clairement le problème
- potentiel. Si vous <emphasis>devez</emphasis> compter sur l'entrée d'utilisateur
- pour placer votre chemin de scripts, filtrez correctement l'entrée et contrôlez pour
- vous assurer que ces chemins sont contrôlés par votre application.
- </para>
- </note>
- </sect2>
- </sect1>
|