[MANUAL] English:
[zend.git] / documentation / manual / ru / module_specs / Zend_Controller-ActionHelpers-ViewRenderer.xml
blob4e4f111bbf8d9d22c305cc6bf5386b87fb9fc0a7
1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- Reviewed: no -->
3 <sect3 id="zend.controller.actionhelpers.viewrenderer">
4     <title>ViewRenderer</title>
6     <sect4 id="zend.controller.actionhelper.viewrenderer.introduction">
7         <title>Введение</title>
9         <para>
10             Помощник <code>ViewRenderer</code> предназначен для решения
11             следующих задач:
12         </para>
14         <itemizedlist>
15             <listitem>
16                 <para>
17                     Устранение необходимости инстанцирования объектов вида
18                     внутри контроллеров; объекты вида будут автоматически
19                     регистрироваться вместе с контроллером.
20                 </para>
21             </listitem>
23             <listitem>
24                 <para>
25                     Автоматическая установка путей к скриптам вида, помощникам
26                     и фильтрам, основанная на текущем модуле, и автоматическое
27                     присоединение имени текущего модуля в качестве префикса имен
28                     классов помощников и фильтров.
29                 </para>
30             </listitem>
32             <listitem>
33                 <para>
34                     Создание глобально доступного объекта вида для всех
35                     запускаемых контроллеров и действий.
36                 </para>
37             </listitem>
39             <listitem>
40                 <para>
41                     Возможность устанавливать используемые по
42                     умолчанию опции рендеринга для всех контроллеров.
43                 </para>
44             </listitem>
46             <listitem>
47                 <para>
48                     Возможность автоматического рендеринга скрипта
49                     вида, не требующего от разработчика каких-либо действий.
50                 </para>
51             </listitem>
53             <listitem>
54                 <para>
55                     Возможность создавать собственные спецификации базового пути
56                     вида и путей к скриптам видов.
57                 </para>
58             </listitem>
59         </itemizedlist>
60         <note>
61             <para>
62                 Если вы вручную производите <code>_forward()</code>,
63                 перенаправление или <code>render</code>, то авторендеринг не
64                 будет произведен, поскольку выполнение любых этих операций
65                 говорит помощнику <code>ViewRenderer</code>, что вы определили
66                 свой собственный вывод.
67             </para>
68         </note>
70         <note>
71             <para>
72                 <code>ViewRenderer</code> включен по умолчанию. Вы можете
73                 отключить его через параметр фронт-контроллера
74                 <code>noViewRenderer</code>
75                 (<varname>$front->setParam('noViewRenderer', true)</varname>) или
76                 посредством удаления помощника из стека брокера помощников
77                 (<code>Zend_Controller_Action_HelperBroker::removeHelper('viewRenderer')</code>).
78             </para>
80             <para>
81                 Если вы хотите изменить настройки <code>ViewRenderer</code> до
82                 начала диспетчеризации, то можете сделать это одним из двух
83                 способов:
84             </para>
86             <itemizedlist>
87                 <listitem>
88                     <para>
89                         Инстанцировать и зарегистрировать свой объект
90                         <code>ViewRenderer</code>, а затем передать его брокеру
91                         помощников:
92                     </para>
94                     <programlisting language="php"><![CDATA[
95 $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
96 $viewRenderer->setView($view)
97              ->setViewSuffix('php');
98 Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
99 ]]></programlisting>
100                 </listitem>
102                 <listitem>
103                     <para>
104                         Инициализировать и/или извлечь по запросу объект
105                         <code>ViewRenderer</code> через брокер помощников:
106                     </para>
108                     <programlisting language="php"><![CDATA[
109 $viewRenderer =
110     Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
111 $viewRenderer->setView($view)
112              ->setViewSuffix('php');
113 ]]></programlisting>
114                 </listitem>
115             </itemizedlist>
116         </note>
117     </sect4>
119     <sect4 id="zend.controller.actionhelper.viewrenderer.api">
120         <title>API</title>
122         <para>
123             В простейшем варианте использования вы просто инстанцируете
124             <code>ViewRenderer</code> и передаете его брокеру помощников.
125             Наиболее легким способом его инстанцирования и регистрации является
126             использование метода <code>getStaticHelper()</code> брокера
127             помощников:
128         </para>
130         <programlisting language="php"><![CDATA[
131 Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
132 ]]></programlisting>
134         <para>
135             Во время инстанцирования контроллера действий производится вызов
136             <code>ViewRenderer</code> для инстанцирования объекта вида. Каждый
137             раз, когда инстанцируется контроллер, вызывается метод
138             <code>init()</code> помощника <code>ViewRenderer</code>, что
139             приводит к установке свойства <varname>$view</varname> данного контроллера
140             действий и вызову метода <code>addScriptPath()</code> с путем
141             относительно текущего модуля; он будет вызван с префиксом класса,
142             соответствующим имени текущего модуля, что эффективно
143             разделяет пространства имен всех классов помощников и фильтров,
144             определенных для этого модуля.
145         </para>
147         <para>
148             Каждый раз, когда вызывается <code>postDispatch()</code>, он будет
149             вызывать <code>render()</code> для текущего действия.
150         </para>
152         <para>
153             В качестве примера рассмотрим следующий класс:
154         </para>
156         <programlisting language="php"><![CDATA[
157 // Класс контроллера, модуль foo:
158 class Foo_BarController extends Zend_Controller_Action
160     // Рендеринг bar/index.phtml по умолчанию;
161     // не требуется производить какие-либо операции
162     public function indexAction()
163     {
164     }
166     // Рендеринг bar/populate.phtml с переменной 'foo', установленной в 'bar'.
167     // Поскольку объект вида определен в preDispatch(), то он всегда доступен.
168     public function populateAction()
169     {
170         $this->view->foo = 'bar';
171     }
176 // в одном из ваших скриптов вида:
177 $this->foo(); // вызывает Foo_View_Helper_Foo::foo()
178 ]]></programlisting>
180         <para>
181             <code>ViewRenderer</code> также определяет несколько аксессоров для
182             того, чтобы можно было устанавливать и извлекать опции видов:
183         </para>
185         <itemizedlist>
186             <listitem>
187                 <para>
188                     <code>setView($view)</code> позволяет установить объект вида
189                     для <code>ViewRenderer</code>. Объект сохраняется в
190                     открытом свойстве <varname>$view</varname> класса.
191                 </para>
192             </listitem>
194             <listitem>
195                 <para>
196                     <code>setNeverRender($flag = true)</code> может
197                     использоваться для отключения или включения авторендеринга
198                     глобально, т.е. для всех контроллеров. Если установлен в
199                     <constant>TRUE</constant>, то <code>postDispatch()</code> не будет
200                     автоматически вызывать <code>render()</code> в текущем
201                     контроллере. <code>getNeverRender()</code> возвращает
202                     текущее значение.
203                 </para>
204             </listitem>
206             <listitem>
207                 <para>
208                     <code>setNoRender($flag = true)</code> может использоваться
209                     для отключения или включения авторендеринга. Если установлен
210                     в <constant>TRUE</constant>, то <code>postDispatch()</code> не будет
211                     автоматически вызывать <code>render()</code> в текущем
212                     контроллере. Эта установка сбрасывается каждый раз во время
213                     вызова <code>preDispatch()</code> (т.е. нужно устанавливать
214                     этот флаг для каждого контроллера, для которого вы не хотите
215                     производить авторендеринг). <code>getNoRender()</code>
216                     возвращает текущее значение.
217                 </para>
218             </listitem>
220             <listitem>
221                 <para>
222                     <code>setNoController($flag = true)</code> может
223                     использоваться для того, чтобы указать
224                     методу <code>render()</code>, чтобы он не искал скрипт вида
225                     в поддиректории с именем контроллера (что является
226                     поведением по умолчанию). <code>getNoController()</code>
227                     возвращает текущее значение.
228                 </para>
229             </listitem>
231             <listitem>
232                 <para>
233                     <code>setNeverController($flag = true)</code> является
234                     аналогом <code>setNoController()</code>, но работает на
235                     глобальном уровне - т.е. он не будет сбрасываться с каждым
236                     обработанным действием. <code>getNeverController()</code>
237                     возвращает текущее значение.
238                 </para>
239             </listitem>
241             <listitem>
242                 <para>
243                     <code>setScriptAction($name)</code> может использоваться для
244                     того, чтобы указать скрипт действия для рендеринга.
245                     <varname>$name</varname> должен быть именем скрипта без суффикса
246                     (и без поддиректории контроллера, за исключением того
247                     случая, когда включен <code>noController</code>). Если не
248                     задан, то ищется скрипт вида с именем, аналогичным имени
249                     действия в объекте запроса. <code>getScriptAction()</code>
250                     возвращает текущее значение.
251                 </para>
252             </listitem>
254             <listitem>
255                 <para>
256                     <code>setResponseSegment($name)</code> может использоваться
257                     для указания того, в какой именованный сегмент объекта
258                     ответа следует сохранить результат рендеринга. Если не
259                     указан, то выходные данные сохраняются в сегменте,
260                     используемом по умолчанию. <code>getResponseSegment()</code>
261                     возвращает текущее значение.
262                 </para>
263             </listitem>
265             <listitem>
266                 <para>
267                     <code>initView($path, $prefix, $options)</code> может
268                     вызываться для указания базового пути вида, префикса классов
269                     помощников и фильтров, опций помощника
270                     <code>ViewRenderer</code>. Вы можете передавать любые из
271                     следующих флагов:
272                     <code>neverRender</code>, <code>noRender</code>,
273                     <code>noController</code>, <code>scriptAction</code> и
274                     <code>responseSegment</code>.
275                 </para>
276             </listitem>
278             <listitem>
279                 <para>
280                     <code>setRender($action = null, $name = null, $noController
281                         = false)</code> позволяет установить
282                     <code>scriptAction</code>, <code>responseSegment</code>,
283                     или <code>noController</code> за один проход.
284                     <code>direct()</code> является псевдонимом для этого метода,
285                     что дает возможность легко вызывать этот метод из вашего
286                     контроллера.
287                 </para>
289                 <programlisting language="php"><![CDATA[
290 // Рендеринг 'foo' вместо текущего скрипта вида
291 $this->_helper->viewRenderer('foo');
293 // Рендеринг form.phtml в сегмент ответа 'html' в обход
294 // поддиректории:
295 $this->_helper->viewRenderer('form', 'html', true);
296 ]]></programlisting>
298                 <note><para>
299                         <code>setRender()</code> и <code>direct()</code> в
300                         действительности не производят рендеринг скрипта вида, а
301                         устанавливают закрытые свойства помощника, которые
302                         <code>postDispatch()</code> и <code>render()</code>
303                         будут использовать при рендеринге скрипта вида.
304                 </para></note>
305             </listitem>
306         </itemizedlist>
308         <para>
309             Конструктор позволяет опционально передать объект вида и опции
310             <code>ViewRenderer</code>. Он использует те же флаги, что и
311             <code>initView()</code>:
312         </para>
314         <programlisting language="php"><![CDATA[
315 $view    = new Zend_View(array('encoding' => 'UTF-8'));
316 $options = array('noController' => true, 'neverRender' => true);
317 $viewRenderer =
318     new Zend_Controller_Action_Helper_ViewRenderer($view, $options);
319 ]]></programlisting>
321         <para>
322             <code>ViewRenderer</code> имеет несколько дополнительных методов для
323             создания пользовательских спецификаций пути, используемых для
324             определения базового пути вида, добавляемого в объект вида, и пути к
325             определенному скрипту вида, используемого при автоматическом
326             определении скрипта вида для рендеринга. Все эти методы принимают
327             одну или более меток заполнения:
328         </para>
330         <itemizedlist>
331             <listitem>
332                 <para>
333                     <code>:moduleDir</code> ссылается на текущую базовую
334                     директорию модуля (по соглашению это директория,
335                     родительская по отношению к директории контроллеров модуля).
336                 </para>
337             </listitem>
339             <listitem>
340                 <para>
341                     <code>:module</code> ссылается на имя текущего модуля.
342                 </para>
343             </listitem>
345             <listitem>
346                 <para>
347                     <code>:controller</code> ссылается на имя текущего
348                     контроллера.
349                 </para>
350             </listitem>
352             <listitem>
353                 <para>
354                     <code>:action</code> ссылается на имя текущего действия.
355                 </para>
356             </listitem>
358             <listitem>
359                 <para>
360                     <code>:suffix</code> ссылается на суффикс скрипта вида
361                     (который может быть установлен через
362                     <code>setViewSuffix()</code>).
363                 </para>
364             </listitem>
365         </itemizedlist>
367         <para>
368             Методы для управления спецификациями пути:
369         </para>
371         <itemizedlist>
372             <listitem>
373                 <para>
374                     <code>setViewBasePathSpec($spec)</code> позволяет изменить
375                     спецификацию пути, используемую для определения базового
376                     пути, добавляемого в объект вида. По умолчанию используется
377                     спецификация <code>:moduleDir/views</code>. Вы можете в
378                     любое время получить текущую спецификацицию, используя метод
379                     <code>getViewBasePathSpec()</code>.
380                 </para>
381             </listitem>
383             <listitem>
384                 <para>
385                     <code>setViewScriptPathSpec($spec)</code> позволяет изменить
386                     спецификацию пути, используемую для определения пути к
387                     отдельному скрипту вида (без базового пути скрипта вида).
388                     По умолчанию используется спецификация
389                     <code>:controller/:action.:suffix</code>. Вы можете в любое
390                     время получить текущую спецификацию, используя метод
391                     <code>getViewScriptPathSpec()</code>.
392                 </para>
393             </listitem>
395             <listitem>
396                 <para>
397                     <code>setViewScriptPathNoControllerSpec($spec)</code>
398                     позволяет изменить спецификацию пути, используемую для
399                     определения пути к отдельному скрипту вида, когда действует
400                     <code>noController</code> (без базового пути скрипта вида).
401                     По умолчанию используется спецификация
402                     <code>:action.:suffix</code>. Вы можете в любое время
403                     получить текущую спецификацию, используя метод
404                     <code>getViewScriptPathNoControllerSpec()</code>.
405                 </para>
406             </listitem>
407         </itemizedlist>
409         <para>
410             Для более детального управления спецификациями путей вы можете
411             использовать
412             <link linkend="zend.filter.inflector">Zend_Filter_Inflector</link>.
413             Внутри себя <code>ViewRenderer</code> уже использует инфлектор для
414             поиска соответствий. Для взаимодействия с инфлектором - установки
415             своего собственного инфлектора или изменения используемого по
416             умолчанию - могут использоваться следующие методы:
417         </para>
419         <itemizedlist>
420             <listitem>
421                 <para>
422                     <code>getInflector()</code> возвращает инфлектор. Если в
423                     <code>ViewRenderer</code> его нет, то метод создает его,
424                     используя правила по умолчанию.
425                 </para>
427                 <para>
428                     По умолчанию он использует ссылки на статические правила для
429                     суффикса и директории модуля, так же, как и статическую
430                     цель. Это дает различным свойствам <code>ViewRenderer</code>
431                     возможность динамически изменять инфлектор.
432                 </para>
433             </listitem>
435             <listitem>
436                 <para>
437                     <code>setInflector($inflector, $reference)</code> позволяет
438                     устанавливать свой инфлектор для использования с
439                     <code>ViewRenderer</code>. Если <varname>$reference</varname>
440                     равен true, то суффикс и директория модуля будут установлены
441                     как статические ссылки на свойства
442                     <code>ViewRenderer</code>, так же, как и цель.
443             </para></listitem>
444         </itemizedlist>
446         <note>
447             <title>Используемые по умолчанию соглашения по поиску</title>
449             <para>
450                 <code>ViewRenderer</code> производит некоторую нормализацию пути
451                 для облегчения поиска скрипта вида. Используемые по умолчанию
452                 правила:
453             </para>
455             <itemizedlist>
456                 <listitem>
457                     <para>
458                         <code>:module</code>: СловаРазделенныеРегистром
459                         (CamelCase) разделяются тире и вся строка приводится к
460                         нижнему регистру. Например: "FooBarBaz" преобразуется в
461                         "foo-bar-baz".
462                     </para>
464                     <para>
465                         Внутри себя инфлектор использует фильтры
466                         <classname>Zend_Filter_Word_CamelCaseToDash</classname> и
467                         <classname>Zend_Filter_StringToLower</classname>.
468                     </para>
469                 </listitem>
471                 <listitem>
472                     <para>
473                         <code>:controller</code>:
474                         СловаРазделенныеРегистром (CamelCase) разделяются
475                         тире, знаки подчеркивания преобразуются в разделители
476                         директорий и вся строка приводится к нижнему регистру.
477                         Например: "FooBar" преобразуется в "foo-bar";
478                         "FooBar_Admin" преобразуется в "foo-bar/admin".
479                     </para>
481                     <para>
482                         Внутри себя инфлектор использует фильтры
483                         <classname>Zend_Filter_Word_CamelCaseToDash</classname>,
484                         <classname>Zend_Filter_Word_UnderscoreToSeparator</classname> и
485                         <classname>Zend_Filter_StringToLower</classname>.
486                     </para>
487                 </listitem>
489                 <listitem>
490                     <para>
491                         <code>:action</code>:
492                         СловаРазделенныеРегистром (CamelCase) разделяются
493                         тире, символы, не являющиеся буквенно-цифровыми,
494                         переводятся в тире и
495                         вся строка приводится к нижнему регистру.
496                         Например: "fooBar" преобразуется в "foo-bar";
497                         "foo-barBaz" преобразуется в "foo-bar-baz".
498                     </para>
500                     <para>
501                         Внутри себя инфлектор использует фильтры
502                         <classname>Zend_Filter_Word_CamelCaseToDash</classname>,
503                         <classname>Zend_Filter_PregReplace</classname> и
504                         <classname>Zend_Filter_StringToLower</classname>.
505                     </para>
506                 </listitem>
507             </itemizedlist>
508         </note>
510         <para>
511             Последними рассматриваемыми элементами в API <code>ViewRenderer</code>-а являются
512             методы для собственно определения путей к скриптам вида и
513             рендеринга видов. Эти методы включают в себя:
514         </para>
516         <itemizedlist>
517             <listitem>
518                 <para>
519                     <code>renderScript($script, $name)</code> позволяет
520                     производить рендеринг скрипта по указанному пути,
521                     в опционально заданный именованный сегмент. Если
522                     используется этот метод, то <code>ViewRenderer</code> не
523                     производит автоматическое определение имени скрипта, вместо
524                     этого он напрямую передает аргумент <varname>$script</varname>
525                     методу <code>render()</code> объекта вида.
526                 </para>
528                 <note><para>
529                     После того, как был произведен рендеринг вида в объект
530                     ответа, устанавливается <code>noRender</code> для
531                     предотвращения случайного повторного рендеринга того же
532                     скрипта вида.
533                 </para></note>
535                 <note>
536                     <para>
537                         По умолчанию
538                         <code>Zend_Controller_Action::renderScript()</code>
539                         вызывает метод <code>renderScript()</code> помощника
540                         <code>ViewRenderer</code>.
541                     </para>
542                 </note>
543             </listitem>
545             <listitem>
546                 <para>
547                     <code>getViewScript($action, $vars)</code> создает путь к
548                     скрипту вида, основываясь на переданном действии $action
549                     и/или переменных, переданных в $vars. Этот массив может
550                     включать в себя ключи спецификаций пути ('moduleDir',
551                     'module', 'controller', 'action' и 'suffix'). Если
552                     была передана переменная, то она будет использована, иначе
553                     будут использоваться значения из текущего запроса.
554                 </para>
556                 <para>
557                     <code>getViewScript()</code> будет использовать
558                     <code>viewScriptPathSpec</code>, либо
559                     <code>viewScriptPathNoControllerSpec</code>, в зависимости
560                     от значения флага <code>noController</code>.
561                 </para>
563                 <para>
564                     Разделители слов в именах модуля, контроллера или действия
565                     будут заменены на тире ('-'). Таким образом, если вы имеете
566                     контроллер с именем 'foo.bar' и действие 'baz:bat', то при
567                     использовании спецификации по умолчанию результатом
568                     будет путь 'foo-bar/baz-bat.phtml' к скрипту вида.
569                 </para>
571                 <note>
572                     <para>
573                         По умолчанию
574                         <code>Zend_Controller_Action::getViewScript()</code>
575                         вызывает метод <code>getViewScript()</code>
576                         <code>ViewRenderer</code>-а.
577                     </para>
578                 </note>
579             </listitem>
581             <listitem>
582                 <para>
583                     <code>render($action, $name, $noController)</code> сначала
584                     проверяет, были ли переданы параметры <varname>$name</varname> или
585                     <varname>$noController</varname>, и если были переданы, то
586                     устанавливает соответствующие флаги (responseSegment и
587                     noController соответственно) в ViewRenderer. Затем он
588                     передает параметр <varname>$action</varname> (если есть) методу
589                     <code>getViewScript()</code>. Наконец, он передает
590                     полученный путь к скрипту вида методу
591                     <code>renderScript()</code>.
592                 </para>
594                 <note>
595                     <para>
596                         Следует помнить о побочных эффектах использования
597                         render(): значения, передаваемые для имени сегмента
598                         ответа и флага noController, сохраняются в объекте.
599                         Кроме этого, по окончании рендеринга будет установлен
600                         noRender.
601                     </para>
602                 </note>
604                 <note>
605                     <para>
606                         По умолчанию
607                         <code>Zend_Controller_Action::render()</code> вызывает
608                         метод <code>render()</code> помощника
609                         <code>ViewRenderer</code>.
610                     </para>
611                 </note>
612             </listitem>
614             <listitem>
615                 <para>
616                     <code>renderBySpec($action, $vars, $name)</code> позволяет
617                     передавать переменные спецификации пути для определения
618                     создаваемого пути к скрипту вида. Он передает
619                     <varname>$action</varname> и <varname>$vars</varname> методу
620                     <code>getScriptPath()</code>, затем передает полученный путь
621                     и <varname>$name</varname> методу <code>renderScript()</code>.
622                 </para>
623             </listitem>
624         </itemizedlist>
625     </sect4>
627     <sect4 id="zend.controller.actionhelper.viewrenderer.basicusage">
628         <title>Примеры базового использования</title>
630         <example id="zend.controller.actionhelper.viewrenderer.basicusage.example-1">
631             <title>Базовое использование</title>
633             <para>
634                 В простейшем случае вы просто инициализируете и
635                 регистрируете помощник <code>ViewRenderer</code> через брокер
636                 помощников в своем файле загрузки и затем устанавливаете
637                 переменные в своих методах действий.
638             </para>
640             <programlisting language="php"><![CDATA[
641 // В вашем файле загрузки:
642 Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
646 // Модуль 'foo', контроллер 'bar':
647 class Foo_BarController extends Zend_Controller_Action
649     // По умолчанию производится рендеринг bar/index.phtml;
650     // дополнительные действия не требуются
651     public function indexAction()
652     {
653     }
655     // Рендеринг bar/populate.phtml с переменной 'foo', установленной в 'bar'.
656     // Поскольку объект вида был определен в preDispatch(), то он уже
657     // доступен для использования.
658     public function populateAction()
659     {
660         $this->view->foo = 'bar';
661     }
663     // Ничего не рендерится, т.к. производится переход на другое действие;
664     // это другое действие может производить рендеринг
665     public function bazAction()
666     {
667         $this->_forward('index');
668     }
670     // Ничего не рендерится, т.к. производится перенаправление по другому адресу
671     public function batAction()
672     {
673         $this->_redirect('/index');
674     }
676 ]]></programlisting>
677         </example>
679         <note>
680             <title>Соглашения по именованию: Разделители слов в именах контроллера и действия</title>
681             <para>
682                 Если имена вашего контроллера и действия состоят из
683                 нескольких слов, то диспетчер требует, чтобы в URL они были
684                 разделены определенными символами-разделителями слов и
685                 путей. <code>ViewRenderer</code> при создании путей заменяет все
686                 найденные в имени контроллера разделители путей действующим
687                 разделителем путей ('/') и все разделители слов - чертой
688                 ('-'). Таким образом, вызов действия
689                 <code>/foo.bar/baz.bat</code> должен быть преобразован в
690                 вызов метода <code>FooBarController::bazBatAction()</code> в
691                 <code>FooBarController.php</code>, который в свою очередь
692                 произведет рендеринг скрипта вида <code>foo-bar/baz-bat.phtml</code>.
693                 Вызов действия <code>/bar_baz/baz-bat</code> должен быть
694                 преобразован в вызов
695                 <code>Bar_BazController::bazBatAction()</code> в
696                 <code>Bar/BazController.php</code> (обратите внимание на
697                 разделение путей), при этом производится рендеринг
698                 <code>bar/baz/baz-bat.phtml</code>.
699             </para>
701             <para>
702                 Во втором примере обратите внимание на то, что по-прежнему
703                 используется модуль по умолчанию, но из-за наличия
704                 разделителя путей получается имя контроллера
705                 <code>Bar_BazController</code> в файле
706                 <code>Bar/BazController.php</code>. <code>ViewRenderer</code>
707                 имитирует иерархию директорий контроллеров.
708             </para>
709         </note>
711         <example id="zend.controller.actionhelper.viewrenderer.basicusage.example-2">
712             <title>Отключение авторендеринга</title>
714             <para>
715                 Может потребоваться отключить авторендеринг для некоторых
716                 действий или контроллеров - например, если вы хотите производить
717                 вывод другого типа (XML, JSON и т.д.), или просто не хотите
718                 ничего выводить. Есть два варианта - либо полностью
719                 отключить авторендеринг (<code>setNeverRender()</code>), либо
720                 отключить его для текущего действия
721                 (<code>setNoRender()</code>).
722             </para>
724             <programlisting language="php"><![CDATA[
725 // Класс контроллера baz, модуль bar:
726 class Bar_BazController extends Zend_Controller_Action
728     public function fooAction()
729     {
730         // Не производить авторендеринг в этом действии
731         $this->_helper->viewRenderer->setNoRender();
732     }
735 // Класс контроллера bat, модуль bar:
736 class Bar_BatController extends Zend_Controller_Action
738     public function preDispatch()
739     {
740         // Не производить авторендеринг во всех действиях этого контроллера
741         $this->_helper->viewRenderer->setNoRender();
742     }
744 ]]></programlisting>
745         </example>
747         <note>
748             <para>
749                 В большинстве случаев не имеет смысла глобально отключать
750                 авторендеринг (через <code>setNeverRender()</code>), поскольку
751                 единственная выгода, которую вы получаете в этом случае от
752                 использования <code>ViewRenderer</code> - автоматическая
753                 установка объекта вида.
754             </para>
755         </note>
757         <example id="zend.controller.actionhelper.viewrenderer.basicusage.example-3">
758             <title>Выбор другого скрипта вида</title>
760             <para>
761                 В некоторых случаях требуется, чтобы производился рендеринг
762                 скрипта с именем, отличным от имени действия. Например, если у
763                 вас есть контроллер, который имеет методы действий для
764                 добавления и редактирования, они оба могут отображать один и тот
765                 же вид 'форма', хоть и с разным набором значений. Вы легко
766                 можете изменить имя скрипта, используя методы
767                 <code>setScriptAction()</code> и <code>setRender()</code>, или
768                 вызывая помощника как метод брокера - этим будет произведен
769                 вызов метода <code>setRender()</code>.
770             </para>
772             <programlisting language="php"><![CDATA[
773 // Класс контроллера bar, модуль foo:
774 class Foo_BarController extends Zend_Controller_Action
776     public function addAction()
777     {
778         // Рендерить 'bar/form.phtml' вместо 'bar/add.phtml'
779         $this->_helper->viewRenderer('form');
780     }
782     public function editAction()
783     {
784         // Рендерить 'bar/form.phtml' вместо 'bar/edit.phtml'
785         $this->_helper->viewRenderer->setScriptAction('form');
786     }
788     public function processAction()
789     {
790         // произведение валидации...
791         if (!$valid) {
792             // Рендерить 'bar/form.phtml' вместо 'bar/process.phtml'
793             $this->_helper->viewRenderer->setRender('form');
794             return;
795         }
797         // иначе продолжение обработки...
798     }
801 ]]></programlisting>
802         </example>
804         <example id="zend.controller.actionhelper.viewrenderer.basicusage.example-4">
805             <title>Изменение зарегистрированного объекта вида</title>
807             <para>
808                 А что, если нужно модифицировать объект вида - например,
809                 изменить пути к помощникам или кодировку? Вы можете делать это
810                 как через модификацию объекта вида, установленного в вашем
811                 контроллере, так и через извлечение объекта вида из
812                 <code>ViewRenderer</code>, оба они являются ссылками на один и
813                 тот же объект.
814             </para>
816             <programlisting language="php"><![CDATA[
817 // Класс контроллера bar, модуль foo:
818 class Foo_BarController extends Zend_Controller_Action
820     public function preDispatch()
821     {
822         // Изменение кодировки вида
823         $this->view->setEncoding('UTF-8');
824     }
826     public function bazAction()
827     {
828         // Получение объекта вида и указание 'htmlspecialchars'
829         // в качестве функции для экранирования
830         $view = $this->_helper->viewRenderer->view;
831         $view->setEscape('htmlspecialchars');
832     }
834 ]]></programlisting>
835         </example>
836     </sect4>
838     <sect4 id="zend.controller.actionhelper.viewrenderer.advancedusage">
839         <title>Примеры продвинутого использования</title>
841         <example id="zend.controller.actionhelper.viewrenderer.advancedusage.example-1">
842             <title>Изменение спецификаций пути</title>
844             <para>
845                 В некоторых случаях вы можете решить, что спецификации пути,
846                 используемые по умолчанию, не соответствуют требованиям вашего
847                 сайта. Например, вы можете захотеть иметь одно дерево шаблонов,
848                 к которому можно давать доступ дизайнерам (что, например,
849                 довольно типично в случае использованя
850                 <ulink url="http://smarty.php.net/">Smarty</ulink>).
851                 В таком случае вы можете захотеть задать жесткую
852                 спецификацию базового пути вида и создать альтернативную
853                 спецификацию для собственно путей к скриптам вида.
854             </para>
856             <para>
857                 В рамках данного примера предположим, что базовый путь к
858                 скриптам вида - '/opt/vendor/templates', и вы хотите, чтобы
859                 обращение к скриптам вида производилось по схеме
860                 ':moduleDir/:controller/:action.:suffix'. Также предположим, что
861                 если флаг noController установлен, то нужно, чтобы использовался
862                 верхний уровень вместо поддиректории (':action.:suffix'). И
863                 наконец, вы хотите использовать 'tpl' в качестве суффикса имени
864                 скрипта вида.
865             </para>
867             <programlisting language="php"><![CDATA[
869  * В вашем файле загрузки:
870  */
872 // Другая реализация вида
873 $view = new ZF_Smarty();
875 $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
876 $viewRenderer->setViewBasePathSpec('/opt/vendor/templates')
877              ->setViewScriptPathSpec(':module/:controller/:action.:suffix')
878              ->setViewScriptPathNoControllerSpec(':action.:suffix')
879              ->setViewSuffix('tpl');
880 Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
881 ]]></programlisting>
882         </example>
884         <example id="zend.controller.actionhelper.viewrenderer.advancedusage.example-2">
885             <title>Рендеринг нескольких скриптов вида из одного действия</title>
887             <para>
888                 Иногда бывает нужно произвести рендеринг нескольких скриптов
889                 вида из одного действия. Решение довольно очевидное - просто
890                 сделайте несколько вызовов метода <code>render()</code>:
891             </para>
893             <programlisting language="php"><![CDATA[
894 class SearchController extends Zend_Controller_Action
896     public function resultsAction()
897     {
898         // Предполагается, что $this->model - текущая модель
899         $this->view->results =
900             $this->model->find($this->_getParam('query', '');
902         // render() по умолчанию использует ViewRenderer
903         // Рендеринг формы поиска и затем результатов поиска
904         $this->render('form');
905         $this->render('results');
906     }
908     public function formAction()
909     {
910         // Ничего не делается. ViewRenderer автоматически производит
911         // рендеринг скрипта вида
912     }
914 ]]></programlisting>
915         </example>
916     </sect4>
917 </sect3>
918 <!--
919 vim:se ts=4 sw=4 et: