Zend_View-Controllers.xml 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- EN-Revision: 24249 -->
  3. <!-- Reviewed: no -->
  4. <sect1 id="zend.view.controllers">
  5. <title>Scripts de contrôleur</title>
  6. <para>
  7. Le contrôleur est l'endroit où vous instanciez et configurez
  8. <classname>Zend_View</classname>. Vous assignez ensuite des variables à la vue, et lui dites
  9. comment effectuer le rendu en utilisant un script particulier.
  10. </para>
  11. <sect2 id="zend.view.controllers.assign">
  12. <title>Assigner des variables</title>
  13. <para>
  14. Votre script de contrôleur devrait assigner les variables nécessaires à la vue
  15. avant de passer le contrôle au script de vue. Normalement vous pouvez faire les
  16. assignations une par une en assignant les noms des propriétés de l'instance de la vue
  17. :
  18. </para>
  19. <programlisting language="php"><![CDATA[
  20. $view = new Zend_View();
  21. $view->a = "Ha";
  22. $view->b = "Bé";
  23. $view->c = "Cé";
  24. ]]></programlisting>
  25. <para>
  26. Cependant, ceci peut être pénible quand vous avez déjà collecté (dans un tableau
  27. ou dans un objet) les valeurs à assigner.
  28. </para>
  29. <para>
  30. La méthode <methodname>assign()</methodname> vous laisse assigner "en vrac" depuis un tableau
  31. ou un objet. Les exemples suivants ont le même effet que celui ci-dessus.
  32. </para>
  33. <programlisting language="php"><![CDATA[
  34. $view = new Zend_View();
  35. // assigne un tableau de paires clés/valeurs, où la clé
  36. // est le nom de la variable, et la valeur, sa valeur assignée
  37. $array = array(
  38. 'a' => "Ha",
  39. 'b' => "Bé",
  40. 'c' => "Cé",
  41. );
  42. $view->assign($array);
  43. // fait pareil avec les propriétés publiques d'un objet
  44. // notez le transtypage lors de l'assignation
  45. $obj = new StdClass;
  46. $obj->a = "Ha";
  47. $obj->b = "Bé";
  48. $obj->c = "Cé";
  49. $view->assign((array) $obj);
  50. ]]></programlisting>
  51. <para>
  52. Alternativement, vous pouvez utiliser la méthode <methodname>assign()</methodname> pour
  53. assigner les variables une par une, en passant le nom de la variable, et sa
  54. valeur.
  55. </para>
  56. <programlisting language="php"><![CDATA[
  57. $view = new Zend_View();
  58. $view->assign('a', "Ha");
  59. $view->assign('b', "Bé");
  60. $view->assign('c', "Cé");
  61. ]]></programlisting>
  62. </sect2>
  63. <sect2 id="zend.view.controllers.render">
  64. <title>Effectuer le rendu d'un script de vue</title>
  65. <para>
  66. Une fois que vous avez assigné toutes les variables dont vous avez besoin, le
  67. contrôleur devrait demander à <classname>Zend_View</classname> de rendre un script de
  68. vue particulier. Faites cela en appelant la méthode <methodname>render()</methodname>. Notez que la
  69. méthode va retourner la vue rendue, mais ne va pas l'afficher, vous devez donc
  70. l'afficher vous même avec <code>print</code> ou <code>echo</code>, au moment
  71. voulu.
  72. </para>
  73. <programlisting language="php"><![CDATA[
  74. $view = new Zend_View();
  75. $view->a = "Ha";
  76. $view->b = "Bé";
  77. $view->c = "Cé";
  78. echo $view->render('uneVue.php');
  79. ]]></programlisting>
  80. </sect2>
  81. <sect2 id="zend.view.controllers.script-paths">
  82. <title>Chemin des scripts de vue</title>
  83. <para>
  84. Par défaut, <classname>Zend_View</classname> s'attend à ce que vos scripts de vues
  85. soient dans le même dossier que celui du contrôleur. Par exemple, si le script du
  86. contrôleur est dans "/chemin/des/controleurs" et qu'il appelle
  87. <code>$view-&gt;render('uneVue.php')</code>, <classname>Zend_View</classname> va
  88. rechercher "/chemin/des/controleurs/uneVue.php".
  89. </para>
  90. <para>
  91. Évidemment, vos scripts sont peut-être localisés ailleurs. Pour dire à
  92. <classname>Zend_View</classname> ou il doit chercher, utilisez la méthode
  93. <methodname>setScriptPath()</methodname>.
  94. </para>
  95. <programlisting language="php"><![CDATA[
  96. $view = new Zend_View();
  97. $view->setScriptPath('/chemin/des/vues');
  98. ]]></programlisting>
  99. <para>
  100. Maintenant, vous appelez <code>$view-&gt;render('uneVue.php')</code>, il va
  101. rechercher dans "<filename>/chemin/des/vues/uneVue.php</filename>".
  102. </para>
  103. <para>
  104. En fait, vous pouvez "empiler" les chemins en utilisant la méthode
  105. <methodname>setScriptPath()</methodname>. Comme vous ajoutez des chemins dans la pile,
  106. <classname>Zend_View</classname> va rechercher le script de vue dans le chemin le plus
  107. récemment ajouté. Cela vous permet de passer outre les vues par défaut, pour des vues
  108. personnalisées. Ainsi vous pouvez créer des "thèmes" ou des "skins" pour certaines vues,
  109. pendant que vous laissez les autres intactes.
  110. </para>
  111. <programlisting language="php"><![CDATA[
  112. $view = new Zend_View();
  113. $view->addScriptPath('/chemin/des/vues');
  114. $view->addScriptPath('/chemin/des/vues-personnalisees');
  115. // maintenant, lorsque vous appelerez $view->render('listelivre.php'),
  116. // Zend_View va rechercher en premier dans
  117. // "/chemin/des/vues-personnalisees/listelivre.php", puis
  118. // dans "/chemin/des/vues/listelivre.php", et ensuite dans le répertoire
  119. // courant pour trouver le fichier "listelivre.php".
  120. ]]></programlisting>
  121. <note>
  122. <title>Ne jamais utiliser une entrée utilisateur pour spécifier les chemins vers les
  123. scripts de vues</title>
  124. <para>
  125. <classname>Zend_View</classname> utilise des chemins dans lesquels elle
  126. cherche et effectue le rendu des scripts de vues. En soi, ces dossiers devraient
  127. être connus à l'avance, et sous votre contrôle. <emphasis>Ne jamais</emphasis>
  128. spécifier des dossiers de scripts de vues sur la base d'une entrée utilisateur, car
  129. vous pourriez ainsi avoir une vulnérabilité d'inclusion de fichier non voulu si les
  130. chemins spécifiés par l'utilisateur sont traversant. Par exemple, le code suivant
  131. peut générer un problème :
  132. </para>
  133. <programlisting language="php"><![CDATA[
  134. // $_GET['foo'] == '../../../etc'
  135. $view->addScriptPath($_GET['foo']);
  136. $view->render('passwd');
  137. ]]></programlisting>
  138. <para>
  139. De la manière dont cet exemple est conçu, il montre clairement le problème
  140. potentiel. Si vous <emphasis>devez</emphasis> compter sur l'entrée d'utilisateur
  141. pour placer votre chemin de scripts, filtrez correctement l'entrée et contrôlez pour
  142. vous assurer que ces chemins sont contrôlés par votre application.
  143. </para>
  144. </note>
  145. </sect2>
  146. </sect1>