1 <?xml version="1.0" encoding="UTF-8"?>
3 <sect3 id="zend.controller.actionhelpers.viewrenderer">
4 <title>ViewRenderer</title>
6 <sect4 id="zend.controller.actionhelper.viewrenderer.introduction">
7 <title>Введение</title>
10 Помощник <code>ViewRenderer</code> предназначен для решения
17 Устранение необходимости инстанцирования объектов вида
18 внутри контроллеров; объекты вида будут автоматически
19 регистрироваться вместе с контроллером.
25 Автоматическая установка путей к скриптам вида, помощникам
26 и фильтрам, основанная на текущем модуле, и автоматическое
27 присоединение имени текущего модуля в качестве префикса имен
28 классов помощников и фильтров.
34 Создание глобально доступного объекта вида для всех
35 запускаемых контроллеров и действий.
41 Возможность устанавливать используемые по
42 умолчанию опции рендеринга для всех контроллеров.
48 Возможность автоматического рендеринга скрипта
49 вида, не требующего от разработчика каких-либо действий.
55 Возможность создавать собственные спецификации базового пути
56 вида и путей к скриптам видов.
62 Если вы вручную производите <code>_forward()</code>,
63 перенаправление или <code>render</code>, то авторендеринг не
64 будет произведен, поскольку выполнение любых этих операций
65 говорит помощнику <code>ViewRenderer</code>, что вы определили
66 свой собственный вывод.
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>).
81 Если вы хотите изменить настройки <code>ViewRenderer</code> до
82 начала диспетчеризации, то можете сделать это одним из двух
89 Инстанцировать и зарегистрировать свой объект
90 <code>ViewRenderer</code>, а затем передать его брокеру
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);
104 Инициализировать и/или извлечь по запросу объект
105 <code>ViewRenderer</code> через брокер помощников:
108 <programlisting language="php"><![CDATA[
110 Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
111 $viewRenderer->setView($view)
112 ->setViewSuffix('php');
119 <sect4 id="zend.controller.actionhelper.viewrenderer.api">
123 В простейшем варианте использования вы просто инстанцируете
124 <code>ViewRenderer</code> и передаете его брокеру помощников.
125 Наиболее легким способом его инстанцирования и регистрации является
126 использование метода <code>getStaticHelper()</code> брокера
130 <programlisting language="php"><![CDATA[
131 Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
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 определенных для этого модуля.
148 Каждый раз, когда вызывается <code>postDispatch()</code>, он будет
149 вызывать <code>render()</code> для текущего действия.
153 В качестве примера рассмотрим следующий класс:
156 <programlisting language="php"><![CDATA[
157 // Класс контроллера, модуль foo:
158 class Foo_BarController extends Zend_Controller_Action
160 // Рендеринг bar/index.phtml по умолчанию;
161 // не требуется производить какие-либо операции
162 public function indexAction()
166 // Рендеринг bar/populate.phtml с переменной 'foo', установленной в 'bar'.
167 // Поскольку объект вида определен в preDispatch(), то он всегда доступен.
168 public function populateAction()
170 $this->view->foo = 'bar';
176 // в одном из ваших скриптов вида:
177 $this->foo(); // вызывает Foo_View_Helper_Foo::foo()
181 <code>ViewRenderer</code> также определяет несколько аксессоров для
182 того, чтобы можно было устанавливать и извлекать опции видов:
188 <code>setView($view)</code> позволяет установить объект вида
189 для <code>ViewRenderer</code>. Объект сохраняется в
190 открытом свойстве <varname>$view</varname> класса.
196 <code>setNeverRender($flag = true)</code> может
197 использоваться для отключения или включения авторендеринга
198 глобально, т.е. для всех контроллеров. Если установлен в
199 <constant>TRUE</constant>, то <code>postDispatch()</code> не будет
200 автоматически вызывать <code>render()</code> в текущем
201 контроллере. <code>getNeverRender()</code> возвращает
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 возвращает текущее значение.
222 <code>setNoController($flag = true)</code> может
223 использоваться для того, чтобы указать
224 методу <code>render()</code>, чтобы он не искал скрипт вида
225 в поддиректории с именем контроллера (что является
226 поведением по умолчанию). <code>getNoController()</code>
227 возвращает текущее значение.
233 <code>setNeverController($flag = true)</code> является
234 аналогом <code>setNoController()</code>, но работает на
235 глобальном уровне - т.е. он не будет сбрасываться с каждым
236 обработанным действием. <code>getNeverController()</code>
237 возвращает текущее значение.
243 <code>setScriptAction($name)</code> может использоваться для
244 того, чтобы указать скрипт действия для рендеринга.
245 <varname>$name</varname> должен быть именем скрипта без суффикса
246 (и без поддиректории контроллера, за исключением того
247 случая, когда включен <code>noController</code>). Если не
248 задан, то ищется скрипт вида с именем, аналогичным имени
249 действия в объекте запроса. <code>getScriptAction()</code>
250 возвращает текущее значение.
256 <code>setResponseSegment($name)</code> может использоваться
257 для указания того, в какой именованный сегмент объекта
258 ответа следует сохранить результат рендеринга. Если не
259 указан, то выходные данные сохраняются в сегменте,
260 используемом по умолчанию. <code>getResponseSegment()</code>
261 возвращает текущее значение.
267 <code>initView($path, $prefix, $options)</code> может
268 вызываться для указания базового пути вида, префикса классов
269 помощников и фильтров, опций помощника
270 <code>ViewRenderer</code>. Вы можете передавать любые из
272 <code>neverRender</code>, <code>noRender</code>,
273 <code>noController</code>, <code>scriptAction</code> и
274 <code>responseSegment</code>.
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 что дает возможность легко вызывать этот метод из вашего
289 <programlisting language="php"><![CDATA[
290 // Рендеринг 'foo' вместо текущего скрипта вида
291 $this->_helper->viewRenderer('foo');
293 // Рендеринг form.phtml в сегмент ответа 'html' в обход
295 $this->_helper->viewRenderer('form', 'html', true);
299 <code>setRender()</code> и <code>direct()</code> в
300 действительности не производят рендеринг скрипта вида, а
301 устанавливают закрытые свойства помощника, которые
302 <code>postDispatch()</code> и <code>render()</code>
303 будут использовать при рендеринге скрипта вида.
309 Конструктор позволяет опционально передать объект вида и опции
310 <code>ViewRenderer</code>. Он использует те же флаги, что и
311 <code>initView()</code>:
314 <programlisting language="php"><![CDATA[
315 $view = new Zend_View(array('encoding' => 'UTF-8'));
316 $options = array('noController' => true, 'neverRender' => true);
318 new Zend_Controller_Action_Helper_ViewRenderer($view, $options);
322 <code>ViewRenderer</code> имеет несколько дополнительных методов для
323 создания пользовательских спецификаций пути, используемых для
324 определения базового пути вида, добавляемого в объект вида, и пути к
325 определенному скрипту вида, используемого при автоматическом
326 определении скрипта вида для рендеринга. Все эти методы принимают
327 одну или более меток заполнения:
333 <code>:moduleDir</code> ссылается на текущую базовую
334 директорию модуля (по соглашению это директория,
335 родительская по отношению к директории контроллеров модуля).
341 <code>:module</code> ссылается на имя текущего модуля.
347 <code>:controller</code> ссылается на имя текущего
354 <code>:action</code> ссылается на имя текущего действия.
360 <code>:suffix</code> ссылается на суффикс скрипта вида
361 (который может быть установлен через
362 <code>setViewSuffix()</code>).
368 Методы для управления спецификациями пути:
374 <code>setViewBasePathSpec($spec)</code> позволяет изменить
375 спецификацию пути, используемую для определения базового
376 пути, добавляемого в объект вида. По умолчанию используется
377 спецификация <code>:moduleDir/views</code>. Вы можете в
378 любое время получить текущую спецификацицию, используя метод
379 <code>getViewBasePathSpec()</code>.
385 <code>setViewScriptPathSpec($spec)</code> позволяет изменить
386 спецификацию пути, используемую для определения пути к
387 отдельному скрипту вида (без базового пути скрипта вида).
388 По умолчанию используется спецификация
389 <code>:controller/:action.:suffix</code>. Вы можете в любое
390 время получить текущую спецификацию, используя метод
391 <code>getViewScriptPathSpec()</code>.
397 <code>setViewScriptPathNoControllerSpec($spec)</code>
398 позволяет изменить спецификацию пути, используемую для
399 определения пути к отдельному скрипту вида, когда действует
400 <code>noController</code> (без базового пути скрипта вида).
401 По умолчанию используется спецификация
402 <code>:action.:suffix</code>. Вы можете в любое время
403 получить текущую спецификацию, используя метод
404 <code>getViewScriptPathNoControllerSpec()</code>.
410 Для более детального управления спецификациями путей вы можете
412 <link linkend="zend.filter.inflector">Zend_Filter_Inflector</link>.
413 Внутри себя <code>ViewRenderer</code> уже использует инфлектор для
414 поиска соответствий. Для взаимодействия с инфлектором - установки
415 своего собственного инфлектора или изменения используемого по
416 умолчанию - могут использоваться следующие методы:
422 <code>getInflector()</code> возвращает инфлектор. Если в
423 <code>ViewRenderer</code> его нет, то метод создает его,
424 используя правила по умолчанию.
428 По умолчанию он использует ссылки на статические правила для
429 суффикса и директории модуля, так же, как и статическую
430 цель. Это дает различным свойствам <code>ViewRenderer</code>
431 возможность динамически изменять инфлектор.
437 <code>setInflector($inflector, $reference)</code> позволяет
438 устанавливать свой инфлектор для использования с
439 <code>ViewRenderer</code>. Если <varname>$reference</varname>
440 равен true, то суффикс и директория модуля будут установлены
441 как статические ссылки на свойства
442 <code>ViewRenderer</code>, так же, как и цель.
447 <title>Используемые по умолчанию соглашения по поиску</title>
450 <code>ViewRenderer</code> производит некоторую нормализацию пути
451 для облегчения поиска скрипта вида. Используемые по умолчанию
458 <code>:module</code>: СловаРазделенныеРегистром
459 (CamelCase) разделяются тире и вся строка приводится к
460 нижнему регистру. Например: "FooBarBaz" преобразуется в
465 Внутри себя инфлектор использует фильтры
466 <classname>Zend_Filter_Word_CamelCaseToDash</classname> и
467 <classname>Zend_Filter_StringToLower</classname>.
473 <code>:controller</code>:
474 СловаРазделенныеРегистром (CamelCase) разделяются
475 тире, знаки подчеркивания преобразуются в разделители
476 директорий и вся строка приводится к нижнему регистру.
477 Например: "FooBar" преобразуется в "foo-bar";
478 "FooBar_Admin" преобразуется в "foo-bar/admin".
482 Внутри себя инфлектор использует фильтры
483 <classname>Zend_Filter_Word_CamelCaseToDash</classname>,
484 <classname>Zend_Filter_Word_UnderscoreToSeparator</classname> и
485 <classname>Zend_Filter_StringToLower</classname>.
491 <code>:action</code>:
492 СловаРазделенныеРегистром (CamelCase) разделяются
493 тире, символы, не являющиеся буквенно-цифровыми,
495 вся строка приводится к нижнему регистру.
496 Например: "fooBar" преобразуется в "foo-bar";
497 "foo-barBaz" преобразуется в "foo-bar-baz".
501 Внутри себя инфлектор использует фильтры
502 <classname>Zend_Filter_Word_CamelCaseToDash</classname>,
503 <classname>Zend_Filter_PregReplace</classname> и
504 <classname>Zend_Filter_StringToLower</classname>.
511 Последними рассматриваемыми элементами в API <code>ViewRenderer</code>-а являются
512 методы для собственно определения путей к скриптам вида и
513 рендеринга видов. Эти методы включают в себя:
519 <code>renderScript($script, $name)</code> позволяет
520 производить рендеринг скрипта по указанному пути,
521 в опционально заданный именованный сегмент. Если
522 используется этот метод, то <code>ViewRenderer</code> не
523 производит автоматическое определение имени скрипта, вместо
524 этого он напрямую передает аргумент <varname>$script</varname>
525 методу <code>render()</code> объекта вида.
529 После того, как был произведен рендеринг вида в объект
530 ответа, устанавливается <code>noRender</code> для
531 предотвращения случайного повторного рендеринга того же
538 <code>Zend_Controller_Action::renderScript()</code>
539 вызывает метод <code>renderScript()</code> помощника
540 <code>ViewRenderer</code>.
547 <code>getViewScript($action, $vars)</code> создает путь к
548 скрипту вида, основываясь на переданном действии $action
549 и/или переменных, переданных в $vars. Этот массив может
550 включать в себя ключи спецификаций пути ('moduleDir',
551 'module', 'controller', 'action' и 'suffix'). Если
552 была передана переменная, то она будет использована, иначе
553 будут использоваться значения из текущего запроса.
557 <code>getViewScript()</code> будет использовать
558 <code>viewScriptPathSpec</code>, либо
559 <code>viewScriptPathNoControllerSpec</code>, в зависимости
560 от значения флага <code>noController</code>.
564 Разделители слов в именах модуля, контроллера или действия
565 будут заменены на тире ('-'). Таким образом, если вы имеете
566 контроллер с именем 'foo.bar' и действие 'baz:bat', то при
567 использовании спецификации по умолчанию результатом
568 будет путь 'foo-bar/baz-bat.phtml' к скрипту вида.
574 <code>Zend_Controller_Action::getViewScript()</code>
575 вызывает метод <code>getViewScript()</code>
576 <code>ViewRenderer</code>-а.
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>.
596 Следует помнить о побочных эффектах использования
597 render(): значения, передаваемые для имени сегмента
598 ответа и флага noController, сохраняются в объекте.
599 Кроме этого, по окончании рендеринга будет установлен
607 <code>Zend_Controller_Action::render()</code> вызывает
608 метод <code>render()</code> помощника
609 <code>ViewRenderer</code>.
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>.
627 <sect4 id="zend.controller.actionhelper.viewrenderer.basicusage">
628 <title>Примеры базового использования</title>
630 <example id="zend.controller.actionhelper.viewrenderer.basicusage.example-1">
631 <title>Базовое использование</title>
634 В простейшем случае вы просто инициализируете и
635 регистрируете помощник <code>ViewRenderer</code> через брокер
636 помощников в своем файле загрузки и затем устанавливаете
637 переменные в своих методах действий.
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()
655 // Рендеринг bar/populate.phtml с переменной 'foo', установленной в 'bar'.
656 // Поскольку объект вида был определен в preDispatch(), то он уже
657 // доступен для использования.
658 public function populateAction()
660 $this->view->foo = 'bar';
663 // Ничего не рендерится, т.к. производится переход на другое действие;
664 // это другое действие может производить рендеринг
665 public function bazAction()
667 $this->_forward('index');
670 // Ничего не рендерится, т.к. производится перенаправление по другому адресу
671 public function batAction()
673 $this->_redirect('/index');
680 <title>Соглашения по именованию: Разделители слов в именах контроллера и действия</title>
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> должен быть
695 <code>Bar_BazController::bazBatAction()</code> в
696 <code>Bar/BazController.php</code> (обратите внимание на
697 разделение путей), при этом производится рендеринг
698 <code>bar/baz/baz-bat.phtml</code>.
702 Во втором примере обратите внимание на то, что по-прежнему
703 используется модуль по умолчанию, но из-за наличия
704 разделителя путей получается имя контроллера
705 <code>Bar_BazController</code> в файле
706 <code>Bar/BazController.php</code>. <code>ViewRenderer</code>
707 имитирует иерархию директорий контроллеров.
711 <example id="zend.controller.actionhelper.viewrenderer.basicusage.example-2">
712 <title>Отключение авторендеринга</title>
715 Может потребоваться отключить авторендеринг для некоторых
716 действий или контроллеров - например, если вы хотите производить
717 вывод другого типа (XML, JSON и т.д.), или просто не хотите
718 ничего выводить. Есть два варианта - либо полностью
719 отключить авторендеринг (<code>setNeverRender()</code>), либо
720 отключить его для текущего действия
721 (<code>setNoRender()</code>).
724 <programlisting language="php"><![CDATA[
725 // Класс контроллера baz, модуль bar:
726 class Bar_BazController extends Zend_Controller_Action
728 public function fooAction()
730 // Не производить авторендеринг в этом действии
731 $this->_helper->viewRenderer->setNoRender();
735 // Класс контроллера bat, модуль bar:
736 class Bar_BatController extends Zend_Controller_Action
738 public function preDispatch()
740 // Не производить авторендеринг во всех действиях этого контроллера
741 $this->_helper->viewRenderer->setNoRender();
749 В большинстве случаев не имеет смысла глобально отключать
750 авторендеринг (через <code>setNeverRender()</code>), поскольку
751 единственная выгода, которую вы получаете в этом случае от
752 использования <code>ViewRenderer</code> - автоматическая
753 установка объекта вида.
757 <example id="zend.controller.actionhelper.viewrenderer.basicusage.example-3">
758 <title>Выбор другого скрипта вида</title>
761 В некоторых случаях требуется, чтобы производился рендеринг
762 скрипта с именем, отличным от имени действия. Например, если у
763 вас есть контроллер, который имеет методы действий для
764 добавления и редактирования, они оба могут отображать один и тот
765 же вид 'форма', хоть и с разным набором значений. Вы легко
766 можете изменить имя скрипта, используя методы
767 <code>setScriptAction()</code> и <code>setRender()</code>, или
768 вызывая помощника как метод брокера - этим будет произведен
769 вызов метода <code>setRender()</code>.
772 <programlisting language="php"><![CDATA[
773 // Класс контроллера bar, модуль foo:
774 class Foo_BarController extends Zend_Controller_Action
776 public function addAction()
778 // Рендерить 'bar/form.phtml' вместо 'bar/add.phtml'
779 $this->_helper->viewRenderer('form');
782 public function editAction()
784 // Рендерить 'bar/form.phtml' вместо 'bar/edit.phtml'
785 $this->_helper->viewRenderer->setScriptAction('form');
788 public function processAction()
790 // произведение валидации...
792 // Рендерить 'bar/form.phtml' вместо 'bar/process.phtml'
793 $this->_helper->viewRenderer->setRender('form');
797 // иначе продолжение обработки...
804 <example id="zend.controller.actionhelper.viewrenderer.basicusage.example-4">
805 <title>Изменение зарегистрированного объекта вида</title>
808 А что, если нужно модифицировать объект вида - например,
809 изменить пути к помощникам или кодировку? Вы можете делать это
810 как через модификацию объекта вида, установленного в вашем
811 контроллере, так и через извлечение объекта вида из
812 <code>ViewRenderer</code>, оба они являются ссылками на один и
816 <programlisting language="php"><![CDATA[
817 // Класс контроллера bar, модуль foo:
818 class Foo_BarController extends Zend_Controller_Action
820 public function preDispatch()
822 // Изменение кодировки вида
823 $this->view->setEncoding('UTF-8');
826 public function bazAction()
828 // Получение объекта вида и указание 'htmlspecialchars'
829 // в качестве функции для экранирования
830 $view = $this->_helper->viewRenderer->view;
831 $view->setEscape('htmlspecialchars');
838 <sect4 id="zend.controller.actionhelper.viewrenderer.advancedusage">
839 <title>Примеры продвинутого использования</title>
841 <example id="zend.controller.actionhelper.viewrenderer.advancedusage.example-1">
842 <title>Изменение спецификаций пути</title>
845 В некоторых случаях вы можете решить, что спецификации пути,
846 используемые по умолчанию, не соответствуют требованиям вашего
847 сайта. Например, вы можете захотеть иметь одно дерево шаблонов,
848 к которому можно давать доступ дизайнерам (что, например,
849 довольно типично в случае использованя
850 <ulink url="http://smarty.php.net/">Smarty</ulink>).
851 В таком случае вы можете захотеть задать жесткую
852 спецификацию базового пути вида и создать альтернативную
853 спецификацию для собственно путей к скриптам вида.
857 В рамках данного примера предположим, что базовый путь к
858 скриптам вида - '/opt/vendor/templates', и вы хотите, чтобы
859 обращение к скриптам вида производилось по схеме
860 ':moduleDir/:controller/:action.:suffix'. Также предположим, что
861 если флаг noController установлен, то нужно, чтобы использовался
862 верхний уровень вместо поддиректории (':action.:suffix'). И
863 наконец, вы хотите использовать 'tpl' в качестве суффикса имени
867 <programlisting language="php"><![CDATA[
869 * В вашем файле загрузки:
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);
884 <example id="zend.controller.actionhelper.viewrenderer.advancedusage.example-2">
885 <title>Рендеринг нескольких скриптов вида из одного действия</title>
888 Иногда бывает нужно произвести рендеринг нескольких скриптов
889 вида из одного действия. Решение довольно очевидное - просто
890 сделайте несколько вызовов метода <code>render()</code>:
893 <programlisting language="php"><![CDATA[
894 class SearchController extends Zend_Controller_Action
896 public function resultsAction()
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');
908 public function formAction()
910 // Ничего не делается. ViewRenderer автоматически производит
911 // рендеринг скрипта вида