1 <?xml version="1.0" encoding="UTF-8"?>
2 <!-- EN-Revision: 20765 -->
4 <sect3 id="zend.controller.actionhelpers.viewrenderer">
5 <title>ViewRenderer</title>
7 <sect4 id="zend.controller.actionhelper.viewrenderer.introduction">
8 <title>Introducción</title>
10 <para> El ayudante <emphasis>ViewRenderer</emphasis> está diseñado para
11 satisfacer los siguientes objetivos: </para>
15 <para>Eliminar la necesidad de instanciar objetos de vista
16 dentro de los controladores; los objetos de vista quedarán
17 registrados automáticamente con el contralor.</para>
21 <para>Establece automáticamente el script de vista, el ayudante,
22 y los paths de los filtros basados en el módulo actual.
23 Asocia automáticamente el nombre del módulo actual como un
24 prefijo de clase para las clases ayudante y filtro. </para>
28 <para>Crea un objeto de vista, disponible globalmente para todos
29 los controladores y acciones despachados.</para>
33 <para>Permite al desarrollador establecer por defecto las
34 opciones de renderizado para todos los controladores.
39 <para>Agrega la capacidad para renderizar automáticamente los
40 scripts de vista sin ninguna intervención.</para>
44 <para>Permite al desarrollador crear sus propias
45 especificaciones para el path base de vistas y para el path
46 de los scripts de vista.</para>
51 <para> Si realiza un <methodname>_forward()</methodname> ,
52 redirecciona, o <methodname>render()</methodname> manualmente,
53 el autorendering no se llevará a cabo, como está realizando
54 cualquiera de estas acciones le está diciendo al
55 <emphasis>ViewRenderer</emphasis> que usted está
56 determinando su propia salida. </para>
60 <para> El <emphasis>ViewRenderer</emphasis> está habilitado por
61 defecto. Puede desactivarlo vía parámetro del front controller
62 <emphasis>noViewRenderer</emphasis>
63 (<command>$front->setParam('noViewRenderer',true)</command>)
64 o eliminando al ayudante del stack de ayudantes ( <methodname>
65 Zend_Controller_Action_HelperBroker::removeHelper('viewRenderer')
66 </methodname> ). </para>
68 <para> Si desea modificar los settings del
69 <emphasis>ViewRenderer</emphasis> antes de despachar el
70 front controller, puede hacerlo en una de las dos maneras: </para>
74 <para> Instanciar y registrar su propio objeto
75 <emphasis>ViewRenderer</emphasis> y pasarlo al
78 <programlisting language="php"><![CDATA[
79 $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
80 $viewRenderer->setView($view)
81 ->setViewSuffix('php');
82 Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
87 <para> Inicializar y/o recuperar un objeto
88 <emphasis>ViewRenderer</emphasis> por demanda via el
91 <programlisting language="php"><![CDATA[
93 Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
94 $viewRenderer->setView($view)
95 ->setViewSuffix('php');
102 <sect4 id="zend.controller.actionhelper.viewrenderer.api">
105 <para> En su uso más básico, simplemente instancie a
106 <emphasis>ViewRenderer</emphasis> y páselo al ayudante de
107 acciones. La forma más fácil para instanciar y registrar de una sola
108 vez es utilizando el método del ayudante
109 <methodname>getStaticHelper()</methodname> : </para>
111 <programlisting language="php"><![CDATA[
112 Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
115 <para> La primera vez que se instancia un controlador de acción, se
116 disparará <emphasis>ViewRenderer</emphasis> para instanciar al
117 objeto vista. Cada vez que el controlador es instanciado, se llama
118 al método <methodname>init()</methodname> de
119 <emphasis>ViewRenderer</emphasis> , que lo llevará a establecer
120 la propiedad del controlador de acción, y llama a
121 <methodname>addScriptPath()</methodname> con un path relativo al
122 módulo actual; este será llamado con un prefijo de clase nombrada
123 después del módulo actual, haciendo efectivamente el namespacing de
124 todas las clases de ayudantes y filtros que define para el módulo. </para>
126 <para> Cad vez que llama a <methodname>postDispatch()</methodname> ,
127 este llamará a <methodname>render()</methodname> para la acción
130 <para>Como ejemplo, considere la siguiente clase:</para>
132 <programlisting language="php"><![CDATA[
133 // Una clase controlador, módulo foo:
134 class Foo_BarController extends Zend_Controller_Action
136 // Render bar/index.phtml por defecto; no se requiere acción
137 public function indexAction()
141 // Render bar/populate.phtml con la variable 'foo' establecida a 'bar'.
142 // Dado que el objeto vista está definido en preDispatch(),
143 // ya está disponible.
144 public function populateAction()
146 $this->view->foo = 'bar';
152 // en uno de sus scripts de vista:
153 $this->foo(); // llama a Foo_View_Helper_Foo::foo()
156 <para> El <emphasis>ViewRenderer</emphasis> también define una serie de
157 accededores para permitir establecer y recuperar opciones de vista: </para>
162 <methodname>setView($view)</methodname> le permite
163 establecer el objeto vista para
164 <emphasis>ViewRenderer</emphasis> . Se vuelve como una
165 propiedad de clase pública <varname>$view</varname> .
171 <methodname>setNeverRender($flag = true)</methodname> puede
172 ser utilizado para activar o desactivar globalmente el
173 autorendering, es decir, para todos los controladores. Si es
174 verdadero, <methodname>postDispatch()</methodname> no
175 llamará automáticamente a <methodname>render()</methodname>
176 en el controlador actual.
177 <methodname>getNeverRender()</methodname> recupera el
178 valor actual. </para>
183 <methodname>setNoRender($flag = true)</methodname> puede ser
184 utilizado para activar o desactivar el autorendering. Si es
185 verdadero, <methodname>postDispatch()</methodname> no
186 llamará automáticamente a <methodname>render()</methodname>
187 en el controlador actual. Este ajuste se reseteará cada vez
188 que se llame a <methodname>preDispatch()</methodname> (es
189 decir, usted necesita establecer este flag para cada
190 controlador para el cual no quiera que el autorenderering se
191 ejecute). <methodname>getNoRender()</methodname> recupera el
192 valor actual. </para>
197 <methodname>setNoController($flag = true)</methodname> pude
198 ser usado para decirle a <methodname>render()</methodname>
199 que no busque el script de acción en un subdirectorio
200 nombrado después de que el controlador (que es el
201 comportamiento por defecto)
202 <methodname>getNoController()</methodname> recupere el
203 valor actual. </para>
208 <methodname>setNeverController($flag = true)</methodname> es
209 análogo a <methodname>setNoController()</methodname> , pero
210 trabaja a un nivel global -- es decir, que no se reseteará
211 por cada acción ejecutada.
212 <methodname>getNeverController()</methodname> recupera
213 el valor actual. </para>
218 <methodname>setScriptAction($name)</methodname> puede ser
219 utilizado para especificar el script de acción a renderizar.
220 <varname>$name</varname> debe ser el nombre del script
221 menos el sufijo del archivo (y sin el subdirectorio del
222 controlador, a menos que <emphasis>noController</emphasis>
223 se haya activado). Si no se ha especificado, busca un script
224 de vista nombrado después de la acción en el objeto
225 solicitud. <methodname>getScriptAction()</methodname>
226 recupera el valor actual. </para>
231 <methodname>setResponseSegment($name)</methodname> puede ser
232 utilizado para especificar qué segmento del objeto respuesta
233 nombrado renderizar. Si no se especifica, se hace en el
234 segmento por defecto.
235 <methodname>getResponseSegment()</methodname> recupera
236 el valor actual. </para>
241 <methodname>initView($path, $prefix, $options)</methodname>
242 puede ser llamado para especificar el path base de las
243 vistas, prefijos de clase para scripts de ayudantes y
244 filtros, y las opciones de <emphasis>ViewRenderer</emphasis>
245 . Puede pasar cualquiera de los siguientes flags:
246 <emphasis>neverRender</emphasis> ,
247 <emphasis>noRender</emphasis> ,
248 <emphasis>noController</emphasis> ,
249 <emphasis>scriptAction</emphasis> , y
250 <emphasis>responseSegment</emphasis> . </para>
255 <methodname>setRender($action = null, $name = null,
256 $noController = false)</methodname> le permite
257 establecer cualquier <emphasis>scriptAction</emphasis> ,
258 <emphasis>responseSegment</emphasis> , y
259 <emphasis>noController</emphasis> en un pase.
260 <methodname>direct()</methodname> es un alias a este
261 método, permitiéndole llamar a este método fácilmente dede
262 su controlador: </para>
264 <programlisting language="php"><![CDATA[
265 // Render 'foo' en lugar del script de acción actual
266 $this->_helper->viewRenderer('foo');
268 // render form.phtml al segmento de respuesta de 'html', sin usar un
269 // subdirectorio de scripts de controladores de acción:
270 $this->_helper->viewRenderer('form', 'html', true);
275 <methodname>setRender()</methodname> y
276 <methodname>direct()</methodname> realmente no
277 renderiza el script de vista, sino que establece
278 indicaciones que <methodname>postDispatch()</methodname>
279 y <methodname>render()</methodname> utlizarán para
280 renderizar la vista. </para>
285 <para> El constructor le permite opcionalmente pasar el objeto vista y
286 las opciones de <emphasis>ViewRenderer</emphasis> ; acepta los
287 mismos flags que <methodname>initView()</methodname> : </para>
289 <programlisting language="php"><![CDATA[
290 $view = new Zend_View(array('encoding' => 'UTF-8'));
291 $options = array('noController' => true, 'neverRender' => true);
293 new Zend_Controller_Action_Helper_ViewRenderer($view, $options);
296 <para>Hay varios métodos adicionales para personalizar especificaciones
297 del path, usados para determinar el path base del script de vista
298 para añadir al objeto vista, y el path del script de vista a usar
299 cuando esté autodeterminando el script de vista a renderizar. Cada
300 uno de estos métodos toma uno o más de los siguientes
301 localizadores:</para>
306 <emphasis>:moduleDir</emphasis> hace referencia a la actual
307 directorio base del módulo(por convención, el directorio
308 padre del directorio del módulo controlador). </para>
313 <emphasis>:module</emphasis> hace referencia al nombre del
314 módulo actual. </para>
319 <emphasis>:controller</emphasis> hace referencia al nombre
320 del controlador actual. </para>
325 <emphasis>:action</emphasis> hace referencia al nombre de la
326 acción actual. </para>
331 <emphasis>:suffix</emphasis> hace referencia al sufijo del
332 script de vista (que puede ser definido via
333 <methodname>setViewSuffix()</methodname> ). </para>
337 <para>Los métodos para controlar las especificaciones del path
343 <methodname>setViewBasePathSpec($spec)</methodname> le
344 permite cambiar la especificación del path utilizada para
345 determinar el path base para añadir al objeto vista. La
346 especificación por defecto es
347 <filename>:moduleDir/views</filename> . Puede recuperar
348 la especificación actual en cualquier momento usando
349 <methodname>getViewBasePathSpec()</methodname> . </para>
354 <methodname>setViewScriptPathSpec($spec)</methodname> le
355 permite cambiar el path de la especificación utilizada para
356 determinar el path a un script de vista individual (menos el
357 path de la base del script de vista). La especificación por
358 defecto es <filename>:controller/:action.:suffix</filename>
359 . Puede recuperar la especificación actual en cualquier
361 <methodname>getViewScriptPathSpec()</methodname> .
367 <methodname>setViewScriptPathNoControllerSpec($spec)</methodname>
368 le permite cambiar el path de la especificación utilizado
369 para determinar el path a un script de vista individual
370 cuando <emphasis>noController</emphasis> está activado
371 (menos el path base del script de vista). La especificación
372 por defecto es <filename>:action.:suffix</filename> . Puede
373 recuperar la especificación actual en cualquier momento
375 <methodname>getViewScriptPathNoControllerSpec()</methodname>
380 <para> Para un control más refinado sobre el path de especificaciones,
381 puede usar <link linkend="zend.filter.inflector"
382 >Zend_Filter_Inflector</link> . Bajo el capó,
383 <emphasis>ViewRenderer</emphasis> ya usa un inflector para
384 realizar mapeos del path. Para interactuar con el inflector -- ya
385 sea para establecerlo para uso propio, o para modificar el inflector
386 por defecto, se pueden utilizar los siguientes métodos: </para>
391 <methodname>getInflector()</methodname> recupera el
392 inflector. Si no existe todavía en
393 <emphasis>ViewRenderer</emphasis> , se crea uno
394 utilizando las reglas predeterminadas. </para>
396 <para> Por defecto, utiliza reglas de referencias estáticas para
397 el sufijo y directorio de módulos, así como una meta
398 estática; esto permite que diversas propiedades de
399 <emphasis>ViewRenderer</emphasis> tengan la capacidad de
400 modificar dinámicamente al inflector. </para>
405 <methodname>setInflector($inflector,
406 $reference)</methodname> permite establecer un inflector
407 personalizado para usar con
408 <emphasis>ViewRenderer</emphasis> . Si
409 <varname>$reference</varname> es verdadero, establecerá
410 el sufijo y directorio de módulos como referencias estáticas
411 a las propiedades de <emphasis>ViewRenderer</emphasis> , así
412 como al objetivo. </para>
417 <title>Convenciones por Defecto para Lookup</title>
419 <para> El <emphasis>ViewRenderer</emphasis> hace algún tipo de
420 normalización del path para facilitar la búsqueda de los scripts
421 de vista. Las reglas predeterminadas son los siguientes: </para>
426 <emphasis>:module</emphasis> : MixedCase y
427 camelCasedWords están separados por guiones, y el string
428 completo se convierte a minúsculas. Por ejemplo:
429 "FooBarBaz" pasa a ser "foo-bar-baz". </para>
431 <para> Internamente, el inflector utiliza los filtros
432 <classname>Zend_Filter_Word_CamelCaseToDash</classname>
433 y <classname>Zend_Filter_StringToLower</classname> .
439 <emphasis>:controller</emphasis> : MixedCase y
440 camelCasedWords están separados por guiones; los
441 subrayados se convierten en separadores de directorio ,
442 y el string emitido a minúsculas. Ejemplos: "
443 <classname>FooBar</classname> " pasa a ser
444 "foo-bar"; " <classname>FooBar_Admin</classname> " pasa
445 a ser " <filename>foo-bar/admin</filename> ". </para>
447 <para> Internamente, el inflector utiliza los filtros
448 <classname>Zend_Filter_Word_CamelCaseToDash</classname>
450 <classname>Zend_Filter_Word_UnderscoreToSeparator</classname>
451 , y <classname>Zend_Filter_StringToLower</classname> .
457 <emphasis>:action</emphasis> : MixedCase y
458 camelCasedWords están separados por guiones; los
459 caracteres no alfanuméricos son traducidos a guiones, y
460 el string emitido a minúsculas. Ejemplos: "fooBar" pasa
461 a ser "foo-bar"; "foo-barBaz" pasa a ser "foo-bar-baz". </para>
463 <para> Internamente, el inflector utiliza los filtros
464 <classname>Zend_Filter_Word_CamelCaseToDash</classname>
465 , <classname>Zend_Filter_PregReplace</classname> , y
466 <classname>Zend_Filter_StringToLower</classname> .
472 <para> Los últimos temas en la <acronym>API</acronym> de
473 <emphasis>ViewRenderer</emphasis> son los métodos para
474 determinar realmente los paths de los scripts de vista y el
475 rendering de las vistas. Estos incluyen: </para>
480 <methodname>renderScript($script, $name)</methodname>
481 permite renderizar un script con una ruta que especifique,
482 opcionalmente a un segmento nombrado del path. Cuando se
483 utiliza este método, <emphasis>ViewRenderer</emphasis> no
484 autodetermina el nombre del script, en cambio pasa
485 directamente a <varname>$script</varname> el argumento
486 directamente al método del objeto vista
487 <methodname>render()</methodname> . </para>
490 <para> Una vez que la vista ha sido renderizada al objeto
491 respuesta, se establece <emphasis>noRender</emphasis>
492 para evitar accidentalmente renderizar el mismo script
493 de vista varias veces. </para>
498 <methodname>Zend_Controller_Action::renderScript()</methodname>
499 le delega a <emphasis>ViewRenderer</emphasis> el método
500 <methodname>renderScript()</methodname> . </para>
506 <methodname>getViewScript($action, $vars)</methodname> crea
507 el path a un script de vista basado en la acción pasada y/o
508 cualquier variables pasadas en <varname>$vars</varname> .
509 Las claves para este array pueden incluir cualquiera de las
510 claves de especificación de paths ('moduleDir', 'module',
511 'controller', 'action', y 'suffix'). Se utilizarán
512 cualquiera de la variables pasadas; de lo contrario, se
513 utilizarán valores basados en la petición actual. </para>
516 <methodname>getViewScript()</methodname> utilizará tanto a
517 <emphasis>viewScriptPathSpec</emphasis> o
518 <emphasis>viewScriptPathNoControllerSpec</emphasis>
519 sobre la base establecida del flag
520 <emphasis>noController</emphasis> . </para>
522 <para> Los delimitadores de palabras encontrados en un módulo,
523 controlador o nombres de acción serán reemplazados por
524 guiones ('-'). Así pues, si tiene el nombre de controlador '
525 <command>foo.bar</command> ' y la acción '
526 <command>baz:bat</command> ', utilizando la
527 especificación por defecto del path se traducirá en un path
529 <filename>foo-bar/baz-bat.phtml</filename> '. </para>
533 <methodname>Zend_Controller_Action::getViewScript()</methodname>
535 <methodname>getViewScript()</methodname> de
536 <emphasis>ViewRenderer</emphasis> . </para>
542 <methodname>render($action, $name,
543 $noController)</methodname> comprueba primero para ver
544 si bien <varname>$name</varname> o
545 <varname>$noController</varname> se han pasado, y si es
546 así, establece los flags apropiados (responseSegment y
547 noController, respectivamente) en
548 <emphasis>ViewRenderer</emphasis> . A continuación, pasa
549 el argumento <varname>$action</varname> , si hay alguno, a
550 <methodname>getViewScript()</methodname> . Por último,
551 pasa el path calculado del script de vista a
552 <methodname>renderScript()</methodname> . </para>
555 <para> Hay que ser conscientes de los efectos secundarios al
556 usar <methodname>render()</methodname> : los valores que
557 usted pasa para el nombre del segmento respuesta y para
558 el flag noController persistirán en el objeto. Además,
559 noRender será establecido después de completar la
560 renderización. </para>
565 <methodname>Zend_Controller_Action::render()</methodname>
566 delega a <emphasis>ViewRenderer</emphasis> el método
567 <methodname>render()</methodname> . </para>
573 <methodname>renderBySpec($action, $vars, $name)</methodname>
574 permite pasar variables de especificación del path a fin de
575 determinar el path para la creación del script de vista.
576 Este pasa <varname>$action</varname> y
577 <varname>$vars</varname> a
578 <methodname>getScriptPath()</methodname> , y luego pasa
579 el path del script resultante y <varname>$name</varname> a
580 <methodname>renderScript()</methodname> . </para>
585 <sect4 id="zend.controller.actionhelper.viewrenderer.basicusage">
586 <title>Ejemplos Uso Básico</title>
589 id="zend.controller.actionhelper.viewrenderer.basicusage.example-1">
590 <title>Uso Básico</title>
592 <para> En lo más básico, usted simplemente inicializa y registra el
593 ayudante <emphasis>ViewRenderer</emphasis> con el ayudante
594 broker en su bootstrap, y luego establecer las variables en sus
595 métodos de acción. </para>
597 <programlisting language="php"><![CDATA[
599 Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
603 // 'foo' módulo, 'bar' controlador:
604 class Foo_BarController extends Zend_Controller_Action
606 // Render bar/index.phtml por defecto; no se requieren acciones
607 public function indexAction()
611 // Render bar/populate.phtml la variable 'foo' establecida a 'bar'.
612 // Dado que el objeto fue definido en preDispatch(), está disponible.
613 public function populateAction()
615 $this->view->foo = 'bar';
618 // No hace rendering, ya que salta a otra acción; la nueva acción
619 // realizará cualquier rendering
620 public function bazAction()
622 $this->_forward('index');
625 // No hace rendering, ya que redirecciona a otra ubicación
626 public function batAction()
628 $this->_redirect('/index');
635 <title>Convenciones de Nombres: Delimitadores de Palabras en
636 Controladores y Nombres de Acción</title>
637 <para> Si su controlador o nombre de acción está compuesto por
638 varias palabras, el despachador exige que estos sean separados
639 de la <acronym>URL</acronym> por un path específico y caracteres
640 delimitadores de palabras. El <emphasis>ViewRenderer</emphasis>
641 reemplaza cualquier delimitador de paths encontrado en el nombre
642 del controlador con el delimitador actual ('/'), y cualquier
643 delimitador de palabra encontrado con un guión ('-') cuando crea
644 paths. Así, una llamada a la acción
645 <filename>/foo.bar/baz.bat</filename> despachará a
646 <methodname>FooBarController::bazBatAction()</methodname> en
647 <filename>FooBarController.php</filename> , el cual
648 renderizaría a <filename>foo-bar/baz-bat.phtml</filename> ; una
649 llamada a la acción <filename>/bar_baz/baz-bat</filename>
651 <methodname>Bar_BazController::bazBatAction()</methodname>
652 en <filename>Bar/BazController.php</filename> (note la
653 separación del path) y renderiza
654 <filename>bar/baz/baz-bat.phtml</filename> . </para>
656 <para> Tener en cuenta que el en el segundo ejemplo, el módulo es
657 todavía el módulo por defecto, pero que, debido a la existencia
658 de un separador de paths, el controlador recibe el nombre
659 <classname>Bar_BazController</classname> , en
660 <filename>Bar/BazController.php</filename> . El
661 <emphasis>ViewRenderer</emphasis> imita la jerarquía del
662 directorio del controlador. </para>
666 id="zend.controller.actionhelper.viewrenderer.basicusage.example-2">
667 <title>Deshabilitando Autorender</title>
669 <para> Para algunas acciones o controladores, usted puede querer
670 apagar el autorendering -- por ejemplo, si quiere emitir un tipo
671 diferente de salida ( <acronym>XML</acronym> ,
672 <acronym>JSON</acronym> , etc), o si simplemente no desea
673 emitir nada. Tiene dos opciones: apagar todos los casos de
674 autorendering ( <methodname>setNeverRender()</methodname> ), o
675 simplemente desactivarlo para la acción actual (
676 <methodname>setNoRender()</methodname> ). </para>
678 <programlisting language="php"><![CDATA[
679 // Baz clase del controlador, bar módulo:
680 class Bar_BazController extends Zend_Controller_Action
682 public function fooAction()
684 // No auto renderize esta acción
685 $this->_helper->viewRenderer->setNoRender();
689 // Bat clase del controlador, bar módulo:
690 class Bar_BatController extends Zend_Controller_Action
692 public function preDispatch()
694 // Nunca auto renderizar las acciones de este controlador
695 $this->_helper->viewRenderer->setNoRender();
702 <para> En muchos casos, no tiene sentido desactivar el autorendering
703 globalmente (ala <methodname>setNeverRender()</methodname> ), y
704 la única cosa que puede ganar de
705 <emphasis>ViewRenderer</emphasis> es el autosetup del objeto
710 id="zend.controller.actionhelper.viewrenderer.basicusage.example-3">
711 <title>Eligiendo Un Script de Vista Diferente</title>
713 <para> Algunas situaciones requieren renderizar un script diferente
714 al llamado después de la acción. Por ejemplo, si tiene un
715 controlador que tiene tanto las acciones de agregar y de editar,
716 ambos pueden mostrar la misma vista 'form', aunque con
717 diferentes valores establecidos. Puede cambiar fácilmente el
718 nombre del script usado tanto con
719 <methodname>setScriptAction()</methodname> ,
720 <methodname>setRender()</methodname> , o llamando al
721 ayudante como un método, que invocará a
722 <methodname>setRender()</methodname> . </para>
724 <programlisting language="php"><![CDATA[
725 // Bar clase controlador, foo módulo:
726 class Foo_BarController extends Zend_Controller_Action
728 public function addAction()
730 // Render 'bar/form.phtml' en lugar de 'bar/add.phtml'
731 $this->_helper->viewRenderer('form');
734 public function editAction()
736 // Render 'bar/form.phtml' en lugar de 'bar/edit.phtml'
737 $this->_helper->viewRenderer->setScriptAction('form');
740 public function processAction()
742 // hacer alguna validación...
744 // Render 'bar/form.phtml' en lugar de 'bar/process.phtml'
745 $this->_helper->viewRenderer->setRender('form');
749 // de otra manera, continuar procesando...
757 id="zend.controller.actionhelper.viewrenderer.basicusage.example-4">
758 <title>Modificando la Vista Registrada</title>
760 <para> ¿Y si se necesita modificar el objeto vista -- por ejemplo,
761 cambiar el ayudante de paths, o la codificación?. Puede hacerlo
762 ya sea por modificar el objeto vista establecido en su
763 controlador, o arrebatándole el objeto vista a
764 <emphasis>ViewRenderer</emphasis> ; ambas son referencias al
765 mismo objeto. </para>
767 <programlisting language="php"><![CDATA[
768 // Bar clase controlador, foo módulo:
769 class Foo_BarController extends Zend_Controller_Action
771 public function preDispatch()
773 // cambiar la codificavión de la vista
774 $this->view->setEncoding('UTF-8');
777 public function bazAction()
779 // Obtener el objeto vista y establecer
780 // el callback de escape a 'htmlspecialchars'
781 $view = $this->_helper->viewRenderer->view;
782 $view->setEscape('htmlspecialchars');
789 <sect4 id="zend.controller.actionhelper.viewrenderer.advancedusage">
790 <title>Ejemplos de Uso Avanzado</title>
793 id="zend.controller.actionhelper.viewrenderer.advancedusage.example-1">
794 <title>Cambiando las Especificaciones del Path</title>
796 <para> En algunas circunstancias, puede decidir que las
797 especificaciones del path por defecto no se adaptan a su sitio.
798 Por ejemplo, usted puede querer tener un árbol único de
799 plantillas al que puede dar acceso a sus diseñadores (esto es
800 muy típico cuando se utiliza <ulink url="http://smarty.php.net/"
801 >Smarty</ulink> , por ejemplo). En ese caso, puede querer
802 embeber los datos de la especificación del path base de la
803 vista, y crear una especificación alternativa para el script de
804 vista del path ellos mismos. </para>
806 <para> Para los fines de este ejemplo, supongamos que el path base
807 de las vistas debería ser '
808 <filename>/opt/vendor/templates</filename> ', y que desea
809 para que los scripts de vista sean referenciados por '
810 <filename>:moduleDir/:controller/:action.:suffix</filename>
811 '; si el flag <emphasis>noController</emphasis> ha sido
812 establecido, quiere renderizar fuera del nivel superior en lugar
813 de en un subdirectorio ( <filename>':action.:suffix</filename>
814 '). Por último, que quiere utilizar 'tpl' como el sufijo del
815 nombre de archivo del script de vista. </para>
817 <programlisting language="php"><![CDATA[
822 // Implementación de una vista diferente
823 $view = new ZF_Smarty();
825 $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
826 $viewRenderer->setViewBasePathSpec('/opt/vendor/templates')
827 ->setViewScriptPathSpec(':module/:controller/:action.:suffix')
828 ->setViewScriptPathNoControllerSpec(':action.:suffix')
829 ->setViewSuffix('tpl');
830 Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
835 id="zend.controller.actionhelper.viewrenderer.advancedusage.example-2">
836 <title>Rendering Múltiples Scripts de Vista desde una Sola
839 <para> A veces, puede que necesite renderizar múltiples scripts de
840 vista desde una sola acción. Esto es muy sencillo -- simplemente
841 hacer múltiples llamadas a <methodname>render()</methodname> : </para>
843 <programlisting language="php"><![CDATA[
844 class SearchController extends Zend_Controller_Action
846 public function resultsAction()
848 // Suponga que $this->model es el modelo actual
849 $this->view->results =
850 $this->model->find($this->_getParam('query', '');
852 // render() por defecto lo delega al ViewRenderer
853 // Render primero al from de búsqueda y luego los resultados
854 $this->render('form');
855 $this->render('results');
858 public function formAction()
860 // No hacer nada; ViewRenderer hace autorender del script de vista