[ZF-10089] Zend_Log
[zend.git] / documentation / manual / ru / module_specs / Zend_View-Controllers.xml
blob77052c0cc2dd1828c18f681bc015e07e67d05cd7
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- Reviewed: no -->
3 <sect1 id="zend.view.controllers">
4     <title>Скрипты контроллеров</title>
6     <para>
7         В контроллере вы создаете и конфигурируете экземпляр
8         <classname>Zend_View</classname>. Затем вы устанавливаете переменные для этого
9         экземпляра и приказываете ему сгенерировать выходные данные, используя
10         указанный скрипт вида.
11     </para>
13     <sect2 id="zend.view.controllers.assign">
15         <title>Установка переменных</title>
17         <para>
18             Ваш скрипт контроллера должен установить
19             необходимые переменные до того, как будет передано
20             управление скрипту вида. Обычно вы можете устанавливать переменные
21             по одной через объявление свойств экземпляра вида.
22         </para>
24         <programlisting language="php"><![CDATA[
25 $view = new Zend_View();
26 $view->a = "Hay";
27 $view->b = "Bee";
28 $view->c = "Sea";
29 ]]></programlisting>
31         <para>
32             Однако это может показаться утомительным, если вы уже имеете
33             набор значений для присвоения в массиве или объекте.
34         </para>
36         <para>
37             Метод <code>assign()</code> дает возможность устанавливать значения
38             из массива или объекта "партиями". Следующий пример делает
39             то же самое, что и предыдущий с последовательной установкой
40             переменных.
41         </para>
43         <programlisting language="php"><![CDATA[
44 $view = new Zend_View();
46 // определение массива из пар ключ-значение, где
47 // ключ является именем переменной,
48 // а значение - значением устанавливаемой переменной
49 $array = array(
50     'a' => "Hay",
51     'b' => "Bee",
52     'c' => "Sea",
54 $view->assign($array);
56 // делаем то же самое с открытыми свойствами объекта;
57 // обратите внимание, что при установке мы приводим объект к массиву
58 $obj = new StdClass;
59 $obj->a = "Hay";
60 $obj->b = "Bee";
61 $obj->c = "Sea";
62 $view->assign((array) $obj);
63 ]]></programlisting>
65         <para>
66             Вы также можете использовать этот метод для
67             последовательной установки c передачей имени переменной
68             и ее значения.
69         </para>
71         <programlisting language="php"><![CDATA[
72 $view = new Zend_View();
73 $view->assign('a', "Hay");
74 $view->assign('b', "Bee");
75 $view->assign('c', "Sea");
76 ]]></programlisting>
78     </sect2>
80     <sect2 id="zend.view.controllers.render">
82         <title>Выполнение скрипта вида</title>
84         <para>
85             После того, как вы определили все необходимые переменные, контроллер
86             должен дать <classname>Zend_View</classname> команду выполнить указанный
87             скрипт вида. Делайте это посредством вызова метода
88             <code>render()</code>. Обратите внимание, что этот метод будет
89             возвращать результат рендеринга, но не выводить его,
90             поэтому вам нужно самостоятельно вывести его посредством
91             <code>echo</code> или <code>print</code>, в том месте,
92             где это нужно.
93         </para>
95         <programlisting language="php"><![CDATA[
96 $view = new Zend_View();
97 $view->a = "Hay";
98 $view->b = "Bee";
99 $view->c = "Sea";
100 echo $view->render('someView.php');
101 ]]></programlisting>
103     </sect2>
105     <sect2 id="zend.view.controllers.script-paths">
107         <title>Пути к скриптам вида</title>
109         <para>
110             По умолчанию <classname>Zend_View</classname> ищет скрипты
111             вида относительно вызывающего скрипта.
112             Например, если скрипт контроллера находится в директории
113             "/path/to/app/controllers" и он вызывает скрипт вида
114             следующим образом: <varname>$view->render('someView.php')</varname>, то
115             <classname>Zend_View</classname> будет искать скрипт вида по пути
116             "/path/to/app/controllers/someView.php".
117         </para>
119         <para>
120             Очевидно, что ваши скрипты вида могут находиться в любом другом
121             месте. Чтобы указать <classname>Zend_View</classname>, где искать скрипты вида,
122             используйте метод <code>setScriptPath()</code>.
123         </para>
125         <programlisting language="php"><![CDATA[
126 $view = new Zend_View();
127 $view->setScriptPath('/path/to/app/views');
128 ]]></programlisting>
130         <para>
131             Теперь, когда вы вызываете <varname>$view->render('someView.php')</varname>,
132             он будет искать файл "/path/to/app/views/someView.php".
133         </para>
135         <para>
136             Вы можете "складывать" в стек пути,
137             используя метод <code>addScriptPath()</code>. Если вы добавили
138             пути в стек, то <classname>Zend_View</classname> будет искать запрошенный
139             скрипт вида по этим путям, начиная с пути, добавленного последним.
140             Это дает возможность замещать скрипты видов, принятые по умолчанию,
141             другими, это позволяет создавать специальные "темы" и "скины"
142             для всех или только определенных видов.
143         </para>
145         <programlisting language="php"><![CDATA[
146 $view = new Zend_View();
147 $view->addScriptPath('/path/to/app/views');
148 $view->addScriptPath('/path/to/custom/');
150 // теперь, когда вы вызываете $view->render('booklist.php'), Zend_View
151 // будет искать "/path/to/custom/booklist.php",
152 // затем "/path/to/app/views/booklist.php",
153 // и, наконец, "booklist.php" в текущем каталоге.
154 ]]></programlisting>
156         <note>
157             <title>Никогда не используйте пользовательский ввод при установке
158             путей к скриптам вида</title>
160             <para>
161                 <classname>Zend_View</classname> использует пути к скриптам для поиска
162                 и рендеринга скриптов вида. Эти директории должны быть заранее
163                 известны и находиться под вашим контролем.
164                 <emphasis>Никогда</emphasis> не устанавливайте пути к скриптам
165                 вида на основе пользовательского ввода.
166                 Например, для атаки может использоваться следующий ввод:
167             </para>
169             <programlisting language="php"><![CDATA[
170 // $_GET['foo'] == '../../../etc'
171 $view->addScriptPath($_GET['foo']);
172 $view->render('passwd');
173 ]]></programlisting>
175             <para>
176                 Хотя этот пример надуманный, он ясно демонстрирует
177                 потенциальную уязвимость. Если вы <emphasis>не можете</emphasis>
178                 обойтись без использования пользовательского ввода при установке
179                 пути к скриптам вида, то должным образом фильтруйте ввод и
180                 удостоверяйтесь, что полученный путь находится под контролем
181                 вашего приложения.
182             </para>
183         </note>
184     </sect2>
185 </sect1>
186 <!--
187 vim:se ts=4 sw=4 et: