Zend_View-Controllers.xml 6.1 KB

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