1 <?xml version="1.0" encoding="UTF-8"?>
3 <sect1 id="zend.view.controllers">
4 <title>Скрипты контроллеров</title>
7 В контроллере вы создаете и конфигурируете экземпляр
8 <classname>Zend_View</classname>. Затем вы устанавливаете переменные для этого
9 экземпляра и приказываете ему сгенерировать выходные данные, используя
10 указанный скрипт вида.
13 <sect2 id="zend.view.controllers.assign">
15 <title>Установка переменных</title>
18 Ваш скрипт контроллера должен установить
19 необходимые переменные до того, как будет передано
20 управление скрипту вида. Обычно вы можете устанавливать переменные
21 по одной через объявление свойств экземпляра вида.
24 <programlisting language="php"><![CDATA[
25 $view = new Zend_View();
32 Однако это может показаться утомительным, если вы уже имеете
33 набор значений для присвоения в массиве или объекте.
37 Метод <code>assign()</code> дает возможность устанавливать значения
38 из массива или объекта "партиями". Следующий пример делает
39 то же самое, что и предыдущий с последовательной установкой
43 <programlisting language="php"><![CDATA[
44 $view = new Zend_View();
46 // определение массива из пар ключ-значение, где
47 // ключ является именем переменной,
48 // а значение - значением устанавливаемой переменной
54 $view->assign($array);
56 // делаем то же самое с открытыми свойствами объекта;
57 // обратите внимание, что при установке мы приводим объект к массиву
62 $view->assign((array) $obj);
66 Вы также можете использовать этот метод для
67 последовательной установки c передачей имени переменной
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");
80 <sect2 id="zend.view.controllers.render">
82 <title>Выполнение скрипта вида</title>
85 После того, как вы определили все необходимые переменные, контроллер
86 должен дать <classname>Zend_View</classname> команду выполнить указанный
87 скрипт вида. Делайте это посредством вызова метода
88 <code>render()</code>. Обратите внимание, что этот метод будет
89 возвращать результат рендеринга, но не выводить его,
90 поэтому вам нужно самостоятельно вывести его посредством
91 <code>echo</code> или <code>print</code>, в том месте,
95 <programlisting language="php"><![CDATA[
96 $view = new Zend_View();
100 echo $view->render('someView.php');
105 <sect2 id="zend.view.controllers.script-paths">
107 <title>Пути к скриптам вида</title>
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".
120 Очевидно, что ваши скрипты вида могут находиться в любом другом
121 месте. Чтобы указать <classname>Zend_View</classname>, где искать скрипты вида,
122 используйте метод <code>setScriptPath()</code>.
125 <programlisting language="php"><![CDATA[
126 $view = new Zend_View();
127 $view->setScriptPath('/path/to/app/views');
131 Теперь, когда вы вызываете <varname>$view->render('someView.php')</varname>,
132 он будет искать файл "/path/to/app/views/someView.php".
136 Вы можете "складывать" в стек пути,
137 используя метод <code>addScriptPath()</code>. Если вы добавили
138 пути в стек, то <classname>Zend_View</classname> будет искать запрошенный
139 скрипт вида по этим путям, начиная с пути, добавленного последним.
140 Это дает возможность замещать скрипты видов, принятые по умолчанию,
141 другими, это позволяет создавать специальные "темы" и "скины"
142 для всех или только определенных видов.
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" в текущем каталоге.
157 <title>Никогда не используйте пользовательский ввод при установке
158 путей к скриптам вида</title>
161 <classname>Zend_View</classname> использует пути к скриптам для поиска
162 и рендеринга скриптов вида. Эти директории должны быть заранее
163 известны и находиться под вашим контролем.
164 <emphasis>Никогда</emphasis> не устанавливайте пути к скриптам
165 вида на основе пользовательского ввода.
166 Например, для атаки может использоваться следующий ввод:
169 <programlisting language="php"><![CDATA[
170 // $_GET['foo'] == '../../../etc'
171 $view->addScriptPath($_GET['foo']);
172 $view->render('passwd');
176 Хотя этот пример надуманный, он ясно демонстрирует
177 потенциальную уязвимость. Если вы <emphasis>не можете</emphasis>
178 обойтись без использования пользовательского ввода при установке
179 пути к скриптам вида, то должным образом фильтруйте ввод и
180 удостоверяйтесь, что полученный путь находится под контролем