| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 24249 -->
- <!-- 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 <emphasis>ViewRenderer</emphasis> 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 <methodname>_forward()</methodname> ,
- redirecciona, o <methodname>render()</methodname> manualmente,
- el autorendering no se llevará a cabo, como está realizando
- cualquiera de estas acciones le está diciendo al
- <emphasis>ViewRenderer</emphasis> que usted está
- determinando su propia salida. </para>
- </note>
- <note>
- <para> El <emphasis>ViewRenderer</emphasis> está habilitado por
- defecto. Puede desactivarlo vía parámetro del front controller
- <emphasis>noViewRenderer</emphasis>
- (<command>$front->setParam('noViewRenderer',true)</command>)
- o eliminando al ayudante del stack de ayudantes ( <methodname>
- Zend_Controller_Action_HelperBroker::removeHelper('viewRenderer')
- </methodname> ). </para>
- <para> Si desea modificar los settings del
- <emphasis>ViewRenderer</emphasis> antes de despachar el
- front controller, puede hacerlo en una de las dos maneras: </para>
- <itemizedlist>
- <listitem>
- <para> Instanciar y registrar su propio objeto
- <emphasis>ViewRenderer</emphasis> y pasarlo al
- ayudante: </para>
- <programlisting language="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
- <emphasis>ViewRenderer</emphasis> por demanda via el
- ayudante: </para>
- <programlisting language="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
- <emphasis>ViewRenderer</emphasis> 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
- <methodname>getStaticHelper()</methodname> : </para>
- <programlisting language="php"><![CDATA[
- Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
- ]]></programlisting>
- <para> La primera vez que se instancia un controlador de acción, se
- disparará <emphasis>ViewRenderer</emphasis> para instanciar al
- objeto vista. Cada vez que el controlador es instanciado, se llama
- al método <methodname>init()</methodname> de
- <emphasis>ViewRenderer</emphasis> , que lo llevará a establecer
- la propiedad del controlador de acción, y llama a
- <methodname>addScriptPath()</methodname> 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 <methodname>postDispatch()</methodname> ,
- este llamará a <methodname>render()</methodname> para la acción
- actual. </para>
- <para>Como ejemplo, considere la siguiente clase:</para>
- <programlisting language="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 <emphasis>ViewRenderer</emphasis> también define una serie de
- accededores para permitir establecer y recuperar opciones de vista: </para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>setView($view)</methodname> le permite
- establecer el objeto vista para
- <emphasis>ViewRenderer</emphasis> . Se vuelve como una
- propiedad de clase pública <varname>$view</varname> .
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setNeverRender($flag = true)</methodname> puede
- ser utilizado para activar o desactivar globalmente el
- autorendering, es decir, para todos los controladores. Si es
- verdadero, <methodname>postDispatch()</methodname> no
- llamará automáticamente a <methodname>render()</methodname>
- en el controlador actual.
- <methodname>getNeverRender()</methodname> recupera el
- valor actual. </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setNoRender($flag = true)</methodname> puede ser
- utilizado para activar o desactivar el autorendering. Si es
- verdadero, <methodname>postDispatch()</methodname> no
- llamará automáticamente a <methodname>render()</methodname>
- en el controlador actual. Este ajuste se reseteará cada vez
- que se llame a <methodname>preDispatch()</methodname> (es
- decir, usted necesita establecer este flag para cada
- controlador para el cual no quiera que el autorenderering se
- ejecute). <methodname>getNoRender()</methodname> recupera el
- valor actual. </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setNoController($flag = true)</methodname> pude
- ser usado para decirle a <methodname>render()</methodname>
- que no busque el script de acción en un subdirectorio
- nombrado después de que el controlador (que es el
- comportamiento por defecto)
- <methodname>getNoController()</methodname> recupere el
- valor actual. </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setNeverController($flag = true)</methodname> es
- análogo a <methodname>setNoController()</methodname> , pero
- trabaja a un nivel global -- es decir, que no se reseteará
- por cada acción ejecutada.
- <methodname>getNeverController()</methodname> recupera
- el valor actual. </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setScriptAction($name)</methodname> puede ser
- utilizado para especificar el script de acción a renderizar.
- <varname>$name</varname> debe ser el nombre del script
- menos el sufijo del archivo (y sin el subdirectorio del
- controlador, a menos que <emphasis>noController</emphasis>
- se haya activado). Si no se ha especificado, busca un script
- de vista nombrado después de la acción en el objeto
- solicitud. <methodname>getScriptAction()</methodname>
- recupera el valor actual. </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setResponseSegment($name)</methodname> puede ser
- utilizado para especificar qué segmento del objeto respuesta
- nombrado renderizar. Si no se especifica, se hace en el
- segmento por defecto.
- <methodname>getResponseSegment()</methodname> recupera
- el valor actual. </para>
- </listitem>
- <listitem>
- <para>
- <methodname>initView($path, $prefix, $options)</methodname>
- puede ser llamado para especificar el path base de las
- vistas, prefijos de clase para scripts de ayudantes y
- filtros, y las opciones de <emphasis>ViewRenderer</emphasis>
- . Puede pasar cualquiera de los siguientes flags:
- <emphasis>neverRender</emphasis> ,
- <emphasis>noRender</emphasis> ,
- <emphasis>noController</emphasis> ,
- <emphasis>scriptAction</emphasis> , y
- <emphasis>responseSegment</emphasis> . </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setRender($action = null, $name = null,
- $noController = false)</methodname> le permite
- establecer cualquier <emphasis>scriptAction</emphasis> ,
- <emphasis>responseSegment</emphasis> , y
- <emphasis>noController</emphasis> en un pase.
- <methodname>direct()</methodname> es un alias a este
- método, permitiéndole llamar a este método fácilmente dede
- su controlador: </para>
- <programlisting language="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>
- <methodname>setRender()</methodname> y
- <methodname>direct()</methodname> realmente no
- renderiza el script de vista, sino que establece
- indicaciones que <methodname>postDispatch()</methodname>
- y <methodname>render()</methodname> utlizarán para
- renderizar la vista. </para>
- </note>
- </listitem>
- </itemizedlist>
- <para> El constructor le permite opcionalmente pasar el objeto vista y
- las opciones de <emphasis>ViewRenderer</emphasis> ; acepta los
- mismos flags que <methodname>initView()</methodname> : </para>
- <programlisting language="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>
- <emphasis>:moduleDir</emphasis> 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>
- <emphasis>:module</emphasis> hace referencia al nombre del
- módulo actual. </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>:controller</emphasis> hace referencia al nombre
- del controlador actual. </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>:action</emphasis> hace referencia al nombre de la
- acción actual. </para>
- </listitem>
- <listitem>
- <para>
- <emphasis>:suffix</emphasis> hace referencia al sufijo del
- script de vista (que puede ser definido via
- <methodname>setViewSuffix()</methodname> ). </para>
- </listitem>
- </itemizedlist>
- <para>Los métodos para controlar las especificaciones del path
- son:</para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>setViewBasePathSpec($spec)</methodname> 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
- <filename>:moduleDir/views</filename> . Puede recuperar
- la especificación actual en cualquier momento usando
- <methodname>getViewBasePathSpec()</methodname> . </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setViewScriptPathSpec($spec)</methodname> 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 <filename>:controller/:action.:suffix</filename>
- . Puede recuperar la especificación actual en cualquier
- momento usando
- <methodname>getViewScriptPathSpec()</methodname> .
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setViewScriptPathNoControllerSpec($spec)</methodname>
- le permite cambiar el path de la especificación utilizado
- para determinar el path a un script de vista individual
- cuando <emphasis>noController</emphasis> está activado
- (menos el path base del script de vista). La especificación
- por defecto es <filename>:action.:suffix</filename> . Puede
- recuperar la especificación actual en cualquier momento
- usando
- <methodname>getViewScriptPathNoControllerSpec()</methodname>
- . </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ó,
- <emphasis>ViewRenderer</emphasis> 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>
- <methodname>getInflector()</methodname> recupera el
- inflector. Si no existe todavía en
- <emphasis>ViewRenderer</emphasis> , 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
- <emphasis>ViewRenderer</emphasis> tengan la capacidad de
- modificar dinámicamente al inflector. </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setInflector($inflector,
- $reference)</methodname> permite establecer un inflector
- personalizado para usar con
- <emphasis>ViewRenderer</emphasis> . Si
- <varname>$reference</varname> es verdadero, establecerá
- el sufijo y directorio de módulos como referencias estáticas
- a las propiedades de <emphasis>ViewRenderer</emphasis> , así
- como al objetivo. </para>
- </listitem>
- </itemizedlist>
- <note>
- <title>Convenciones por Defecto para Lookup</title>
- <para> El <emphasis>ViewRenderer</emphasis> 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>
- <emphasis>:module</emphasis> : 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>
- <emphasis>:controller</emphasis> : MixedCase y
- camelCasedWords están separados por guiones; los
- subrayados se convierten en separadores de directorio ,
- y el string emitido a minúsculas. Ejemplos: "
- <classname>FooBar</classname> " pasa a ser
- "foo-bar"; " <classname>FooBar_Admin</classname> " pasa
- a ser " <filename>foo-bar/admin</filename> ". </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>
- <emphasis>:action</emphasis> : 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 <acronym>API</acronym> de
- <emphasis>ViewRenderer</emphasis> 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>
- <methodname>renderScript($script, $name)</methodname>
- permite renderizar un script con una ruta que especifique,
- opcionalmente a un segmento nombrado del path. Cuando se
- utiliza este método, <emphasis>ViewRenderer</emphasis> no
- autodetermina el nombre del script, en cambio pasa
- directamente a <varname>$script</varname> el argumento
- directamente al método del objeto vista
- <methodname>render()</methodname> . </para>
- <note>
- <para> Una vez que la vista ha sido renderizada al objeto
- respuesta, se establece <emphasis>noRender</emphasis>
- para evitar accidentalmente renderizar el mismo script
- de vista varias veces. </para>
- </note>
- <note>
- <para> Por defecto,
- <methodname>Zend_Controller_Action::renderScript()</methodname>
- le delega a <emphasis>ViewRenderer</emphasis> el método
- <methodname>renderScript()</methodname> . </para>
- </note>
- </listitem>
- <listitem>
- <para>
- <methodname>getViewScript($action, $vars)</methodname> crea
- el path a un script de vista basado en la acción pasada y/o
- cualquier variables pasadas en <varname>$vars</varname> .
- 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>
- <methodname>getViewScript()</methodname> utilizará tanto a
- <emphasis>viewScriptPathSpec</emphasis> o
- <emphasis>viewScriptPathNoControllerSpec</emphasis>
- sobre la base establecida del flag
- <emphasis>noController</emphasis> . </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 '
- <command>foo.bar</command> ' y la acción '
- <command>baz:bat</command> ', utilizando la
- especificación por defecto del path se traducirá en un path
- al script de vista '
- <filename>foo-bar/baz-bat.phtml</filename> '. </para>
- <note>
- <para> Por defecto,
- <methodname>Zend_Controller_Action::getViewScript()</methodname>
- delega el método
- <methodname>getViewScript()</methodname> de
- <emphasis>ViewRenderer</emphasis> . </para>
- </note>
- </listitem>
- <listitem>
- <para>
- <methodname>render($action, $name,
- $noController)</methodname> comprueba primero para ver
- si bien <varname>$name</varname> o
- <varname>$noController</varname> se han pasado, y si es
- así, establece los flags apropiados (responseSegment y
- noController, respectivamente) en
- <emphasis>ViewRenderer</emphasis> . A continuación, pasa
- el argumento <varname>$action</varname> , si hay alguno, a
- <methodname>getViewScript()</methodname> . Por último,
- pasa el path calculado del script de vista a
- <methodname>renderScript()</methodname> . </para>
- <note>
- <para> Hay que ser conscientes de los efectos secundarios al
- usar <methodname>render()</methodname> : 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,
- <methodname>Zend_Controller_Action::render()</methodname>
- delega a <emphasis>ViewRenderer</emphasis> el método
- <methodname>render()</methodname> . </para>
- </note>
- </listitem>
- <listitem>
- <para>
- <methodname>renderBySpec($action, $vars, $name)</methodname>
- permite pasar variables de especificación del path a fin de
- determinar el path para la creación del script de vista.
- Este pasa <varname>$action</varname> y
- <varname>$vars</varname> a
- <methodname>getScriptPath()</methodname> , y luego pasa
- el path del script resultante y <varname>$name</varname> a
- <methodname>renderScript()</methodname> . </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 <emphasis>ViewRenderer</emphasis> con el ayudante
- broker en su bootstrap, y luego establecer las variables en sus
- métodos de acción. </para>
- <programlisting language="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 <acronym>URL</acronym> por un path específico y caracteres
- delimitadores de palabras. El <emphasis>ViewRenderer</emphasis>
- 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
- <filename>/foo.bar/baz.bat</filename> despachará a
- <methodname>FooBarController::bazBatAction()</methodname> en
- <filename>FooBarController.php</filename> , el cual
- renderizaría a <filename>foo-bar/baz-bat.phtml</filename> ; una
- llamada a la acción <filename>/bar_baz/baz-bat</filename>
- despachará a
- <methodname>Bar_BazController::bazBatAction()</methodname>
- en <filename>Bar/BazController.php</filename> (note la
- separación del path) y renderiza
- <filename>bar/baz/baz-bat.phtml</filename> . </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
- <classname>Bar_BazController</classname> , en
- <filename>Bar/BazController.php</filename> . El
- <emphasis>ViewRenderer</emphasis> 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 ( <acronym>XML</acronym> ,
- <acronym>JSON</acronym> , etc), o si simplemente no desea
- emitir nada. Tiene dos opciones: apagar todos los casos de
- autorendering ( <methodname>setNeverRender()</methodname> ), o
- simplemente desactivarlo para la acción actual (
- <methodname>setNoRender()</methodname> ). </para>
- <programlisting language="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 <methodname>setNeverRender()</methodname> ), y
- la única cosa que puede ganar de
- <emphasis>ViewRenderer</emphasis> 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
- <methodname>setScriptAction()</methodname> ,
- <methodname>setRender()</methodname> , o llamando al
- ayudante como un método, que invocará a
- <methodname>setRender()</methodname> . </para>
- <programlisting language="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
- <emphasis>ViewRenderer</emphasis> ; ambas son referencias al
- mismo objeto. </para>
- <programlisting language="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 '
- <filename>/opt/vendor/templates</filename> ', y que desea
- para que los scripts de vista sean referenciados por '
- <filename>:moduleDir/:controller/:action.:suffix</filename>
- '; si el flag <emphasis>noController</emphasis> ha sido
- establecido, quiere renderizar fuera del nivel superior en lugar
- de en un subdirectorio ( <filename>':action.:suffix</filename>
- '). Por último, que quiere utilizar 'tpl' como el sufijo del
- nombre de archivo del script de vista. </para>
- <programlisting language="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 <methodname>render()</methodname> : </para>
- <programlisting language="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>
|