[MANUAL] English:
[zend.git] / documentation / manual / ru / module_specs / Zend_View-Scripts.xml
blob33439fccd22234920d28f01e5d6275f4d8834657
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- Reviewed: no -->
3 <sect1 id="zend.view.scripts">
5     <title>Скрипты видов</title>
7     <para>
8         После того, как ваш контроллер определил переменные и вызвал
9         метод <code>render()</code>, <classname>Zend_View</classname> включает
10         требуемый скрипт вида и выполняет его в области
11         видимости экземпляра <classname>Zend_View</classname>. Поэтому в вашем скрипте
12         вида ссылки на $this в действительности будут ссылаться на
13         сам экземляр <classname>Zend_View</classname>.
14     </para>
16     <para>
17         Переменные, устанавливаемые в контроллере для скрипта вида, являются
18         свойствами экземпляра <classname>Zend_View</classname>. Например, если контроллер
19         установил переменную 'something', то в скрипте вида вы можете ссылаться
20         на нее следующим образом: <varname>$this->something</varname>. Это дает
21         возможность отслеживать, какие переменные были установлены
22         извне для скрипта, и какие были установлены в самом скрипте.
23     </para>
25     <para>
26         Ниже приведен пример скрипта вида из введения:
27     </para>
29     <programlisting language="php"><![CDATA[
30 <?php if ($this->books): ?>
32     <!-- Таблица из нескольких книг. -->
33     <table>
34         <tr>
35             <th>Author</th>
36             <th>Title</th>
37         </tr>
39         <?php foreach ($this->books as $key => $val): ?>
40         <tr>
41             <td><?php echo $this->escape($val['author']) ?></td>
42             <td><?php echo $this->escape($val['title']) ?></td>
43         </tr>
44         <?php endforeach; ?>
46     </table>
48 <?php else: ?>
50     <p>Нет книг для отображения.</p>
52 <?php endif;?>
53 ]]></programlisting>
55     <sect2 id="zend.view.scripts.escaping">
57         <title>Экранирование вывода</title>
59         <para>
60             Одной из наиважнейших задач, которую должен решать скрипт вида,
61             является обеспечение того, что вывод должным образом
62             экранирован; помимо прочего, это помогает
63             предотвратить XSS-атаки.
64             За исключением тех случаев, когда используются функции,
65             методы или помощники, которые сами производят экранирование,
66             вы должны всегда экранировать переменные, когда выводите их.
67         </para>
69         <para>
70             <classname>Zend_View</classname> снабжен методом <code>escape()</code>,
71             который выполняет экранирование.
72         </para>
74         <programlisting language="php"><![CDATA[
75 // плохая практика
76 echo $this->variable;
78 // хорошая практика
79 echo $this->escape($this->variable);
80 ]]></programlisting>
82         <para>
83             По умолчанию метод <code>escape()</code> использует функцию PHP
84             <code>htmlspecialchars()</code> для экранирования. Но, в зависимости
85             от вашего окружения, может потребоваться выполнять экранирование
86             по-иному. Используйте метод <code>setEscape()</code> на уровне
87             контроллера, чтобы указать <classname>Zend_View</classname>, какую
88             экранирующую функцию обратного вызова использовать.
89         </para>
91         <programlisting language="php"><![CDATA[
92 // создание экземпляра Zend_View
93 $view = new Zend_View();
95 // приказываем ему использовать htmlentities
96 // в качестве экранирующей функции обратного вызова
97 $view->setEscape('htmlentities');
99 // либо приказываем ему использовать статический метод класса
100 $view->setEscape(array('SomeClass', 'methodName'));
102 // или даже метод экземпляра
103 $obj = new SomeClass();
104 $view->setEscape(array($obj, 'methodName'));
106 // и затем воспроизводим вид
107 echo $view->render(...);
108 ]]></programlisting>
110         <para>
111             Функции или методы обратного вызова должны принимать значение,
112             которое требуется экранировать, как первый параметр,
113             все остальные параметры должны быть необязательными.
114         </para>
116     </sect2>
118     <sect2 id="zend.view.scripts.templates">
120         <title>Использование других шаблонизаторов</title>
122         <para>
123             Хотя PHP сам по себе представляет собой мощный шаблонизатор,
124             многие разработчики считают его избыточным или сложным для
125             верстальщиков и предпочитают использовать другие
126             шаблонизаторы. <classname>Zend_View</classname> предоставляет два пути для
127             этого: первый - через скрипты вида, второй - посредством реализации
128             интерфейса <classname>Zend_View_Interface</classname>.
129         </para>
131         <sect3 id="zend.view.scripts.templates.scripts">
132             <title>Шаблонизаторы c использованием скриптов видов</title>
134             <para>
135                 Скрипт вида может использоваться для инстанцирования и
136                 манипулирования отдельным объектом шаблона (это могут быть
137                 шаблоны в стиле PHPLIB).
138             </para>
140             <programlisting language="php"><![CDATA[
141 include_once 'template.inc';
142 $tpl = new Template();
144 if ($this->books) {
145     $tpl->setFile(array(
146         "booklist" => "booklist.tpl",
147         "eachbook" => "eachbook.tpl",
148     ));
150     foreach ($this->books as $key => $val) {
151         $tpl->set_var('author', $this->escape($val['author']);
152         $tpl->set_var('title', $this->escape($val['title']);
153         $tpl->parse("books", "eachbook", true);
154     }
156     $tpl->pparse("output", "booklist");
157 } else {
158     $tpl->setFile("nobooks", "nobooks.tpl")
159     $tpl->pparse("output", "nobooks");
161 ]]></programlisting>
163             <para>
164                 Это может соответствовать следующему файлу шаблона:
165             </para>
167             <programlisting language="html"><![CDATA[
168 <!-- booklist.tpl -->
169 <table>
170     <tr>
171         <th>Author</th>
172         <th>Title</th>
173     </tr>
174     {books}
175 </table>
177 <!-- eachbook.tpl -->
178     <tr>
179         <td>{author}</td>
180         <td>{title}</td>
181     </tr>
183 <!-- nobooks.tpl -->
184 <p>Нет книг для отображения.</p>
185 ]]></programlisting>
187         </sect3>
189         <sect3 id="zend.view.scripts.templates.interface">
190             <title>Шаблонизаторы с использованием Zend_View_Interface</title>
192             <para>
193                 Некоторые считают более удобным использовать совместимый с
194                 <classname>Zend_View</classname> шаблонизатор.
195                 <classname>Zend_View_Interface</classname>
196                 предоставляет минимально необходимый для
197                 совместимости интерфейс:
198             </para>
200             <programlisting language="php"><![CDATA[
202  * Возвращает объект используемого шаблонизатора
203  */
204 public function getEngine();
207  * Устанавливает путь к шаблонам или скриптам вида
208  */
209 public function setScriptPath($path);
212  * Устанавливает базовый путь ко всем необходимым скрипту вида ресурсам
213  */
214 public function setBasePath($path, $prefix = 'Zend_View');
217  * Устанавливает дополнительный базовый путь к необходимым скрипту вида ресурсам
218  */
219 public function addBasePath($path, $prefix = 'Zend_View');
222  * Возвращает текущие пути к скриптам
223  */
224 public function getScriptPaths();
227  * Переопределение методов для присвоения значений переменным шаблонов как
228  * свойствам объекта
229  */
230 public function __set($key, $value);
231 public function __get($key);
232 public function __isset($key);
233 public function __unset($key);
236  * "Ручная" установка значения переменной шаблона или одновременное присвоение
237  * значений нескольким переменным
238  */
239 public function assign($spec, $value = null);
242  * Удаление всех переменных шаблона
243  */
244 public function clearVars();
247  * Вывод шаблона с именем $name
248  */
249 public function render($name);
250 ]]></programlisting>
252             <para>
253                 Используя этот интерфейс, относительно легко сделать "обертку"
254                 для шаблонизаторов сторонних разработчиков. В примере показан
255                 вариант "обертки" для Smarty:
256             </para>
258             <programlisting language="php"><![CDATA[
259 class Zend_View_Smarty implements Zend_View_Interface
261     /**
262      * Объект Smarty
263      * @var Smarty
264      */
265     protected $_smarty;
267     /**
268      * Конструктор
269      *
270      * @param string $tmplPath
271      * @param array $extraParams
272      * @return void
273      */
274     public function __construct($tmplPath = null, $extraParams = array())
275     {
276         $this->_smarty = new Smarty;
278         if (null !== $tmplPath) {
279             $this->setScriptPath($tmplPath);
280         }
282         foreach ($extraParams as $key => $value) {
283             $this->_smarty->$key = $value;
284         }
285     }
287     /**
288      * Возвращение объекта шаблонизатора
289      *
290      * @return Smarty
291      */
292     public function getEngine()
293     {
294         return $this->_smarty;
295     }
297     /**
298      * Установка пути к шаблонам
299      *
300      * @param string $path Директория, устанавливаемая как путь к шаблонам
301      * @return void
302      */
303     public function setScriptPath($path)
304     {
305         if (is_readable($path)) {
306             $this->_smarty->template_dir = $path;
307             return;
308         }
310         throw new Exception('Invalid path provided');
311     }
313     /**
314      * Извлечение текущего пути к шаблонам
315      *
316      * @return string
317      */
318     public function getScriptPaths()
319     {
320         return array($this->_smarty->template_dir);
321     }
323     /**
324      * Метод-"псевдоним" для setScriptPath
325      *
326      * @param string $path
327      * @param string $prefix Не используется
328      * @return void
329      */
330     public function setBasePath($path, $prefix = 'Zend_View')
331     {
332         return $this->setScriptPath($path);
333     }
335     /**
336      * Метод-"псевдоним" для setScriptPath
337      *
338      * @param string $path
339      * @param string $prefix Не используется
340      * @return void
341      */
342     public function addBasePath($path, $prefix = 'Zend_View')
343     {
344         return $this->setScriptPath($path);
345     }
347     /**
348      * Присвоение значения переменной шаблона
349      *
350      * @param string $key Имя переменной
351      * @param mixed $val Значение переменной
352      * @return void
353      */
354     public function __set($key, $val)
355     {
356         $this->_smarty->assign($key, $val);
357     }
359     /**
360      * Получение значения переменной
361      *
362      * @param string $key Имя переменной
363      * @return mixed Значение переменной
364      */
365     public function __get($key)
366     {
367         return $this->_smarty->get_template_vars($key);
368     }
370     /**
371      * Позволяет проверять переменные через empty() и isset()
372      *
373      * @param string $key
374      * @return boolean
375      */
376     public function __isset($key)
377     {
378         return (null !== $this->_smarty->get_template_vars($key));
379     }
381     /**
382      * Позволяет удалять свойства объекта через unset()
383      *
384      * @param string $key
385      * @return void
386      */
387     public function __unset($key)
388     {
389         $this->_smarty->clear_assign($key);
390     }
392     /**
393      * Присвоение переменных шаблону
394      *
395      * Позволяет установить значение к определенному ключу или передать массив
396      * пар ключ => значение
397      *
398      * @see __set()
399      * @param string|array $spec Ключ или массив пар ключ => значение
400      * @param mixed $value (необязательный) Если присваивается значение одной
401      * переменной, то через него передается значение переменной
402      * @return void
403      */
404     public function assign($spec, $value = null)
405     {
406         if (is_array($spec)) {
407             $this->_smarty->assign($spec);
408             return;
409         }
411         $this->_smarty->assign($spec, $value);
412     }
414     /**
415      * Удаление всех переменных
416      *
417      * @return void
418      */
419     public function clearVars()
420     {
421         $this->_smarty->clear_all_assign();
422     }
424     /**
425      * Обрабатывает шаблон и возвращает вывод
426      *
427      * @param string $name Шаблон для обработки
428      * @return string Вывод
429      */
430     public function render($name)
431     {
432         return $this->_smarty->fetch($name);
433     }
435 ]]></programlisting>
437             <para>
438                 В этом примере вы можете инстанцировать класс
439                 <classname>Zend_View_Smarty</classname> вместо <classname>Zend_View</classname> и
440                 использовать его так же, как используется
441                 <classname>Zend_View</classname>.
442             </para>
444             <programlisting language="php"><![CDATA[
445 //Пример 1. В initView() инициализатора
446 $view = new Zend_View_Smarty('/path/to/templates');
447 $viewRenderer =
448     new Zend_Controller_Action_HelperBroker::getStaticHelper('ViewRenderer');
449 $viewRenderer->setView($view)
450              ->setViewBasePathSpec($view->_smarty->template_dir)
451              ->setViewScriptPathSpec(':controller/:action.:suffix')
452              ->setViewScriptPathNoControllerSpec(':action.:suffix')
453              ->setViewSuffix('tpl');
455 //Пример 2. Использование в контроллере действии остается тем же
456 class FooController extends Zend_Controller_Action
458     public function barAction()
459     {
460         $this->view->book   = 'Zend PHP 5 Certification Study Guide';
461         $this->view->author = 'Davey Shafik and Ben Ramsey'
462     }
465 //Пример 3. Инициализация вида в контроллере действий
466 class FooController extends Zend_Controller_Action
468     public function init()
469     {
470         $this->view   = new Zend_View_Smarty('/path/to/templates');
471         $viewRenderer = $this->_helper->getHelper('viewRenderer');
472         $viewRenderer->setView($this->view)
473                      ->setViewBasePathSpec($view->_smarty->template_dir)
474                      ->setViewScriptPathSpec(':controller/:action.:suffix')
475                      ->setViewScriptPathNoControllerSpec(':action.:suffix')
476                      ->setViewSuffix('tpl');
477     }
479 ]]></programlisting>
481         </sect3>
483     </sect2>
485 </sect1>
486 <!--
487 vim:se ts=4 sw=4 et: