| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798 |
- <?xml version="1.0" encoding="UTF-8"?>
- <!-- EN-Revision: 15103 -->
- <!-- Reviewed: no -->
- <sect3 id="zend.controller.actionhelpers.contextswitch">
- <title>ContextSwitch con AjaxContext</title>
- <para>
- El ayudante de acción <methodname>ContextSwitch</methodname> está destinado a
- facilitar el regreso de respuestas de diferentes formatos de solicitud.
- El ayudante <methodname>AjaxContext</methodname> es una versión especializada de
- <methodname>ContextSwitch</methodname> que facilita el regreso de respuestas
- a XmlHttpRequests.
- </para>
- <para>
- Para habilitar alguno, usted debe proporcionar indicios en su
- controlador de qué acciones pueden responder a que contextos.
- Si una solicitud entrante indica un contexto válido para la acción
- determinada, entonces el ayudante:
- </para>
- <itemizedlist>
- <listitem><para>
- Deshabilita los esquemas, si están habilitados.
- </para></listitem>
- <listitem><para>
- Establecer un sufijo de vista alternativo, requiriendo de
- manera efectiva un script de vista separado para el contexto.
- </para></listitem>
- <listitem><para>
- Envía las cabeceras de respuesta apropiadas para el contexto
- deseado.
- </para></listitem>
- <listitem><para>
- Opcionalmente, llama a llamadas de retorno especifícas para
- configurar el contexto y/o realizar post-procesamiento.
- </para></listitem>
- </itemizedlist>
- <para>
- Como ejemplo, tomemos el siguiente controlador:
- </para>
- <programlisting language="php"><![CDATA[
- class NewsController extends Zend_Controller_Action
- {
- /**
- * Página final; enviar a listAction()
- */
- public function indexAction()
- {
- $this->_forward('list');
- }
- /**
- * Lista nuevos items
- */
- public function listAction()
- {
- }
- /**
- * Vista del nuevo item
- */
- public function viewAction()
- {
- }
- }
- ]]></programlisting>
- <para>
- Digamos que queremos que <methodname>listAction()</methodname> también esté
- disponible en un formato XML. En lugar de crear una acción diferente,
- podemos indicarle que puede devolver una respuesta XML:
- </para>
- <programlisting language="php"><![CDATA[
- class NewsController extends Zend_Controller_Action
- {
- public function init()
- {
- $contextSwitch = $this->_helper->getHelper('contextSwitch');
- $contextSwitch->addActionContext('list', 'xml')
- ->initContext();
- }
- // ...
- }
- ]]></programlisting>
- <para>
- Esto es lo que hará:
- </para>
- <itemizedlist>
- <listitem><para>
- Establecer la cabecera de respuesta 'Content-Type' a 'text/xml'.
- </para></listitem>
- <listitem><para>
- Cambiar el sufijo de vista de 'xml.phtml' (o, si usa un sufifo
- de vista alternativo, 'xml.[su sufijo]').
- </para></listitem>
- </itemizedlist>
- <para>
- Ahora, necesitará crear un nuevo script de vista, 'news/list.xml.phtml',
- que creará y mostrará a XML.
- </para>
- <para>
- Para determinar si una solicitud debe iniciar un cambio de contexto,
- el ayudante comprueba si hay un token en el objeto solicitud.
- Por defecto, busca el parámetro 'format', aunque esto puede ser
- configurado. Esto significa que, en muchos casos, para provocar un
- cambio de contexto, puede agregar un parámetro 'format' a su solicitud:
- </para>
- <itemizedlist>
- <listitem><para>
- Via parámetro URL: <methodname>/news/list/format/xml</methodname>
- (recordar que el valor por defecto del esquema de ruteo permite
- pares arbitrarios de clave/valor tras la acción).
- </para></listitem>
- <listitem><para>
- Via parámetro GET: <methodname>/news/list?format=xml</methodname>
- </para></listitem>
- </itemizedlist>
- <para>
- <methodname>ContextSwitch</methodname> le permite especificar contextos arbitrarios,
- incluso qué sufijo cambiará (si hay alguno), cualquier cabecera de
- respuesta que deba ser enviada, y callbacks arbitrarios para la
- inicialización y posterior procesamiento.
- </para>
- <sect4 id="zend.controller.actionhelpers.contextswitch.contexts">
- <title>Contextos Disponibles por Defecto</title>
- <para>
- Por defecto, dos contextos están a disposición del ayudante
- <methodname>ContextSwitch</methodname> : JSON y XML.
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <emphasis>JSON</emphasis>. El contexto JSON establece la
- cabecera de respuesta 'Content-Type' a 'application/json',
- y el sufijo del script de vista a 'json.phtml'.
- </para>
- <para>
- Sin embargo, por defecto, no es necesario un script de vista.
- Simplemente serializará todas las variables de la vista,
- y emitirá la respuesta JSON inmediatamente.
- </para>
- <para>
- Este comportamiento puede ser desactivado apagando la
- serialización auto-JSON:
- </para>
- <programlisting language="php"><![CDATA[
- $this->_helper->contextSwitch()->setAutoJsonSerialization(false);
- ]]></programlisting>
- </listitem>
- <listitem>
- <para>
- <emphasis>XML</emphasis>. El contexto XML establece la
- cabecera de respuesta 'Content-Type' a 'text/xml',
- y el sufijo del script de vista a 'xml.phtml'.
- Necesitará crear un script de vista nuevo para el contexto.
- </para>
- </listitem>
- </itemizedlist>
- </sect4>
- <sect4 id="zend.controller.actionhelpers.contextswitch.custom">
- <title>Creando Contextos Personalizados</title>
- <para>
- A veces, los contextos por defecto no son suficientes. Por ejemplo,
- puede que desee devolver YAML, o PHP serializado, un RSS o ATOM
- feed, etc. <methodname>ContextSwitch</methodname> le permite hacerlo.
- </para>
- <para>
- La forma más fácil para añadir un nuevo contexto es a través del
- método <methodname>addContext()</methodname>. Este método tiene dos argumentos,
- el nombre del contexto, y un array de especificación.
- La especificación debería incluir uno o más de los siguientes:
- </para>
- <itemizedlist>
- <listitem>
- <para><emphasis>suffix</emphasis>: el sufijo a anteponer al
- sufijo de la vista por defecto tal como está registrado en
- ViewRenderer.</para>
- </listitem>
- <listitem>
- <para><emphasis>headers</emphasis>: un array de pares
- cabecera/valor que desea enviar como parte de la respuesta.
- </para>
- </listitem>
- <listitem>
- <para><emphasis>callbacks</emphasis>: un array que contiene una
- o más de las claves 'init' o 'post', apuntando a callbacks PHP
- válidos que pueden utilizarse para inicializar el contexto y
- posterior procesamiento.</para>
- <para>La inicialización de callbacks ocurre cuando el contexto
- es detectado por <methodname>ContextSwitch</methodname>.
- Usted puede usarlo para ejecutar una lógica arbitraria.
- Por ejemplo, el contexto JSON utiliza un callback
- para desactivar a ViewRenderer cuando está activada la
- serialización auto-JSON.</para>
- <para>El post procesamiento ocurre durante la rutina de la
- acción <methodname>postDispatch()</methodname>, y puede ser utilizada
- para ejecutar una lógica arbitraria. Como ejemplo, el contexto
- JSON utiliza un callback para determinar si la serialización
- auto-JSON está activada; si así fuera, serializa las variables
- de la vista a JSON y envía la respuesta, pero si no,
- re-habilita a ViewRenderer.</para>
- </listitem>
- </itemizedlist>
- <para>
- Hay una variedad de métodos para interactuar con contextos:
- </para>
- <itemizedlist>
- <listitem><para>
- <methodname>addContext($context, array $spec)</methodname>: agrega un nuevo
- contexto. Lanza una excepción si el contexto ya existe.
- </para></listitem>
- <listitem><para>
- <methodname>setContext($context, array $spec)</methodname>: añade un nuevo
- contexto o sobrescribirá un contexto existente.
- Usa la misma especificación que <methodname>addContext()</methodname>.
- </para></listitem>
- <listitem><para>
- <methodname>addContexts(array $contexts)</methodname>: añade muchos
- contextos de una vez. El array <methodname>$contexts</methodname> debería
- ser un array de pares contexto/especificación.
- Si alguno de los contextos ya existe, arrojará una excepción.
- </para></listitem>
- <listitem><para>
- <methodname>setContexts(array $contexts)</methodname>: añade nuevos
- contextos y sobreescribe los existentes. Usa la misma
- especificación que <methodname>addContexts()</methodname>.
- </para></listitem>
- <listitem><para>
- <methodname>hasContext($context)</methodname>: devuelve true si el contexto
- existe, false de lo contrario.
- </para></listitem>
- <listitem><para> <methodname>getContext($context)</methodname>: recupera un
- único contexto por su nombre. Devuelve un array siguiendo la
- especificación usada en <methodname>addContext()</methodname>.
- </para></listitem>
- <listitem><para>
- <methodname>getContexts()</methodname>: recupera todos los contextos.
- Devuelve un array de pares contexto/especificación.
- </para></listitem>
- <listitem><para>
- <methodname>removeContext($context)</methodname>: elimina un único contexto
- por su nombre. Devuelve true si tiene éxito, false si el
- contexto no fue encontrado.
- </para></listitem>
- <listitem><para>
- <methodname>clearContexts()</methodname>: elimina todos los contextos.
- </para></listitem>
- </itemizedlist>
- </sect4>
- <sect4 id="zend.controller.actionhelpers.contextswitch.actions">
- <title>Estableciendo los Contextos por Acción</title>
- <para>
- Hay dos mecanismos para establecer contextos disponibles.
- Puede crear manualmente los arrays en su controlador, o utilizar
- varios métodos en <methodname>ContextSwitch</methodname> para ensamblarlos.
- </para>
- <para>
- El método principal para añadir relaciones acción/contexto es
- <methodname>addActionContext()</methodname>. Se esperan dos argumentos,
- la acción a la que el contexto se añade, y el nombre de un contexto
- o un array de contextos. Como ejemplo, considere la siguiente
- clase controlador:
- </para>
- <programlisting language="php"><![CDATA[
- class FooController extends Zend_Controller_Action
- {
- public function listAction()
- {
- }
- public function viewAction()
- {
- }
- public function commentsAction()
- {
- }
- public function updateAction()
- {
- }
- }
- ]]></programlisting>
- <para>
- Supongamos que queremos añadir un contexto XML a la acción 'list',
- y contextos XML y JSON a la acción 'comments'.
- Podríamos hacerlo en el método <methodname>init()</methodname>:
- </para>
- <programlisting language="php"><![CDATA[
- class FooController extends Zend_Controller_Action
- {
- public function init()
- {
- $this->_helper->contextSwitch()
- ->addActionContext('list', 'xml')
- ->addActionContext('comments', array('xml', 'json'))
- ->initContext();
- }
- }
- ]]></programlisting>
- <para>
- Alternativamente, puede simplemente definir la propiedad del array
- <methodname>$contexts</methodname>:
- </para>
- <programlisting language="php"><![CDATA[
- class FooController extends Zend_Controller_Action
- {
- public $contexts = array(
- 'list' => array('xml'),
- 'comments' => array('xml', 'json')
- );
- public function init()
- {
- $this->_helper->contextSwitch()->initContext();
- }
- }
- ]]></programlisting>
- <para>
- El anterior es el menos sobrecargado, pero también está expuesto a
- posibles errores.
- </para>
- <para>
- Los siguientes métodos pueden ser utilizados para construir los
- mapeos del contexto:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>addActionContext($action, $context)</methodname>: marca uno
- o más contextos como disponibles para una acción.
- Si ya existen los mapeos, simplemente se añade a esos mapeos.
- <methodname>$context</methodname> puede ser un único contexto,
- o un array de contextos.
- </para>
- <para>
- Un valor de <methodname>true</methodname> para el contexto marcará
- todos los contextos como disponibles para la acción.
- </para>
- <para>
- Un valor vacío de $contexto desactivará todos los contextos
- para la acción determinada.
- </para>
- </listitem>
- <listitem><para>
- <methodname>setActionContext($action, $context)</methodname>: marca uno
- o más contextos como disponibles para una acción.
- Si el mapeo ya existe, se reemplaza con los especificados.
- <methodname>$context</methodname> puede ser un único contexto,
- o un array de contextos.
- </para></listitem>
- <listitem><para>
- <methodname>addActionContexts(array $contexts)</methodname>: agrega
- varios pares acción/contexto de una vez.
- <methodname>$contexts</methodname> debe ser un array asociativo de
- pares acción/contexto. Le pasa la petición a
- <methodname>addActionContext()</methodname>, lo que significa que si
- los emparejamientos ya existen, se añade a ellos.
- </para></listitem>
- <listitem><para>
- <methodname>setActionContexts(array $contexts)</methodname>: actúa como
- <methodname>addActionContexts()</methodname>, pero sobreescribe
- pares de acción/contexto existentes.
- </para></listitem>
- <listitem><para>
- <methodname>hasActionContext($action, $context)</methodname>: determina
- si una acción particular tiene un contexto determinado.
- </para></listitem>
- <listitem><para>
- <methodname>getActionContexts($action = null)</methodname>: devuelve o
- todos los contextos para una acción determinada,
- o todos los pares de acción/contexto.
- </para></listitem>
- <listitem><para>
- <methodname>removeActionContext($action, $context)</methodname>: elimina
- uno o más contextos de una acción determinada.
- <methodname>$context</methodname> puede ser un único contexto o un
- array de contextos.
- </para></listitem>
- <listitem><para>
- <methodname>clearActionContexts($action = null)</methodname>: elimina
- todos los contextos de una acción determinada, o de todas
- las acciones con contextos.
- </para></listitem>
- </itemizedlist>
- </sect4>
- <sect4 id="zend.controller.actionhelpers.contextswitch.initcontext">
- <title>Inicializando Conmutación de Contextos (Context Switching)</title>
- <para>
- Para inicializar la conmutación de contexto, necesita llamar a
- <methodname>initContext()</methodname> en su controlador de acción:
- </para>
- <programlisting language="php"><![CDATA[
- class NewsController extends Zend_Controller_Action
- {
- public function init()
- {
- $this->_helper->contextSwitch()->initContext();
- }
- }
- ]]></programlisting>
- <para>
- En algunos casos, puede querer forzar el contexto utilizado;
- por ejemplo, puede que sólo quiera permitir el contexto XML si
- la conmutación de contexto está activada. Puede hacerlo
- pasando el contexto a <methodname>initContext()</methodname>:
- </para>
- <programlisting language="php"><![CDATA[
- $contextSwitch->initContext('xml');
- ]]></programlisting>
- </sect4>
- <sect4 id="zend.controller.actionhelpers.contextswitch.misc">
- <title>Funcionalidad Adicional</title>
- <para>
- Se pueden utilizar una variedad de métodos para alterar el
- comportamiento del ayudante <methodname>ContextSwitch</methodname>.
- Estos incluyen:
- </para>
- <itemizedlist>
- <listitem>
- <para>
- <methodname>setAutoJsonSerialization($flag)</methodname>: Por defecto,
- los contextos JSON serializarán cualquier variable de vista
- a notación JSON y lo devolverán como una respuesta.
- Si usted desea crear su propia respuesta, debe deshabilitar
- esta opción; esto debe hacerse antes de llamar a
- <methodname>initContext()</methodname>.
- </para>
- <programlisting language="php"><![CDATA[
- $contextSwitch->setAutoJsonSerialization(false);
- $contextSwitch->initContext();
- ]]></programlisting>
- <para>
- Puede recuperar el valor del flag con
- <methodname>getAutoJsonSerialization()</methodname>.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setSuffix($context, $suffix,
- $prependViewRendererSuffix)</methodname>: Con este método,
- puede especificar un sufijo diferente para utilizarlo
- en un contexto determinado. El tercer argumento es
- utilizado para indicar si anteponer o no el actual
- sufijo de ViewRenderer con el nuevo sufijo; este flag
- está activado por defecto.
- </para>
- <para>
- Pasando un valor vacío para el sufijo hará que sólo el
- sufijo ViewRenderer será utilizado.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>addHeader($context, $header, $content)</methodname>: Añadir
- una cabecera de respuesta para un determinado contexto.
- <methodname>$header</methodname> es el nombre de la cabecera, y
- <methodname>$content</methodname> es el valor a pasar por esa cabecera.
- </para>
- <para>
- Cada contexto pueden tener múltiples cabeceras;
- <methodname>addHeader()</methodname> agrega cabeceras adicionales al
- stack de cabecera del contexto.
- </para>
- <para>
- Si el <methodname>$header</methodname> especificado ya existe para el
- contexto, arrojará una excepción.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setHeader($context, $header, $content)</methodname>:
- <methodname>setHeader()</methodname> actúa igual que
- <methodname>addHeader()</methodname>, excepto que le permite
- sobreescribir cabeceras del contexto actual.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>addHeaders($context, array $headers)</methodname>: Añade
- varias cabeceras de una vez a un determinado contexto.
- Delega a <methodname>addHeader()</methodname>, así que si la cabecera
- ya existe, arrojará una excepción. <methodname>$headers</methodname>
- es un array de pares cabecera/contexto.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setHeaders($context, array $headers.)</methodname>: como
- <methodname>addHeaders()</methodname>, excepto que lo delegua a
- <methodname>setHeader()</methodname>, permitiéndole sobreescribir las
- cabeceras existentes.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getHeader($context, $header)</methodname>: recuperar el
- valor de una cabecera para un determinado contexto.
- Retorna null si no existe.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>removeHeader($context, $header)</methodname>: eliminar una
- única cabecera para un determinado contexto.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>clearHeaders($context, $header)</methodname>: eliminar
- todas las cabeceras para un determinado contexto.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setCallback($context, $trigger, $callback)</methodname>:
- establecer un callback en un determinado disparador para
- poner en marcha un determinado contexto. Los disparadores
- pueden ser 'init' o 'post' (indicando que se llamará a un
- callback para cada contexto de inicialización o
- postDispatch). <methodname>$callback</methodname> debe ser un callback
- válido de PHP.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setCallbacks($context, array $callbacks)</methodname>:
- establece varios callbacks para un determinado contexto.
- <methodname>$callbacks</methodname> deben ser pares de
- diparadores/callbacks. En realidad, la mayor cantidad de
- callbacks que pueden ser registrados son dos, uno para la
- inicialización y otro para el procesamiento posterior.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getCallback($context, $trigger)</methodname>: recuperar un
- callback para un determinado disparador en un contexto dado.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getCallbacks($context)</methodname>: recupera todos los
- callbacks para un determinado contexto. Devuelve un array
- de pares disparor/callback.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>removeCallback($context, $trigger)</methodname>: elimina un
- callback para un determinado disparador y contexto.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>clearCallbacks($context)</methodname>: elimina todos los
- callbacks para un determinado contexto.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setContextParam($name)</methodname>: establece el parámetro
- de petición para comprobar si un conmutador de contexto ha
- sido solicitado. El valor por defecto es 'format',
- pero este accededor puede ser utilizado para establecer un
- valor alternativo.
- </para>
- <para>
- <methodname>getContextParam()</methodname> puede ser utilizado para
- recuperar el valor actual.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>setAutoDisableLayout($flag)</methodname>: Por defecto, los
- esquemas están deshabilitados cuando sucede una conmutación
- de contexto; esto es porque normalmente los esquemas sólo
- serán utilizados para devolver respuestas normales, y no
- tienen sentido en otros contextos.
- Sin embargo, si desea usar esquemas (tal vez puede tener un
- diseño para el nuevo contexto), puede cambiar este
- comportamiento pasando un valor falso a
- <methodname>setAutoDisableLayout()</methodname>. Usted debería hacer
- esto <emphasis>antes</emphasis> de llamar a
- <methodname>initContext()</methodname>.
- </para>
- <para>
- Para conseguir el valor de este flag, utilice el accededor
- <methodname>getAutoDisableLayout()</methodname>.
- </para>
- </listitem>
- <listitem>
- <para>
- <methodname>getCurrentContext()</methodname> Puede ser utilizado para
- determinar qué contexto fue detectado, si hay alguno.
- Este retorna null si no hubo conmutación de contexto,
- o si <methodname>initContext()</methodname> fue llamado antes de ser
- invocado.
- </para>
- </listitem>
- </itemizedlist>
- </sect4>
- <sect4 id="zend.controller.actionhelpers.contextswitch.ajaxcontext">
- <title>Funcionalidad de AjaxContext</title>
- <para>
- El ayudante <methodname>AjaxContext</methodname> extiende
- <methodname>ContextSwitch</methodname>, así que toda de la funcionalidad
- listada para <methodname>ContextSwitch</methodname> está disponible.
- Hay algunas diferencias fundamentales, sin embargo.
- </para>
- <para>
- En primer lugar, el controlador de acción utiliza una propiedad
- diferente para determinar contextos, <methodname>$ajaxable</methodname>.
- Esto es, que puede tener diferentes contextos utilizados para
- AJAX versus peticiones normales HTTP.
- Los diversos métodos <methodname>*ActionContext*()</methodname> de
- <methodname>AjaxContext</methodname> le escribirán a esta propiedad.
- </para>
- <para>
- En segundo lugar, sólo se disparará si se produjo un XmlHttpRequest,
- según lo determinado por la solicitud del método del objeto
- <methodname>isXmlHttpRequest()</methodname>.
- Así, si se pasa el parámetro de contexto ('format') en la
- solicitud, pero la solicitud no fue hecha como un XmlHttpRequest,
- no se disparará ninguna conmutación de contexto.
- </para>
- <para>
- En tercer lugar, <methodname>AjaxContext</methodname> agrega un contexto
- adicional, HTML. En este contexto, se establece el sufijo a
- 'ajax.phtml' para diferenciar el contexto de una solicitud normal.
- No se devuelven cabeceras adicionales.
- </para>
- <example id="zend.controller.actionhelpers.contextswitch.ajaxcontext.example">
- <title>Permitiendo a las Acciones Responder a Requerimientos Ajax</title>
- <para>
- En el siguiente ejemplo, estamos permitiendo requerimientos a
- las acciones 'view', 'form', y 'process' para responder a
- peticiones AJAX. En los dos primeros casos, 'view' y 'form',
- devolveremos fragmentos (snippets) de HTML con los cuales
- actualizaremos la página; y en el último, devolveremos JSON.
- </para>
- <programlisting language="php"><![CDATA[
- class CommentController extends Zend_Controller_Action
- {
- public function init()
- {
- $ajaxContext = $this->_helper->getHelper('AjaxContext');
- $ajaxContext->addActionContext('view', 'html')
- ->addActionContext('form', 'html')
- ->addActionContext('process', 'json')
- ->initContext();
- }
- public function viewAction()
- {
- // Tirar para ver un único comentario.
- // Cuando se detecta AjaxContext, utiliza el script de vista
- // comment/view.ajax.phtml.
- }
- public function formAction()
- {
- // Mostrar el form "add new comment".
- // Cuando se detecta AjaxContext, utiliza el script de vista
- // comment/form.ajax.phtml.
- }
- public function processAction()
- {
- // Procesar un nuevo comentario
- // Devolver los resultados como JSON; simplemente asignar los
- // resultados como variables de la vista, y se devolverán como JSON.
- }
- }
- ]]></programlisting>
- <para>
- En el lado del cliente, su biblioteca AJAX simplemente pedirá
- los parámetros finales '/comment/view', '/comment/form', y
- '/comment/process', y pasar el parámetro 'format':
- '/comment/view/format/html', '/comment/form/format/html',
- '/comment/process/format/json'. (O puede pasar el parámetro via
- string de consulta: e.g., "?format=json").
- </para>
- <para>
- Asumiendo que su biblioteca pasa la cabecera
- 'X-Requested-With:XmlHttpRequest' entonces estas acciones
- devolverán la respuesta en el formato apropiado.
- </para>
- </example>
- </sect4>
- </sect3>
- <!--
- vim:se ts=4 sw=4 et:
- -->
|