| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- Reviewed: no -->
- <sect3 id="zend.controller.actionhelpers.viewrenderer">
- <title>ViewRenderer</title>
- <sect4 id="zend.controller.actionhelper.viewrenderer.introduction">
- <title>Introducción</title>
- <para>
- El ayudante <code>ViewRenderer</code> está diseñado para satisfacer
- los siguientes objetivos:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- Eliminar la necesidad de instanciar objetos de vista dentro
- de los controladores; los objetos de vista quedarán
- registrados automáticamente con el contralor.
- </para>
- </listitem>
- <listitem>
- <para>
- Establece automáticamente el script de vista, el ayudante,
- y los paths de los filtros basados en el módulo actual.
- Asocia automáticamente el nombre del módulo actual como
- un prefijo de clase para las clases ayudante y filtro.
- </para>
- </listitem>
- <listitem>
- <para>
- Crea un objeto de vista, disponible globalmente para todos
- los controladores y acciones despachados.
- </para>
- </listitem>
- <listitem>
- <para>
- Permite al desarrollador establecer por defecto las
- opciones de renderizado para todos los controladores.
- </para>
- </listitem>
- <listitem>
- <para>
- Agrega la capacidad para renderizar automáticamente los
- scripts de vista sin ninguna intervención.
- </para>
- </listitem>
- <listitem>
- <para>
- Permite al desarrollador crear sus propias especificaciones
- para el path base de vistas y para el path de los scripts
- de vista.
- </para>
- </listitem>
- </itemizedlist>
- <note>
- <para>
- Si realiza un <code>_forward()</code>, redirecciona, o
- <code>render</code> manualmente, el autorendering no se llevará
- a cabo, como está realizando cualquiera de estas acciones le
- está diciendo al <code>ViewRenderer</code> que usted está
- determinando su propia salida.
- </para>
- </note>
- <note>
- <para>
- El <code>ViewRenderer</code> está habilitado por defecto.
- Puede desactivarlo vía parámetro del front controller
- <code>noViewRenderer</code>
- (<code>$front->setParam('noViewRenderer', true)</code>) o
- eliminando al ayudante del stack de ayudantes
- (<classname>Zend_Controller_Action_HelperBroker::removeHelper('viewRenderer')</classname>).
- </para>
- <para>
- Si desea modificar los settings del <code>ViewRenderer</code>
- antes de despachar el front controller, puede hacerlo en una
- de las dos maneras:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- Instanciar y registrar su propio objeto
- <code>ViewRenderer</code> y pasarlo al ayudante:
- </para>
- <programlisting role="php"><![CDATA[
- $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer();
- $viewRenderer->setView($view)
- ->setViewSuffix('php');
- Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
- ]]></programlisting>
- </listitem>
- <listitem>
- <para>
- Inicializar y/o recuperar un objeto
- <code>ViewRenderer</code> por demanda via el ayudante:
- </para>
- <programlisting role="php"><![CDATA[
- $viewRenderer =
- Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
- $viewRenderer->setView($view)
- ->setViewSuffix('php');
- ]]></programlisting>
- </listitem>
- </itemizedlist>
- </note>
- </sect4>
- <sect4 id="zend.controller.actionhelper.viewrenderer.api">
- <title>API</title>
- <para>
- En su uso más básico, simplemente instancie a
- <code>ViewRenderer</code> y páselo al ayudante de acciones.
- La forma más fácil para instanciar y registrar de una sola vez es
- utilizando el método del ayudante <code>getStaticHelper()</code>:
- </para>
- <programlisting role="php"><![CDATA[
- Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
- ]]></programlisting>
- <para>
- La primera vez que se instancia un controlador de acción, se
- disparará <code>ViewRenderer</code> para instanciar al objeto
- vista. Cada vez que el controlador es instanciado, se llama al
- método <code>init()</code> de <code>ViewRenderer</code>, que lo
- llevará a establecer la propiedad del controlador de acción, y
- llama a <code>addScriptPath()</code> con un path relativo al
- módulo actual; este será llamado con un prefijo de clase nombrada
- después del módulo actual, haciendo efectivamente el namespacing de
- todas las clases de ayudantes y filtros que define para el módulo.
- </para>
- <para>
- Cad vez que llama a <code>postDispatch()</code>, este llamará a
- <code>render()</code> para la acción actual.
- </para>
- <para>
- Como ejemplo, considere la siguiente clase:
- </para>
- <programlisting role="php"><![CDATA[
- // Una clase controlador, módulo foo:
- class Foo_BarController extends Zend_Controller_Action
- {
- // Render bar/index.phtml por defecto; no se requiere acción
- public function indexAction()
- {
- }
- // Render bar/populate.phtml con la variable 'foo' establecida a 'bar'.
- // Dado que el objeto vista está definido en preDispatch(),
- // ya está disponible.
- public function populateAction()
- {
- $this->view->foo = 'bar';
- }
- }
- ...
- // en uno de sus scripts de vista:
- $this->foo(); // llama a Foo_View_Helper_Foo::foo()
- ]]></programlisting>
- <para>
- El <code>ViewRenderer</code> también define una serie de accededores
- para permitir establecer y recuperar opciones de vista:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <code>setView($view)</code> le permite establecer el objeto
- vista para <code>ViewRenderer</code>. Se vuelve como una
- propiedad de clase pública <code>$view</code>.
- </para>
- </listitem>
- <listitem>
- <para>
- <code>setNeverRender($flag = true)</code> puede ser
- utilizado para activar o desactivar globalmente el
- autorendering, es decir, para todos los controladores.
- Si es verdadero, <code>postDispatch()</code> no llamará
- automáticamente a <code>render()</code> en el controlador
- actual. <code>getNeverRender()</code> recupera el valor
- actual.
- </para>
- </listitem>
- <listitem>
- <para>
- <code>setNoRender($flag = true)</code> puede ser utilizado
- para activar o desactivar el autorendering.
- Si es verdadero, <code>postDispatch()</code> no llamará
- automáticamente a <code>render()</code> en el controlador
- actual. Este ajuste se reseteará cada vez que se llame a
- <code>preDispatch()</code> (es decir, usted necesita
- establecer este flag para cada controlador para el cual
- no quiera que el autorenderering se ejecute).
- <code>getNoRender()</code> recupera el valor actual.
- </para>
- </listitem>
- <listitem>
- <para>
- <code>setNoController($flag = true)</code> pude ser usado
- para decirle a <code>render()</code> que no busque el
- script de acción en un subdirectorio nombrado después de
- que el controlador (que es el comportamiento por defecto)
- <code>getNoController()</code> recupere el valor actual.
- </para>
- </listitem>
- <listitem>
- <para>
- <code>setNeverController($flag = true)</code> es análogo
- a <code>setNoController()</code>, pero trabaja a un nivel
- global -- es decir, que no se reseteará por cada acción
- ejecutada. <code>getNeverController()</code> recupera el
- valor actual.
- </para>
- </listitem>
- <listitem>
- <para>
- <code>setScriptAction($name)</code> puede ser utilizado para
- especificar el script de acción a renderizar.
- <code>$name</code> debe ser el nombre del script menos el
- sufijo del archivo (y sin el subdirectorio del controlador,
- a menos que <code>noController</code> se haya activado).
- Si no se ha especificado, busca un script de vista nombrado
- después de la acción en el objeto solicitud.
- <code>getScriptAction()</code> recupera el valor actual.
- </para>
- </listitem>
- <listitem>
- <para>
- <code>setResponseSegment($name)</code> puede ser utilizado
- para especificar qué segmento del objeto respuesta nombrado
- renderizar. Si no se especifica, se hace en el segmento por
- defecto. <code>getResponseSegment()</code> recupera el
- valor actual.
- </para>
- </listitem>
- <listitem>
- <para>
- <code>initView($path, $prefix, $options)</code> puede ser
- llamado para especificar el path base de las vistas,
- prefijos de clase para scripts de ayudantes y filtros, y
- las opciones de <code>ViewRenderer</code>.
- Puede pasar cualquiera de los siguientes flags:
- <code>neverRender</code>, <code>noRender</code>,
- <code>noController</code>, <code>scriptAction</code>, y
- <code>responseSegment</code>.
- </para>
- </listitem>
- <listitem>
- <para>
- <code>setRender($action = null, $name = null, $noController
- = false)</code> le permite establecer cualquier
- <code>scriptAction</code>, <code>responseSegment</code>, y
- <code>noController</code> en un pase. <code>direct()</code>
- es un alias a este método, permitiéndole llamar a este
- método fácilmente dede su controlador:
- </para>
- <programlisting role="php"><![CDATA[
- // Render 'foo' en lugar del script de acción actual
- $this->_helper->viewRenderer('foo');
- // render form.phtml al segmento de respuesta de 'html', sin usar un
- // subdirectorio de scripts de controladores de acción:
- $this->_helper->viewRenderer('form', 'html', true);
- ]]></programlisting>
- <note><para>
- <code>setRender()</code> y <code>direct()</code>
- realmente no renderiza el script de vista, sino que
- establece indicaciones que <code>postDispatch()</code>
- y <code>render()</code> utlizarán para renderizar la
- vista.
- </para></note>
- </listitem>
- </itemizedlist>
- <para>
- El constructor le permite opcionalmente pasar el objeto vista y las
- opciones de <code>ViewRenderer</code>; acepta los mismos flags que
- <code>initView()</code>:
- </para>
- <programlisting role="php"><![CDATA[
- $view = new Zend_View(array('encoding' => 'UTF-8'));
- $options = array('noController' => true, 'neverRender' => true);
- $viewRenderer =
- new Zend_Controller_Action_Helper_ViewRenderer($view, $options);
- ]]></programlisting>
- <para>
- Hay varios métodos adicionales para personalizar especificaciones
- del path, usados para determinar el path base del script de vista
- para añadir al objeto vista, y el path del script de vista a usar
- cuando esté autodeterminando el script de vista a renderizar.
- Cada uno de estos métodos toma uno o más de los siguientes
- localizadores:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <code>:moduleDir</code> hace referencia a la actual
- directorio base del módulo(por convención, el directorio
- padre del directorio del módulo controlador).
- </para>
- </listitem>
- <listitem>
- <para>
- <code>:module</code> hace referencia al nombre del módulo
- actual.
- </para>
- </listitem>
- <listitem>
- <para>
- <code>:controller</code> hace referencia al nombre del
- controlador actual.
- </para>
- </listitem>
- <listitem>
- <para>
- <code>:action</code> hace referencia al nombre de la
- acción actual.
- </para>
- </listitem>
- <listitem>
- <para>
- <code>:suffix</code> hace referencia al sufijo del script
- de vista (que puede ser definido via
- <code>setViewSuffix()</code>).
- </para>
- </listitem>
- </itemizedlist>
- <para>
- Los métodos para controlar las especificaciones del path son:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <code>setViewBasePathSpec($spec)</code> le permite cambiar
- la especificación del path utilizada para determinar el
- path base para añadir al objeto vista.
- La especificación por defecto es <code>:moduleDir/views</code>.
- Puede recuperar la especificación actual en cualquier
- momento usando <code>getViewBasePathSpec()</code>.
- </para>
- </listitem>
- <listitem>
- <para>
- <code>setViewScriptPathSpec($spec)</code> le permite
- cambiar el path de la especificación utilizada para
- determinar el path a un script de vista individual
- (menos el path de la base del script de vista).
- La especificación por defecto es
- <code>:controller/:action.:suffix</code>.
- Puede recuperar la especificación actual en cualquier
- momento usando
- <code>getViewScriptPathSpec()</code>.
- </para>
- </listitem>
- <listitem>
- <para>
- <code>setViewScriptPathNoControllerSpec($spec)</code>
- le permite cambiar el path de la especificación utilizado
- para determinar el path a un script de vista individual
- cuando <code>noController</code> está activado
- (menos el path base del script de vista). La especificación
- por defecto es <code>:action.:suffix</code>. Puede
- recuperar la especificación actual en cualquier momento
- usando <code>getViewScriptPathNoControllerSpec()</code>.
- </para>
- </listitem>
- </itemizedlist>
- <para>
- Para un control más refinado sobre el path de especificaciones,
- puede usar
- <link linkend="zend.filter.inflector">Zend_Filter_Inflector</link>.
- Bajo el capó, <code>ViewRenderer</code> ya usa un inflector para
- realizar mapeos del path. Para interactuar con el inflector
- -- ya sea para establecerlo para uso propio, o para modificar el
- inflector por defecto, se pueden utilizar los siguientes
- métodos:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <code>getInflector()</code> recupera el inflector.
- Si no existe todavía en <code>ViewRenderer</code>, se crea
- uno utilizando las reglas predeterminadas.
- </para>
- <para>
- Por defecto, utiliza reglas de referencias estáticas para el
- sufijo y directorio de módulos, así como una meta estática;
- esto permite que diversas propiedades de
- <code>ViewRenderer</code> tengan la capacidad de
- modificar dinámicamente al inflector.
- </para>
- </listitem>
- <listitem><para>
- <code>setInflector($inflector, $reference)</code> permite
- establecer un inflector personalizado para usar con
- <code>ViewRenderer</code>. Si <code>$reference</code> es
- verdadero, establecerá el sufijo y directorio de módulos
- como referencias estáticas a las propiedades de
- <code>ViewRenderer</code>, así como al objetivo.
- </para></listitem>
- </itemizedlist>
- <note>
- <title>Convenciones por Defecto para Lookup</title>
- <para>
- El <code>ViewRenderer</code> hace algún tipo de normalización
- del path para facilitar la búsqueda de los scripts de vista.
- Las reglas predeterminadas son los siguientes:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <code>:module</code>: MixedCase y camelCasedWords
- están separados por guiones, y el string completo se
- convierte a minúsculas.
- Por ejemplo: "FooBarBaz" pasa a ser "foo-bar-baz".
- </para>
- <para>
- Internamente, el inflector utiliza los filtros
- <classname>Zend_Filter_Word_CamelCaseToDash</classname>
- y <classname>Zend_Filter_StringToLower</classname>.
- </para>
- </listitem>
- <listitem>
- <para>
- <code>:controller</code>: MixedCase y camelCasedWords
- están separados por guiones; los subrayados se
- convierten en separadores de directorio , y el string
- emitido a minúsculas.
- Ejemplos: "FooBar" pasa a ser "foo-bar";
- "FooBar_Admin" pasa a ser "foo-bar/admin".
- </para>
- <para>
- Internamente, el inflector utiliza los filtros
- <classname>Zend_Filter_Word_CamelCaseToDash</classname>,
- <classname>Zend_Filter_Word_UnderscoreToSeparator</classname>,
- y <classname>Zend_Filter_StringToLower</classname>.
- </para>
- </listitem>
- <listitem>
- <para>
- <code>:action</code>: MixedCase y camelCasedWords
- están separados por guiones; los caracteres
- no alfanuméricos son traducidos a guiones,
- y el string emitido a minúsculas.
- Ejemplos: "fooBar" pasa a ser "foo-bar";
- "foo-barBaz" pasa a ser "foo-bar-baz".
- </para>
- <para>
- Internamente, el inflector utiliza los filtros
- <classname>Zend_Filter_Word_CamelCaseToDash</classname>,
- <classname>Zend_Filter_PregReplace</classname>, y
- <classname>Zend_Filter_StringToLower</classname>.
- </para>
- </listitem>
- </itemizedlist>
- </note>
- <para>
- Los últimos temas en la API de <code>ViewRenderer</code> son los
- métodos para determinar realmente los paths de los scripts de vista
- y el rendering de las vistas.
- Estos incluyen:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <code>renderScript($script, $name)</code> permite renderizar
- un script con una ruta que especifique, opcionalmente a
- un segmento nombrado del path. Cuando se utiliza este
- método, <code>ViewRenderer</code> no autodetermina el
- nombre del script, en cambio pasa directamente a
- <code>$script</code> el argumento directamente al método
- del objeto vista <code>render()</code>.
- </para>
- <note><para>
- Una vez que la vista ha sido renderizada al objeto respuesta,
- se establece <code>noRender</code> para evitar
- accidentalmente renderizar el mismo script de vista varias
- veces.
- </para></note>
- <note>
- <para>
- Por defecto,
- <classname>Zend_Controller_Action::renderScript()</classname>
- le delega a <code>ViewRenderer</code> el método
- <code>renderScript()</code>.
- </para>
- </note>
- </listitem>
- <listitem>
- <para>
- <code>getViewScript($action, $vars)</code> crea el path a
- un script de vista basado en la acción pasada y/o cualquier
- variables pasadas en <code>$vars</code>.
- Las claves para este array pueden incluir cualquiera de las
- claves de especificación de paths ('moduleDir',
- 'module', 'controller', 'action', y 'suffix').
- Se utilizarán cualquiera de la variables pasadas;
- de lo contrario, se utilizarán valores basados en la
- petición actual.
- </para>
- <para>
- <code>getViewScript()</code> utilizará tanto a
- <code>viewScriptPathSpec</code> o
- <code>viewScriptPathNoControllerSpec</code> sobre la base
- establecida del flag <code>noController</code>.
- </para>
- <para>
- Los delimitadores de palabras encontrados en un módulo,
- controlador o nombres de acción serán reemplazados por
- guiones ('-'). Así pues, si tiene el nombre de controlador
- 'foo.bar' y la acción 'baz:bat', utilizando la
- especificación por defecto del path se traducirá en un
- path al script de vista 'foo-bar/baz-bat.phtml'.
- </para>
- <note>
- <para>
- Por defecto,
- <classname>Zend_Controller_Action::getViewScript()</classname>
- delega el método <code>getViewScript()</code> de
- <code>ViewRenderer</code>.
- </para>
- </note>
- </listitem>
- <listitem>
- <para>
- <code>render($action, $name, $noController)</code>
- comprueba primero para ver si bien <code>$name</code> o
- <code>$noController</code> se han pasado, y si es así,
- establece los flags apropiados (responseSegment y
- noController, respectivamente) en ViewRenderer.
- A continuación, pasa el argumento <code>$action</code>,
- si hay alguno, a <code>getViewScript()</code>.
- Por último, pasa el path calculado del script de vista a
- <code>renderScript()</code>.
- </para>
- <note>
- <para>
- Hay que ser conscientes de los efectos secundarios al
- usar render(): los valores que usted pasa para el nombre
- del segmento respuesta y para el flag noController
- persistirán en el objeto. Además, noRender será
- establecido después de completar la renderización.
- </para>
- </note>
- <note>
- <para>
- Por defecto,
- <classname>Zend_Controller_Action::render()</classname>
- delega a <code>ViewRenderer</code> el método
- <code>render()</code>.
- </para>
- </note>
- </listitem>
- <listitem>
- <para>
- <code>renderBySpec($action, $vars, $name)</code>
- permite pasar variables de especificación del path a fin de
- determinar el path para la creación del script de vista.
- Este pasa <code>$action</code> y <code>$vars</code> a
- <code>getScriptPath()</code>, y luego pasa el path del
- script resultante y <code>$name</code> a
- <code>renderScript()</code>.
- </para>
- </listitem>
- </itemizedlist>
- </sect4>
- <sect4 id="zend.controller.actionhelper.viewrenderer.basicusage">
- <title>Ejemplos Uso Básico</title>
- <example id="zend.controller.actionhelper.viewrenderer.basicusage.example-1">
- <title>Uso Básico</title>
- <para>
- En lo más básico, usted simplemente inicializa y registra el
- ayudante <code>ViewRenderer</code> con el ayudante broker
- en su bootstrap, y luego establecer las variables en sus
- métodos de acción.
- </para>
- <programlisting role="php"><![CDATA[
- // En su bootstrap:
- Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
- ...
- // 'foo' módulo, 'bar' controlador:
- class Foo_BarController extends Zend_Controller_Action
- {
- // Render bar/index.phtml por defecto; no se requieren acciones
- public function indexAction()
- {
- }
- // Render bar/populate.phtml la variable 'foo' establecida a 'bar'.
- // Dado que el objeto fue definido en preDispatch(), está disponible.
- public function populateAction()
- {
- $this->view->foo = 'bar';
- }
- // No hace rendering, ya que salta a otra acción; la nueva acción
- // realizará cualquier rendering
- public function bazAction()
- {
- $this->_forward('index');
- }
- // No hace rendering, ya que redirecciona a otra ubicación
- public function batAction()
- {
- $this->_redirect('/index');
- }
- }
- ]]></programlisting>
- </example>
- <note>
- <title>Convenciones de Nombres: Delimitadores de Palabras en Controladores y Nombres de Acción</title>
- <para>
- Si su controlador o nombre de acción está compuesto por varias
- palabras, el despachador exige que estos sean separados de la URL
- por un path específico y caracteres delimitadores de palabras.
- El <code>ViewRenderer</code> reemplaza cualquier delimitador
- de paths encontrado en el nombre del controlador con el
- delimitador actual ('/'), y cualquier delimitador de palabra
- encontrado con un guión ('-') cuando crea paths.
- Así, una llamada a la acción
- <code>/foo.bar/baz.bat</code> despachará a
- <code>FooBarController::bazBatAction()</code> en
- FooBarController.php, el cual renderizaría a
- <code>foo-bar/baz-bat.phtml</code>; una llamada a la acción
- <code>/bar_baz/baz-bat</code> despachará a
- <code>Bar_BazController::bazBatAction()</code> en
- <code>Bar/BazController.php</code> (note la separación del path)
- y renderiza <code>bar/baz/baz-bat.phtml</code>.
- </para>
- <para>
- Tener en cuenta que el en el segundo ejemplo, el módulo es
- todavía el módulo por defecto, pero que, debido a la
- existencia de un separador de paths, el controlador recibe el
- nombre <code>Bar_BazController</code>, en
- <code>Bar/BazController.php</code>.
- El ViewRenderer imita la jerarquía del directorio del
- controlador.
- </para>
- </note>
- <example id="zend.controller.actionhelper.viewrenderer.basicusage.example-2">
- <title>Deshabilitando Autorender</title>
- <para>
- Para algunas acciones o controladores, usted puede querer apagar
- el autorendering -- por ejemplo, si quiere emitir un tipo
- diferente de salida (XML, JSON, etc), o si simplemente no desea
- emitir nada.
- Tiene dos opciones: apagar todos los casos de autorendering
- (<code>setNeverRender()</code>), o simplemente desactivarlo
- para la acción actual (<code>setNoRender()</code>).
- </para>
- <programlisting role="php"><![CDATA[
- // Baz clase del controlador, bar módulo:
- class Bar_BazController extends Zend_Controller_Action
- {
- public function fooAction()
- {
- // No auto renderize esta acción
- $this->_helper->viewRenderer->setNoRender();
- }
- }
- // Bat clase del controlador, bar módulo:
- class Bar_BatController extends Zend_Controller_Action
- {
- public function preDispatch()
- {
- // Nunca auto renderizar las acciones de este controlador
- $this->_helper->viewRenderer->setNoRender();
- }
- }
- ]]></programlisting>
- </example>
- <note>
- <para>
- En muchos casos, no tiene sentido desactivar el autorendering
- globalmente (ala <code>setNeverRender()</code>), y la única
- cosa que puede ganar de <code>ViewRenderer</code> es el
- autosetup del objeto de vista.
- </para>
- </note>
- <example id="zend.controller.actionhelper.viewrenderer.basicusage.example-3">
- <title>Eligiendo Un Script de Vista Diferente</title>
- <para>
- Algunas situaciones requieren renderizar un script diferente
- al llamado después de la acción. Por ejemplo, si tiene un
- controlador que tiene tanto las acciones de agregar y de editar,
- ambos pueden mostrar la misma vista 'form', aunque con diferentes
- valores establecidos. Puede cambiar fácilmente el nombre
- del script usado tanto con
- <code>setScriptAction()</code>, <code>setRender()</code>, o
- llamando al ayudante como un método, que invocará a
- <code>setRender()</code>.
- </para>
- <programlisting role="php"><![CDATA[
- // Bar clase controlador, foo módulo:
- class Foo_BarController extends Zend_Controller_Action
- {
- public function addAction()
- {
- // Render 'bar/form.phtml' en lugar de 'bar/add.phtml'
- $this->_helper->viewRenderer('form');
- }
- public function editAction()
- {
- // Render 'bar/form.phtml' en lugar de 'bar/edit.phtml'
- $this->_helper->viewRenderer->setScriptAction('form');
- }
- public function processAction()
- {
- // hacer alguna validación...
- if (!$valid) {
- // Render 'bar/form.phtml' en lugar de 'bar/process.phtml'
- $this->_helper->viewRenderer->setRender('form');
- return;
- }
- // de otra manera, continuar procesando...
- }
- }
- ]]></programlisting>
- </example>
- <example id="zend.controller.actionhelper.viewrenderer.basicusage.example-4">
- <title>Modificando la Vista Registrada</title>
- <para>
- ¿Y si se necesita modificar el objeto vista --
- por ejemplo, cambiar el ayudante de paths, o la codificación?.
- Puede hacerlo ya sea por modificar el objeto vista establecido
- en su controlador, o arrebatándole el objeto vista a
- <code>ViewRenderer</code>; ambas son referencias al mismo objeto.
- </para>
- <programlisting role="php"><![CDATA[
- // Bar clase controlador, foo módulo:
- class Foo_BarController extends Zend_Controller_Action
- {
- public function preDispatch()
- {
- // cambiar la codificavión de la vista
- $this->view->setEncoding('UTF-8');
- }
- public function bazAction()
- {
- // Obtener el objeto vista y establecer
- // el callback de escape a 'htmlspecialchars'
- $view = $this->_helper->viewRenderer->view;
- $view->setEscape('htmlspecialchars');
- }
- }
- ]]></programlisting>
- </example>
- </sect4>
- <sect4 id="zend.controller.actionhelper.viewrenderer.advancedusage">
- <title>Ejemplos de Uso Avanzado</title>
- <example id="zend.controller.actionhelper.viewrenderer.advancedusage.example-1">
- <title>Cambiando las Especificaciones del Path</title>
- <para>
- En algunas circunstancias, puede decidir que las
- especificaciones del path por defecto no se adaptan a su sitio.
- Por ejemplo, usted puede querer tener un árbol único de
- plantillas al que puede dar acceso a sus diseñadores
- (esto es muy típico cuando se utiliza
- <ulink url="http://smarty.php.net/">Smarty</ulink>, por
- ejemplo). En ese caso, puede querer embeber los datos de la
- especificación del path base de la vista, y crear una
- especificación alternativa para el script de vista del path
- ellos mismos.
- </para>
- <para>
- Para los fines de este ejemplo, supongamos que el path base
- de las vistas debería ser '/opt/vendor/templates', y que desea
- para que los scripts de vista sean referenciados por
- ':moduleDir/:controller/:action.:suffix'; si el flag
- noController ha sido establecido, quiere renderizar
- fuera del nivel superior en lugar de en un subdirectorio
- (':action.:suffix'). Por último, que quiere utilizar 'tpl'
- como el sufijo del nombre de archivo del script de vista.
- </para>
- <programlisting role="php"><![CDATA[
- /**
- * En su bootstrap:
- */
- // Implementación de una vista diferente
- $view = new ZF_Smarty();
- $viewRenderer = new Zend_Controller_Action_Helper_ViewRenderer($view);
- $viewRenderer->setViewBasePathSpec('/opt/vendor/templates')
- ->setViewScriptPathSpec(':module/:controller/:action.:suffix')
- ->setViewScriptPathNoControllerSpec(':action.:suffix')
- ->setViewSuffix('tpl');
- Zend_Controller_Action_HelperBroker::addHelper($viewRenderer);
- ]]></programlisting>
- </example>
- <example id="zend.controller.actionhelper.viewrenderer.advancedusage.example-2">
- <title>Rendering Múltiples Scripts de Vista desde una Sola Acción</title>
- <para>
- A veces, puede que necesite renderizar múltiples scripts de
- vista desde una sola acción. Esto es muy sencillo --
- simplemente hacer múltiples llamadas a <code>render()</code>:
- </para>
- <programlisting role="php"><![CDATA[
- class SearchController extends Zend_Controller_Action
- {
- public function resultsAction()
- {
- // Suponga que $this->model es el modelo actual
- $this->view->results =
- $this->model->find($this->_getParam('query', '');
- // render() por defecto lo delega al ViewRenderer
- // Render primero al from de búsqueda y luego los resultados
- $this->render('form');
- $this->render('results');
- }
- public function formAction()
- {
- // No hacer nada; ViewRenderer hace autorender del script de vista
- }
- }
- ]]></programlisting>
- </example>
- </sect4>
- </sect3>
- <!--
- vim:se ts=4 sw=4 et:
- -->
|