Zend_View-Controllers.xml 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!-- Reviewed: no -->
  3. <sect1 id="zend.view.controllers">
  4. <title>Скрипты контроллеров</title>
  5. <para>
  6. В контроллере вы создаете и конфигурируете экземпляр
  7. <classname>Zend_View</classname>. Затем вы устанавливаете переменные для этого
  8. экземпляра и приказываете ему сгенерировать выходные данные, используя
  9. указанный скрипт вида.
  10. </para>
  11. <sect2 id="zend.view.controllers.assign">
  12. <title>Установка переменных</title>
  13. <para>
  14. Ваш скрипт контроллера должен установить
  15. необходимые переменные до того, как будет передано
  16. управление скрипту вида. Обычно вы можете устанавливать переменные
  17. по одной через объявление свойств экземпляра вида.
  18. </para>
  19. <programlisting language="php"><![CDATA[
  20. $view = new Zend_View();
  21. $view->a = "Hay";
  22. $view->b = "Bee";
  23. $view->c = "Sea";
  24. ]]></programlisting>
  25. <para>
  26. Однако это может показаться утомительным, если вы уже имеете
  27. набор значений для присвоения в массиве или объекте.
  28. </para>
  29. <para>
  30. Метод <code>assign()</code> дает возможность устанавливать значения
  31. из массива или объекта "партиями". Следующий пример делает
  32. то же самое, что и предыдущий с последовательной установкой
  33. переменных.
  34. </para>
  35. <programlisting language="php"><![CDATA[
  36. $view = new Zend_View();
  37. // определение массива из пар ключ-значение, где
  38. // ключ является именем переменной,
  39. // а значение - значением устанавливаемой переменной
  40. $array = array(
  41. 'a' => "Hay",
  42. 'b' => "Bee",
  43. 'c' => "Sea",
  44. );
  45. $view->assign($array);
  46. // делаем то же самое с открытыми свойствами объекта;
  47. // обратите внимание, что при установке мы приводим объект к массиву
  48. $obj = new StdClass;
  49. $obj->a = "Hay";
  50. $obj->b = "Bee";
  51. $obj->c = "Sea";
  52. $view->assign((array) $obj);
  53. ]]></programlisting>
  54. <para>
  55. Вы также можете использовать этот метод для
  56. последовательной установки c передачей имени переменной
  57. и ее значения.
  58. </para>
  59. <programlisting language="php"><![CDATA[
  60. $view = new Zend_View();
  61. $view->assign('a', "Hay");
  62. $view->assign('b', "Bee");
  63. $view->assign('c', "Sea");
  64. ]]></programlisting>
  65. </sect2>
  66. <sect2 id="zend.view.controllers.render">
  67. <title>Выполнение скрипта вида</title>
  68. <para>
  69. После того, как вы определили все необходимые переменные, контроллер
  70. должен дать <classname>Zend_View</classname> команду выполнить указанный
  71. скрипт вида. Делайте это посредством вызова метода
  72. <code>render()</code>. Обратите внимание, что этот метод будет
  73. возвращать результат рендеринга, но не выводить его,
  74. поэтому вам нужно самостоятельно вывести его посредством
  75. <code>echo</code> или <code>print</code>, в том месте,
  76. где это нужно.
  77. </para>
  78. <programlisting language="php"><![CDATA[
  79. $view = new Zend_View();
  80. $view->a = "Hay";
  81. $view->b = "Bee";
  82. $view->c = "Sea";
  83. echo $view->render('someView.php');
  84. ]]></programlisting>
  85. </sect2>
  86. <sect2 id="zend.view.controllers.script-paths">
  87. <title>Пути к скриптам вида</title>
  88. <para>
  89. По умолчанию <classname>Zend_View</classname> ищет скрипты
  90. вида относительно вызывающего скрипта.
  91. Например, если скрипт контроллера находится в директории
  92. "/path/to/app/controllers" и он вызывает скрипт вида
  93. следующим образом: <varname>$view->render('someView.php')</varname>, то
  94. <classname>Zend_View</classname> будет искать скрипт вида по пути
  95. "/path/to/app/controllers/someView.php".
  96. </para>
  97. <para>
  98. Очевидно, что ваши скрипты вида могут находиться в любом другом
  99. месте. Чтобы указать <classname>Zend_View</classname>, где искать скрипты вида,
  100. используйте метод <code>setScriptPath()</code>.
  101. </para>
  102. <programlisting language="php"><![CDATA[
  103. $view = new Zend_View();
  104. $view->setScriptPath('/path/to/app/views');
  105. ]]></programlisting>
  106. <para>
  107. Теперь, когда вы вызываете <varname>$view->render('someView.php')</varname>,
  108. он будет искать файл "/path/to/app/views/someView.php".
  109. </para>
  110. <para>
  111. Вы можете "складывать" в стек пути,
  112. используя метод <code>addScriptPath()</code>. Если вы добавили
  113. пути в стек, то <classname>Zend_View</classname> будет искать запрошенный
  114. скрипт вида по этим путям, начиная с пути, добавленного последним.
  115. Это дает возможность замещать скрипты видов, принятые по умолчанию,
  116. другими, это позволяет создавать специальные "темы" и "скины"
  117. для всех или только определенных видов.
  118. </para>
  119. <programlisting language="php"><![CDATA[
  120. $view = new Zend_View();
  121. $view->addScriptPath('/path/to/app/views');
  122. $view->addScriptPath('/path/to/custom/');
  123. // теперь, когда вы вызываете $view->render('booklist.php'), Zend_View
  124. // будет искать "/path/to/custom/booklist.php",
  125. // затем "/path/to/app/views/booklist.php",
  126. // и, наконец, "booklist.php" в текущем каталоге.
  127. ]]></programlisting>
  128. <note>
  129. <title>Никогда не используйте пользовательский ввод при установке
  130. путей к скриптам вида</title>
  131. <para>
  132. <classname>Zend_View</classname> использует пути к скриптам для поиска
  133. и рендеринга скриптов вида. Эти директории должны быть заранее
  134. известны и находиться под вашим контролем.
  135. <emphasis>Никогда</emphasis> не устанавливайте пути к скриптам
  136. вида на основе пользовательского ввода.
  137. Например, для атаки может использоваться следующий ввод:
  138. </para>
  139. <programlisting language="php"><![CDATA[
  140. // $_GET['foo'] == '../../../etc'
  141. $view->addScriptPath($_GET['foo']);
  142. $view->render('passwd');
  143. ]]></programlisting>
  144. <para>
  145. Хотя этот пример надуманный, он ясно демонстрирует
  146. потенциальную уязвимость. Если вы <emphasis>не можете</emphasis>
  147. обойтись без использования пользовательского ввода при установке
  148. пути к скриптам вида, то должным образом фильтруйте ввод и
  149. удостоверяйтесь, что полученный путь находится под контролем
  150. вашего приложения.
  151. </para>
  152. </note>
  153. </sect2>
  154. </sect1>
  155. <!--
  156. vim:se ts=4 sw=4 et:
  157. -->