[ZF-10089] Zend_Log
[zend.git] / documentation / manual / es / module_specs / Zend_Controller-ActionHelpers-ContextSwitch.xml
blob1022b498ad12663801d63b2a7fbf98db62f5c829
1 <?xml version="1.0" encoding="UTF-8"?>
2     <!-- EN-Revision: 17597 -->
3     <!-- Reviewed: no -->
4 <sect3 id="zend.controller.actionhelpers.contextswitch">
5     <title>ContextSwitch con AjaxContext</title>
7     <para>
8         El ayudante de acción
9         <emphasis>ContextSwitch</emphasis>
10         está
11         destinado a facilitar el regreso de respuestas de diferentes formatos de
12         solicitud. El
13         helper
14         <emphasis>AjaxContext</emphasis>
15         es una
16         versión especializada de
17         <emphasis>ContextSwitch</emphasis>
18         que
19         facilita el regreso de respuestas a XmlHttpRequests.
20     </para>
22     <para>Para habilitar alguno, usted debe proporcionar indicios en su
23         controlador de qué acciones
24         pueden responder a que contextos. Si una
25         solicitud entrante indica un contexto válido para la
26         acción determinada,
27         entonces el ayudante:</para>
29     <itemizedlist>
30         <listitem>
31             <para>Deshabilita los esquemas, si están habilitados.</para>
32         </listitem>
34         <listitem>
35             <para>Establecer un sufijo de vista alternativo, requiriendo de
36                 manera efectiva un script
37                 de vista separado para el contexto.
38            </para>
39         </listitem>
41         <listitem>
42             <para>Envía las cabeceras de respuesta apropiadas para el contexto
43                 deseado.</para>
44         </listitem>
46         <listitem>
47             <para>Opcionalmente, llama a llamadas de retorno especifícas para
48                 configurar el contexto
49                 y/o realizar post-procesamiento.</para>
50         </listitem>
51     </itemizedlist>
53     <para>Como ejemplo, tomemos el siguiente controlador:</para>
55     <programlisting language="php"><![CDATA[
56 class NewsController extends Zend_Controller_Action
58     /**
59      * Página final; enviar a listAction()
60      */
61     public function indexAction()
62     {
63         $this->_forward('list');
64     }
66     /**
67      * Lista nuevos items
68      */
69     public function listAction()
70     {
71     }
73     /**
74      * Vista del nuevo item
75      */
76     public function viewAction()
77     {
78     }
80 ]]></programlisting>
82     <para>
83         Digamos que queremos que
84         <methodname>listAction()</methodname>
85         también esté disponible en un formato
86         <acronym>XML</acronym>
87         . En lugar
88         de crear una acción diferente, podemos indicarle que puede devolver una
89         respuesta
90         <acronym>XML</acronym>
91         :
92     </para>
94     <programlisting language="php"><![CDATA[
95 class NewsController extends Zend_Controller_Action
97     public function init()
98     {
99         $contextSwitch = $this->_helper->getHelper('contextSwitch');
100         $contextSwitch->addActionContext('list', 'xml')
101                       ->initContext();
102     }
104     // ...
106 ]]></programlisting>
108     <para>Esto es lo que hará:</para>
110     <itemizedlist>
111         <listitem>
112             <para>
113                 Establecer la cabecera de respuesta 'Content-Type' a
114                 '
115                 <filename>text/xml</filename>
116                 '.
117             </para>
118         </listitem>
120         <listitem>
121             <para>
122                 Cambiar el sufijo de vista de '
123                 <filename>xml.phtml</filename>
124                 ' (o, si usa un
125                 sufifo de vista alternativo, 'xml.[su sufijo]').
126             </para>
127         </listitem>
128     </itemizedlist>
130     <para>
131         Ahora, necesitará crear un nuevo script de vista,
132         <filename>news/list.xml.phtml</filename>
133         ', que creará y mostrará a
134         <acronym>XML</acronym>
135         .
136     </para>
138     <para>Para determinar si una solicitud debe iniciar un cambio de contexto,
139         el ayudante comprueba
140         si hay un token en el objeto solicitud. Por
141         defecto, busca el parámetro 'format', aunque esto
142         puede ser configurado.
143         Esto significa que, en muchos casos, para provocar un cambio de
144         contexto, puede agregar un parámetro 'format' a su solicitud:</para>
146     <itemizedlist>
147         <listitem>
148             <para>
149                 Via parámetro
150                 <acronym>URL</acronym>
151                 :
152                 <filename>/news/list/format/xml</filename>
153                 (recordar que
154                 el valor por defecto del esquema de ruteo permite pares
155                 arbitrarios de
156                 clave/valor tras la acción).
157             </para>
158         </listitem>
160         <listitem>
161             <para>
162                 Via parámetro
163                 <constant>GET</constant>
164                 :
165                 <command>/news/list?format=xml</command>
166             </para>
167         </listitem>
168     </itemizedlist>
170     <para>
171         <emphasis>ContextSwitch</emphasis>
172         le permite especificar contextos
173         arbitrarios, incluso qué sufijo cambiará (si hay alguno),
174         cualquier
175         cabecera de respuesta que deba ser enviada, y callbacks arbitrarios para
176         la
177         inicialización y posterior procesamiento.
178     </para>
180     <sect4 id="zend.controller.actionhelpers.contextswitch.contexts">
181         <title>Contextos Disponibles por Defecto</title>
183         <para>
184             Por defecto, dos contextos están a disposición del ayudante
185             <emphasis>ContextSwitch</emphasis>
186             :
187             <acronym>JSON</acronym>
188             y
189             <acronym>XML</acronym>
190             .
191         </para>
193         <itemizedlist>
194             <listitem>
195                 <para>
196                     <emphasis>JSON</emphasis>
197                     . El contexto
198                     <acronym>JSON</acronym>
199                     establece la cabecera de
200                     respuesta 'Content-Type' a '
201                     <filename>application/json</filename>
202                     ', y el sufijo
203                     del script de vista a '
204                     <filename>json.phtml</filename>
205                     '.
206                 </para>
208                 <para>
209                     Sin embargo, por defecto, no es necesario un script de
210                     vista. Simplemente
211                     serializará todas las variables de la
212                     vista, y emitirá la respuesta
213                     <acronym>JSON</acronym>
214                     inmediatamente.
215                 </para>
217                 <para>
218                     Este comportamiento puede ser desactivado apagando la
219                     serialización automática de
220                     <acronym>JSON</acronym>
221                     :
222                 </para>
224                 <programlisting language="php"><![CDATA[
225 $this->_helper->contextSwitch()->setAutoJsonSerialization(false);
226 ]]></programlisting>
227             </listitem>
229             <listitem>
230                 <para>
231                     <emphasis>
232                         <acronym>XML</acronym>
233                     </emphasis>
234                     . El contexto
235                     <acronym>XML</acronym>
236                     establece la cabecera de respuesta 'Content-Type' a
237                     '
238                     <filename>text/xml</filename>
239                     ', y el sufijo del script de
240                     vista a '
241                     <filename>xml.phtml</filename>
242                     '.
243                     Necesitará crear un script de vista nuevo para el contexto.
244                 </para>
245             </listitem>
246         </itemizedlist>
247     </sect4>
249     <sect4 id="zend.controller.actionhelpers.contextswitch.custom">
250         <title>Creando Contextos Personalizados</title>
252         <para>
253             A veces, los contextos por defecto no son suficientes. Por
254             ejemplo, puede que desee
255             devolver
256             <acronym>YAML</acronym>
257             , o
258             <acronym>PHP</acronym>
259             serializado, un
260             <acronym>RSS</acronym>
261             o
262             <acronym>ATOM</acronym>
263             feed, etc.
264             <emphasis>ContextSwitch</emphasis>
265             le permite hacerlo.
266         </para>
268         <para>
269             La forma más fácil para añadir un nuevo contexto es a través del
270             método
271             <methodname>addContext()</methodname>
272             . Este método tiene dos
273             argumentos, el nombre del contexto, y un array de especificación.
274             La
275             especificación debería incluir uno o más de los siguientes:
276         </para>
278         <itemizedlist>
279             <listitem>
280                 <para>
281                     <emphasis>suffix</emphasis>
282                     : el sufijo a anteponer al
283                     sufijo de la vista por defecto tal como está
284                     registrado en
285                     ViewRenderer.
286                 </para>
287             </listitem>
289             <listitem>
290                 <para>
291                     <emphasis>headers</emphasis>
292                     : un array de pares
293                     cabecera/valor que desea enviar como parte de la respuesta.
294                 </para>
295             </listitem>
297             <listitem>
298                 <para>
299                     <emphasis>callbacks</emphasis>
300                     : un array que contiene una
301                     o más de las claves 'init' o 'post', apuntando a
302                     callbacks
303                     <acronym>PHP</acronym>
304                     válidos que pueden utilizarse
305                     para inicializar el contexto y posterior
306                     procesamiento.
307                 </para>
309                 <para>
310                     La inicialización de callbacks ocurre cuando el contexto
311                     es detectado por
312                     <emphasis>ContextSwitch</emphasis>
313                     .
314                     Usted puede usarlo para ejecutar una lógica arbitraria. Por
315                     ejemplo, el contexto
316                     <acronym>JSON</acronym>
317                     utiliza un
318                     callback para desactivar a ViewRenderer cuando está activada
319                     la
320                     serialización auto-JSON.
321                 </para>
323                 <para>
324                     El post procesamiento ocurre durante la rutina de la
325                     acción
326                     <methodname>postDispatch()</methodname>
327                     , y puede ser
328                     utilizada para ejecutar una lógica arbitraria. Como ejemplo,
329                     el
330                     contexto
331                     <acronym>JSON</acronym>
332                     utiliza un callback para
333                     determinar si la serialización auto-JSON está activada;
334                     si
335                     así fuera, serializa las variables de la vista a
336                     <acronym>JSON</acronym>
337                     y envía la respuesta, pero si
338                     no, re-habilita a ViewRenderer.
339                 </para>
340             </listitem>
341         </itemizedlist>
343         <para>Hay una variedad de métodos para interactuar con contextos:</para>
345         <itemizedlist>
346             <listitem>
347                 <para>
348                     <methodname>addContext($context, array $spec)</methodname>
349                     :
350                     agrega un nuevo contexto. Lanza una excepción si el contexto
351                     ya existe.
352                 </para>
353             </listitem>
355             <listitem>
356                 <para>
357                     <methodname>setContext($context, array $spec)</methodname>
358                     :
359                     añade un nuevo contexto o sobrescribirá un contexto
360                     existente. Usa la misma
361                     especificación que
362                     <methodname>addContext()</methodname>
363                     .
364                 </para>
365             </listitem>
367             <listitem>
368                 <para>
369                     <methodname>addContexts(array $contexts)</methodname>
370                     : añade
371                     muchos contextos de una vez. El array
372                     <varname>$contexts</varname>
373                     debería ser un array
374                     de pares contexto/especificación. Si alguno de los contextos
375                     ya existe, arrojará una excepción.
376                 </para>
377             </listitem>
379             <listitem>
380                 <para>
381                     <methodname>setContexts(array $contexts)</methodname>
382                     : añade
383                     nuevos contextos y sobreescribe los existentes. Usa la misma
384                     especificación que
385                     <methodname>addContexts()</methodname>
386                     .
387                 </para>
388             </listitem>
390             <listitem>
391                 <para>
392                     <methodname>hasContext($context)</methodname>
393                     : devuelve
394                     <constant>TRUE</constant>
395                     si el contexto existe,
396                     <constant>FALSE</constant>
397                     de lo contrario.
398                 </para>
399             </listitem>
401             <listitem>
402                 <para>
403                     <methodname>getContext($context)</methodname>
404                     : recupera un
405                     único contexto por su nombre. Devuelve un array siguiendo la
406                     especificación usada en
407                     <methodname>addContext()</methodname>
408                     .
409                 </para>
410             </listitem>
412             <listitem>
413                 <para>
414                     <methodname>getContexts()</methodname>
415                     : recupera todos los
416                     contextos. Devuelve un array de pares
417                     contexto/especificación.
418                 </para>
419             </listitem>
421             <listitem>
422                 <para>
423                     <methodname>removeContext($context)</methodname>
424                     : elimina un
425                     único contexto por su nombre. Devuelve
426                     <constant>TRUE</constant>
427                     si tiene éxito,
428                     <constant>FALSE</constant>
429                     si el
430                     contexto no fue encontrado.
431                 </para>
432             </listitem>
434             <listitem>
435                 <para>
436                     <methodname>clearContexts()</methodname>
437                     : elimina todos los
438                     contextos.
439                 </para>
440             </listitem>
441         </itemizedlist>
442     </sect4>
444     <sect4 id="zend.controller.actionhelpers.contextswitch.actions">
445         <title>Estableciendo los Contextos por Acción</title>
447         <para>
448             Hay dos mecanismos para establecer contextos disponibles. Puede
449             crear manualmente los
450             arrays en su controlador, o utilizar varios
451             métodos en
452             <emphasis>ContextSwitch</emphasis>
453             para ensamblarlos.
454         </para>
456         <para>
457             El método principal para añadir relaciones acción/contexto es
458             <methodname>addActionContext()</methodname>
459             . Se esperan dos
460             argumentos, la acción a la que el contexto se añade, y el nombre de
461             un
462             contexto o un array de contextos. Como ejemplo, considere la
463             siguiente clase controlador:
464         </para>
466         <programlisting language="php"><![CDATA[
467 class FooController extends Zend_Controller_Action
469     public function listAction()
470     {
471     }
473     public function viewAction()
474     {
475     }
477     public function commentsAction()
478     {
479     }
481     public function updateAction()
482     {
483     }
485 ]]></programlisting>
487         <para>
488             Supongamos que queremos añadir un contexto
489             <acronym>XML</acronym>
490             a la acción 'list', y contextos
491             <acronym>XML</acronym>
492             y
493             <acronym>JSON</acronym>
494             a la acción 'comments'. Podríamos
495             hacerlo en el método
496             <methodname>init()</methodname>
497             :
498         </para>
500         <programlisting language="php"><![CDATA[
501 class FooController extends Zend_Controller_Action
503     public function init()
504     {
505         $this->_helper->contextSwitch()
506              ->addActionContext('list', 'xml')
507              ->addActionContext('comments', array('xml', 'json'))
508              ->initContext();
509     }
511 ]]></programlisting>
513         <para>
514             Alternativamente, puede simplemente definir la propiedad del
515             array
516             <varname>$context</varname>
517             :
518         </para>
520         <programlisting language="php"><![CDATA[
521 class FooController extends Zend_Controller_Action
523     public $contexts = array(
524         'list'     => array('xml'),
525         'comments' => array('xml', 'json')
526     );
528     public function init()
529     {
530         $this->_helper->contextSwitch()->initContext();
531     }
533 ]]></programlisting>
535         <para>El anterior es el menos sobrecargado, pero también está expuesto
536             a posibles errores.</para>
538         <para>Los siguientes métodos pueden ser utilizados para construir los
539             mapeos del contexto:</para>
541         <itemizedlist>
542             <listitem>
543                 <para>
544                     <methodname>addActionContext($action,
545                         $context)</methodname>
546                     : marca uno o más contextos como
547                     disponibles para una acción. Si ya existen los
548                     mapeos,
549                     simplemente se añade a esos mapeos.
550                     <varname>$context</varname>
551                     puede ser un único
552                     contexto, o un array de contextos.
553                 </para>
555                 <para>
556                     Un valor de
557                     <constant>TRUE</constant>
558                     para el
559                     contexto marcará todos los contextos como disponibles para
560                     la acción.
561                 </para>
563                 <para>Un valor vacío de $contexto desactivará todos los
564                     contextos para la acción
565                     determinada.</para>
566             </listitem>
568             <listitem>
569                 <para>
570                     <methodname>setActionContext($action,
571                         $context)</methodname>
572                     : marca uno o más contextos como
573                     disponibles para una acción. Si el mapeo ya
574                     existe, se
575                     reemplaza con los especificados.
576                     <varname>$context</varname>
577                     puede ser un único
578                     contexto, o un array de contextos.
579                 </para>
580             </listitem>
582             <listitem>
583                 <para>
584                     <methodname>addActionContexts(array $contexts)</methodname>
585                     :
586                     agrega varios pares acción/contexto de una vez.
587                     <varname>$contexts</varname>
588                     debe ser un array
589                     asociativo de pares acción/contexto. Le pasa la petición a
590                     <methodname>addActionContext()</methodname>
591                     , lo que
592                     significa que si los emparejamientos ya existen, se añade a
593                     ellos.
594                 </para>
595             </listitem>
597             <listitem>
598                 <para>
599                     <methodname>setActionContexts(array $contexts)</methodname>
600                     :
601                     actúa como
602                     <methodname>addActionContexts()</methodname>
603                     ,
604                     pero sobreescribe pares de acción/contexto existentes.
605                 </para>
606             </listitem>
608             <listitem>
609                 <para>
610                     <methodname>hasActionContext($action,
611                         $context)</methodname>
612                     : determina si una acción particular
613                     tiene un contexto determinado.
614                 </para>
615             </listitem>
617             <listitem>
618                 <para>
619                     <methodname>getActionContexts($action = null)</methodname>
620                     :
621                     devuelve o todos los contextos para una acción determinada,
622                     o todos los pares de
623                     acción/contexto.
624                 </para>
625             </listitem>
627             <listitem>
628                 <para>
629                     <methodname>removeActionContext($action,
630                         $context)</methodname>
631                     : elimina uno o más contextos de
632                     una acción determinada.
633                     <varname>$context</varname>
634                     puede ser un único contexto o un array de contextos.
635                 </para>
636             </listitem>
638             <listitem>
639                 <para>
640                     <methodname>clearActionContexts($action =
641                         null)</methodname>
642                     : elimina todos los contextos de una
643                     acción determinada, o de todas las acciones
644                     con contextos.
645                 </para>
646             </listitem>
647         </itemizedlist>
648     </sect4>
650     <sect4 id="zend.controller.actionhelpers.contextswitch.initcontext">
651         <title>Inicializando Conmutación de Contextos (Context
652             Switching)</title>
654         <para>
655             Para inicializar la conmutación de contexto, necesita llamar a
656             <methodname>initContext()</methodname>
657             en su controlador de
658             acción:
659         </para>
661         <programlisting language="php"><![CDATA[
662 class NewsController extends Zend_Controller_Action
664     public function init()
665     {
666         $this->_helper->contextSwitch()->initContext();
667     }
669 ]]></programlisting>
671         <para>
672             En algunos casos, puede querer forzar el contexto utilizado; por
673             ejemplo, puede que sólo
674             quiera permitir el contexto XML si la
675             conmutación de contexto está activada. Puede
676             hacerlo pasando el
677             contexto a
678             <methodname>initContext()</methodname>
679             :
680         </para>
682         <programlisting language="php"><![CDATA[
683 $contextSwitch->initContext('xml');
684 ]]></programlisting>
685     </sect4>
687     <sect4 id="zend.controller.actionhelpers.contextswitch.misc">
688         <title>Funcionalidad Adicional</title>
690         <para>
691             Se pueden utilizar una variedad de métodos para alterar el
692             comportamiento del ayudante
693             <emphasis>ContextSwitch</emphasis>
694             .
695             Estos incluyen:
696         </para>
698         <itemizedlist>
699             <listitem>
700                 <para>
701                     <methodname>setAutoJsonSerialization($flag)</methodname>
702                     :
703                     Por defecto, los contextos
704                     <acronym>JSON</acronym>
705                     serializarán cualquier variable de vista a notación
706                     <acronym>JSON</acronym>
707                     y lo devolverán como una
708                     respuesta. Si usted desea crear su propia respuesta,
709                     debe
710                     deshabilitar esta opción; esto debe hacerse antes de llamar
711                     a
712                     <methodname>initContext()</methodname>
713                     .
714                 </para>
716                 <programlisting language="php"><![CDATA[
717 $contextSwitch->setAutoJsonSerialization(false);
718 $contextSwitch->initContext();
719 ]]></programlisting>
721                 <para>
722                     Puede recuperar el valor del flag con
723                     <methodname>getAutoJsonSerialization()</methodname>
724                     .
725                 </para>
726             </listitem>
728             <listitem>
729                 <para>
730                     <methodname>setSuffix($context, $suffix,
731                         $prependViewRendererSuffix)</methodname>
732                     : Con este
733                     método, puede especificar un sufijo diferente para
734                     utilizarlo en un
735                     contexto determinado. El tercer argumento
736                     es utilizado para indicar si anteponer
737                     o no el actual sufijo
738                     de ViewRenderer con el nuevo sufijo; este flag está
739                     activado
740                     por defecto.
741                 </para>
743                 <para>Pasando un valor vacío para el sufijo hará que sólo el
744                     sufijo ViewRenderer será
745                     utilizado.</para>
746             </listitem>
748             <listitem>
749                 <para>
750                     <methodname>addHeader($context, $header,
751                         $content)</methodname>
752                     : Añadir una cabecera de respuesta
753                     para un determinado contexto.
754                     <varname>$header</varname>
755                     es el nombre de la
756                     cabecera, y
757                     <varname>$content</varname>
758                     es el valor a
759                     pasar por esa cabecera.
760                 </para>
762                 <para>
763                     Cada contexto pueden tener múltiples cabeceras;
764                     <methodname>addHeader()</methodname>
765                     agrega cabeceras
766                     adicionales al stack de cabecera del contexto.
767                 </para>
769                 <para>
770                     Si el
771                     <varname>$header</varname>
772                     especificado ya
773                     existe para el contexto, arrojará una excepción.
774                 </para>
775             </listitem>
777             <listitem>
778                 <para>
779                     <methodname>setHeader($context, $header,
780                         $content)</methodname>
781                     :
782                     <methodname>setHeader()</methodname>
783                     actúa igual que
784                     <methodname>addHeader()</methodname>
785                     , excepto que le
786                     permite sobreescribir cabeceras del contexto actual.
787                 </para>
788             </listitem>
790             <listitem>
791                 <para>
792                     <methodname>addHeaders($context, array
793                         $headers)</methodname>
794                     : Añade varias cabeceras de una
795                     vez a un determinado contexto. Delega a
796                     <methodname>addHeader()</methodname>
797                     , así que si la
798                     cabecera ya existe, arrojará una excepción.
799                     <varname>$headers</varname>
800                     es un array de pares
801                     cabecera/contexto.
802                 </para>
803             </listitem>
805             <listitem>
806                 <para>
807                     <methodname>setHeaders($context, array
808                         $headers.)</methodname>
809                     : como
810                     <methodname>addHeaders()</methodname>
811                     , excepto que lo
812                     delegua a
813                     <methodname>setHeader()</methodname>
814                     ,
815                     permitiéndole sobreescribir las cabeceras existentes.
816                 </para>
817             </listitem>
819             <listitem>
820                 <para>
821                     <methodname>getHeader($context, $header)</methodname>
822                     :
823                     recuperar el valor de una cabecera para un determinado
824                     contexto. Retorna null si
825                     no existe.
826                 </para>
827             </listitem>
829             <listitem>
830                 <para>
831                     <methodname>removeHeader($context, $header)</methodname>
832                     :
833                     eliminar una única cabecera para un determinado contexto.
834                 </para>
835             </listitem>
837             <listitem>
838                 <para>
839                     <methodname>clearHeaders($context, $header)</methodname>
840                     :
841                     eliminar todas las cabeceras para un determinado contexto.
842                 </para>
843             </listitem>
845             <listitem>
846                 <para>
847                     <methodname>setCallback($context, $trigger,
848                         $callback)</methodname>
849                     : establecer un callback en un
850                     determinado disparador para poner en marcha un
851                     determinado
852                     contexto. Los disparadores pueden ser 'init' o 'post'
853                     (indicando que
854                     se llamará a un callback para cada contexto
855                     de inicialización o postDispatch).
856                     <varname>$callback</varname>
857                     debe ser un callback
858                     válido de
859                     <acronym>PHP</acronym>
860                     .
861                 </para>
862             </listitem>
864             <listitem>
865                 <para>
866                     <methodname>setCallbacks($context, array
867                         $callbacks)</methodname>
868                     : establece varios callbacks
869                     para un determinado contexto.
870                     <varname>$callbacks</varname>
871                     deben ser pares de
872                     diparadores/callbacks. En realidad, la mayor cantidad de
873                     callbacks que pueden ser registrados son dos, uno para la
874                     inicialización y otro
875                     para el procesamiento posterior.
876                 </para>
877             </listitem>
879             <listitem>
880                 <para>
881                     <methodname>getCallback($context, $trigger)</methodname>
882                     :
883                     recuperar un callback para un determinado disparador en un
884                     contexto dado.
885                 </para>
886             </listitem>
888             <listitem>
889                 <para>
890                     <methodname>getCallbacks($context)</methodname>
891                     : recupera
892                     todos los callbacks para un determinado contexto. Devuelve
893                     un array de
894                     pares disparor/callback.
895                 </para>
896             </listitem>
898             <listitem>
899                 <para>
900                     <methodname>removeCallback($context, $trigger)</methodname>
901                     :
902                     elimina un callback para un determinado disparador y
903                     contexto.
904                 </para>
905             </listitem>
907             <listitem>
908                 <para>
909                     <methodname>clearCallbacks($context)</methodname>
910                     : elimina
911                     todos los callbacks para un determinado contexto.
912                 </para>
913             </listitem>
915             <listitem>
916                 <para>
917                     <methodname>setContextParam($name)</methodname>
918                     : establece
919                     el parámetro de petición para comprobar si un conmutador de
920                     contexto
921                     ha sido solicitado. El valor por defecto es
922                     'format', pero este accededor puede
923                     ser utilizado para
924                     establecer un valor alternativo.
925                 </para>
927                 <para>
928                     <methodname>getContextParam()</methodname>
929                     puede ser
930                     utilizado para recuperar el valor actual.
931                 </para>
932             </listitem>
934             <listitem>
935                 <para>
936                     <methodname>setAutoDisableLayout($flag)</methodname>
937                     : Por
938                     defecto, los esquemas están deshabilitados cuando sucede una
939                     conmutación de
940                     contexto; esto es porque normalmente los
941                     esquemas sólo serán utilizados para
942                     devolver respuestas
943                     normales, y no tienen sentido en otros contextos. Sin
944                     embargo, si desea usar esquemas (tal vez puede tener un
945                     diseño para el nuevo
946                     contexto), puede cambiar este
947                     comportamiento pasando un valor falso a
948                     <methodname>setAutoDisableLayout()</methodname>
949                     . Usted
950                     debería hacer esto
951                     <emphasis>antes</emphasis>
952                     de llamar a
953                     <methodname>initContext()</methodname>
954                     .
955                 </para>
957                 <para>
958                     Para conseguir el valor de este flag, utilice el
959                     accededor
960                     <methodname>getAutoDisableLayout()</methodname>
961                     .
962                 </para>
963             </listitem>
965             <listitem>
966                 <para>
967                     <methodname>getCurrentContext()</methodname>
968                     Puede ser
969                     utilizado para determinar qué contexto fue detectado, si hay
970                     alguno.
971                     Este retorna null si no hubo conmutación de
972                     contexto, o si
973                     <methodname>initContext()</methodname>
974                     fue
975                     llamado antes de ser invocado.
976                 </para>
977             </listitem>
978         </itemizedlist>
979     </sect4>
981     <sect4 id="zend.controller.actionhelpers.contextswitch.ajaxcontext">
982         <title>Funcionalidad de AjaxContext</title>
984         <para>
985             El ayudante
986             <emphasis>AjaxContext</emphasis>
987             extiende
988             <emphasis>ContextSwitch</emphasis>
989             , así que toda de la
990             funcionalidad listada para
991             <emphasis>ContextSwitch</emphasis>
992             está disponible. Hay algunas diferencias fundamentales, sin embargo.
993         </para>
995         <para>
996             En primer lugar, el controlador de acción utiliza una propiedad
997             diferente para determinar
998             contextos,
999             <varname>$ajaxable</varname>
1000             . Esto es, que puede tener
1001             diferentes contextos utilizados para
1002             <acronym>AJAX</acronym>
1003             versus
1004             peticiones normales
1005             <acronym>HTTP</acronym>
1006             . Los diversos métodos
1007             <methodname>*ActionContext*()</methodname>
1008             de
1009             <emphasis>AjaxContext</emphasis>
1010             le escribirán a esta
1011             propiedad.
1012         </para>
1014         <para>
1015             En segundo lugar, sólo se disparará si se produjo un
1016             XmlHttpRequest, según lo determinado
1017             por la solicitud del método del
1018             objeto
1019             <methodname>isXmlHttpRequest()</methodname>
1020             . Así, si se pasa
1021             el parámetro de contexto ('format') en la solicitud, pero la
1022             solicitud
1023             no fue hecha como un XmlHttpRequest, no se disparará
1024             ninguna conmutación de contexto.
1025         </para>
1027         <para>
1028             En tercer lugar,
1029             <emphasis>AjaxContext</emphasis>
1030             agrega un
1031             contexto adicional,
1032             <acronym>HTML</acronym>
1033             . En este contexto, se establece el sufijo a
1034             '
1035             <filename>ajax.phtml</filename>
1036             ' para diferenciar el contexto de una solicitud normal.
1037             No se devuelven cabeceras
1038             adicionales.
1039         </para>
1041         <example id="zend.controller.actionhelpers.contextswitch.ajaxcontext.example">
1042             <title>Permitiendo a las Acciones Responder a Requerimientos
1043                 Ajax</title>
1045             <para>
1046                 En el siguiente ejemplo, estamos permitiendo requerimientos a
1047                 las acciones 'view',
1048                 'form', y 'process' para responder a
1049                 peticiones
1050                 <acronym>AJAX</acronym>
1051                 . En los dos primeros casos,
1052                 'view' y 'form', devolveremos fragmentos (snippets) de
1053                 <acronym>HTML</acronym>
1054                 con
1055                 los cuales actualizaremos la página; y en el último,
1056                 devolveremos
1057                 <acronym>JSON</acronym>
1058                 .
1059             </para>
1061             <programlisting language="php"><![CDATA[
1062 class CommentController extends Zend_Controller_Action
1064     public function init()
1065     {
1066         $ajaxContext = $this->_helper->getHelper('AjaxContext');
1067         $ajaxContext->addActionContext('view', 'html')
1068                     ->addActionContext('form', 'html')
1069                     ->addActionContext('process', 'json')
1070                     ->initContext();
1071     }
1073     public function viewAction()
1074     {
1075         // Tirar para ver un único comentario.
1076         // Cuando se detecta AjaxContext, utiliza el script de vista
1077         // comment/view.ajax.phtml.
1078     }
1080     public function formAction()
1081     {
1082         // Mostrar el form "add new comment".
1083         // Cuando se detecta AjaxContext, utiliza el script de vista
1084         // comment/form.ajax.phtml.
1085     }
1087     public function processAction()
1088     {
1089         // Procesar un nuevo comentario
1090         // Devolver los resultados como JSON; simplemente asignar los
1091         // resultados como variables de la vista, y se devolverán como JSON.
1093     }
1095 ]]></programlisting>
1097             <para>
1098                 En el lado del cliente, su biblioteca
1099                 <acronym>AJAX</acronym>
1100                 simplemente pedirá los parámetros finales '
1101                 <filename>/comment/view</filename>
1102                 ',
1103                 '
1104                 <filename>/comment/form</filename>
1105                 ', y '
1106                 <filename>/comment/process</filename>
1107                 ', y pasar el parámetro
1108                 'format': '
1109                 <filename>/comment/view/format/html</filename>
1110                 ',
1111                 '
1112                 <filename>/comment/form/format/html</filename>
1113                 ', '
1114                 <filename>/comment/process/format/json</filename>
1115                 '. (O
1116                 puede pasar el parámetro via string de consulta: ejemplo
1117                 "?format=json").
1118             </para>
1120             <para>Asumiendo que su biblioteca pasa la cabecera
1121                 'X-Requested-With:XmlHttpRequest'
1122                 entonces estas acciones
1123                 devolverán la respuesta en el formato apropiado.</para>
1124         </example>
1125     </sect4>
1126 </sect3>