Zend_Controller-ActionHelpers-ContextSwitch.xml 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773
  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>
  6. <para> El ayudante de acción <emphasis>ContextSwitch</emphasis> está
  7. destinado a facilitar el regreso de respuestas de diferentes formatos de
  8. solicitud. El helper <emphasis>AjaxContext</emphasis> es una
  9. versión especializada de <emphasis>ContextSwitch</emphasis> que
  10. facilita el regreso de respuestas a XmlHttpRequests. </para>
  11. <para> Para habilitar alguno, usted debe proporcionar indicios en su
  12. controlador de qué acciones pueden responder a que contextos. Si una
  13. solicitud entrante indica un contexto válido para la acción determinada,
  14. entonces el ayudante: </para>
  15. <itemizedlist>
  16. <listitem>
  17. <para> Deshabilita los esquemas, si están habilitados. </para>
  18. </listitem>
  19. <listitem>
  20. <para> Establecer un sufijo de vista alternativo, requiriendo de
  21. manera efectiva un script de vista separado para el contexto.
  22. </para>
  23. </listitem>
  24. <listitem>
  25. <para> Envía las cabeceras de respuesta apropiadas para el contexto
  26. deseado. </para>
  27. </listitem>
  28. <listitem>
  29. <para> Opcionalmente, llama a llamadas de retorno especifícas para
  30. configurar el contexto y/o realizar post-procesamiento. </para>
  31. </listitem>
  32. </itemizedlist>
  33. <para> Como ejemplo, tomemos el siguiente controlador: </para>
  34. <programlisting language="php"><![CDATA[
  35. class NewsController extends Zend_Controller_Action
  36. {
  37. /**
  38. * Página final; enviar a listAction()
  39. */
  40. public function indexAction()
  41. {
  42. $this->_forward('list');
  43. }
  44. /**
  45. * Lista nuevos items
  46. */
  47. public function listAction()
  48. {
  49. }
  50. /**
  51. * Vista del nuevo item
  52. */
  53. public function viewAction()
  54. {
  55. }
  56. }
  57. ]]></programlisting>
  58. <para> Digamos que queremos que <methodname>listAction()</methodname>
  59. también esté disponible en un formato <acronym>XML</acronym>. En lugar
  60. de crear una acción diferente, podemos indicarle que puede devolver una
  61. respuesta <acronym>XML</acronym>: </para>
  62. <programlisting language="php"><![CDATA[
  63. class NewsController extends Zend_Controller_Action
  64. {
  65. public function init()
  66. {
  67. $contextSwitch = $this->_helper->getHelper('contextSwitch');
  68. $contextSwitch->addActionContext('list', 'xml')
  69. ->initContext();
  70. }
  71. // ...
  72. }
  73. ]]></programlisting>
  74. <para> Esto es lo que hará: </para>
  75. <itemizedlist>
  76. <listitem>
  77. <para> Establecer la cabecera de respuesta 'Content-Type' a
  78. '<filename>text/xml</filename>'. </para>
  79. </listitem>
  80. <listitem>
  81. <para> Cambiar el sufijo de vista de '<filename>xml.phtml</filename>' (o, si usa un
  82. sufifo de vista alternativo, 'xml.[su sufijo]'). </para>
  83. </listitem>
  84. </itemizedlist>
  85. <para> Ahora, necesitará crear un nuevo script de vista,
  86. <filename>news/list.xml.phtml</filename>', que creará y mostrará a <acronym>XML</acronym>. </para>
  87. <para> Para determinar si una solicitud debe iniciar un cambio de contexto,
  88. el ayudante comprueba si hay un token en el objeto solicitud. Por
  89. defecto, busca el parámetro 'format', aunque esto puede ser configurado.
  90. Esto significa que, en muchos casos, para provocar un cambio de
  91. contexto, puede agregar un parámetro 'format' a su solicitud: </para>
  92. <itemizedlist>
  93. <listitem>
  94. <para> Via parámetro <acronym>URL</acronym>:
  95. <filename>/news/list/format/xml</filename> (recordar que
  96. el valor por defecto del esquema de ruteo permite pares
  97. arbitrarios de clave/valor tras la acción). </para>
  98. </listitem>
  99. <listitem>
  100. <para> Via parámetro <constant>GET</constant>:
  101. <command>/news/list?format=xml</command>
  102. </para>
  103. </listitem>
  104. </itemizedlist>
  105. <para>
  106. <emphasis>ContextSwitch</emphasis> le permite especificar contextos
  107. arbitrarios, incluso qué sufijo cambiará (si hay alguno), cualquier
  108. cabecera de respuesta que deba ser enviada, y callbacks arbitrarios para
  109. la inicialización y posterior procesamiento. </para>
  110. <sect4 id="zend.controller.actionhelpers.contextswitch.contexts">
  111. <title>Contextos Disponibles por Defecto</title>
  112. <para> Por defecto, dos contextos están a disposición del ayudante
  113. <emphasis>ContextSwitch</emphasis> : <acronym>JSON</acronym>
  114. y <acronym>XML</acronym>. </para>
  115. <itemizedlist>
  116. <listitem>
  117. <para>
  118. <emphasis>JSON</emphasis>. El contexto
  119. <acronym>JSON</acronym> establece la cabecera de
  120. respuesta 'Content-Type' a '<filename>application/json</filename>', y el sufijo
  121. del script de vista a '<filename>json.phtml</filename>'. </para>
  122. <para> Sin embargo, por defecto, no es necesario un script de
  123. vista. Simplemente serializará todas las variables de la
  124. vista, y emitirá la respuesta <acronym>JSON</acronym>
  125. inmediatamente. </para>
  126. <para> Este comportamiento puede ser desactivado apagando la
  127. serialización automática de <acronym>JSON</acronym>: </para>
  128. <programlisting language="php"><![CDATA[
  129. $this->_helper->contextSwitch()->setAutoJsonSerialization(false);
  130. ]]></programlisting>
  131. </listitem>
  132. <listitem>
  133. <para>
  134. <emphasis><acronym>XML</acronym></emphasis>. El contexto <acronym>XML</acronym>
  135. establece la cabecera de respuesta 'Content-Type' a
  136. '<filename>text/xml</filename>', y el sufijo del script de
  137. vista a '<filename>xml.phtml</filename>'.
  138. Necesitará crear un script de vista nuevo para el contexto.
  139. </para>
  140. </listitem>
  141. </itemizedlist>
  142. </sect4>
  143. <sect4 id="zend.controller.actionhelpers.contextswitch.custom">
  144. <title>Creando Contextos Personalizados</title>
  145. <para> A veces, los contextos por defecto no son suficientes. Por
  146. ejemplo, puede que desee devolver <acronym>YAML</acronym>, o <acronym>PHP</acronym>
  147. serializado, un <acronym>RSS</acronym> o <acronym>ATOM</acronym> feed, etc.
  148. <emphasis>ContextSwitch</emphasis> le permite hacerlo. </para>
  149. <para> La forma más fácil para añadir un nuevo contexto es a través del
  150. método <methodname>addContext()</methodname>. Este método tiene dos
  151. argumentos, el nombre del contexto, y un array de especificación. La
  152. especificación debería incluir uno o más de los siguientes: </para>
  153. <itemizedlist>
  154. <listitem>
  155. <para><emphasis>suffix</emphasis>: el sufijo a anteponer al
  156. sufijo de la vista por defecto tal como está registrado en
  157. ViewRenderer.</para>
  158. </listitem>
  159. <listitem>
  160. <para><emphasis>headers</emphasis>: un array de pares
  161. cabecera/valor que desea enviar como parte de la respuesta.
  162. </para>
  163. </listitem>
  164. <listitem>
  165. <para><emphasis>callbacks</emphasis>: un array que contiene una
  166. o más de las claves 'init' o 'post', apuntando a callbacks
  167. <acronym>PHP</acronym> válidos que pueden utilizarse
  168. para inicializar el contexto y posterior
  169. procesamiento.</para>
  170. <para>La inicialización de callbacks ocurre cuando el contexto
  171. es detectado por <emphasis>ContextSwitch</emphasis>.
  172. Usted puede usarlo para ejecutar una lógica arbitraria. Por
  173. ejemplo, el contexto <acronym>JSON</acronym> utiliza un
  174. callback para desactivar a ViewRenderer cuando está activada
  175. la serialización auto-JSON.</para>
  176. <para>El post procesamiento ocurre durante la rutina de la
  177. acción <methodname>postDispatch()</methodname>, y puede ser
  178. utilizada para ejecutar una lógica arbitraria. Como ejemplo,
  179. el contexto <acronym>JSON</acronym> utiliza un callback para
  180. determinar si la serialización auto-JSON está activada; si
  181. así fuera, serializa las variables de la vista a
  182. <acronym>JSON</acronym> y envía la respuesta, pero si
  183. no, re-habilita a ViewRenderer.</para>
  184. </listitem>
  185. </itemizedlist>
  186. <para> Hay una variedad de métodos para interactuar con contextos: </para>
  187. <itemizedlist>
  188. <listitem>
  189. <para>
  190. <methodname>addContext($context, array $spec)</methodname>:
  191. agrega un nuevo contexto. Lanza una excepción si el contexto
  192. ya existe. </para>
  193. </listitem>
  194. <listitem>
  195. <para>
  196. <methodname>setContext($context, array $spec)</methodname>:
  197. añade un nuevo contexto o sobrescribirá un contexto
  198. existente. Usa la misma especificación que
  199. <methodname>addContext()</methodname>. </para>
  200. </listitem>
  201. <listitem>
  202. <para>
  203. <methodname>addContexts(array $contexts)</methodname>: añade
  204. muchos contextos de una vez. El array
  205. <varname>$contexts</varname> debería ser un array
  206. de pares contexto/especificación. Si alguno de los contextos
  207. ya existe, arrojará una excepción. </para>
  208. </listitem>
  209. <listitem>
  210. <para>
  211. <methodname>setContexts(array $contexts)</methodname>: añade
  212. nuevos contextos y sobreescribe los existentes. Usa la misma
  213. especificación que <methodname>addContexts()</methodname>.
  214. </para>
  215. </listitem>
  216. <listitem>
  217. <para>
  218. <methodname>hasContext($context)</methodname>: devuelve
  219. <constant>TRUE</constant> si el contexto existe, <constant>FALSE</constant>
  220. de lo contrario. </para>
  221. </listitem>
  222. <listitem>
  223. <para>
  224. <methodname>getContext($context)</methodname>: recupera un
  225. único contexto por su nombre. Devuelve un array siguiendo la
  226. especificación usada en
  227. <methodname>addContext()</methodname>. </para>
  228. </listitem>
  229. <listitem>
  230. <para>
  231. <methodname>getContexts()</methodname>: recupera todos los
  232. contextos. Devuelve un array de pares
  233. contexto/especificación. </para>
  234. </listitem>
  235. <listitem>
  236. <para>
  237. <methodname>removeContext($context)</methodname>: elimina un
  238. único contexto por su nombre. Devuelve
  239. <constant>TRUE</constant> si tiene éxito, <constant>FALSE</constant> si el
  240. contexto no fue encontrado. </para>
  241. </listitem>
  242. <listitem>
  243. <para>
  244. <methodname>clearContexts()</methodname>: elimina todos los
  245. contextos. </para>
  246. </listitem>
  247. </itemizedlist>
  248. </sect4>
  249. <sect4 id="zend.controller.actionhelpers.contextswitch.actions">
  250. <title>Estableciendo los Contextos por Acción</title>
  251. <para> Hay dos mecanismos para establecer contextos disponibles. Puede
  252. crear manualmente los arrays en su controlador, o utilizar varios
  253. métodos en <emphasis>ContextSwitch</emphasis> para ensamblarlos. </para>
  254. <para> El método principal para añadir relaciones acción/contexto es
  255. <methodname>addActionContext()</methodname>. Se esperan dos
  256. argumentos, la acción a la que el contexto se añade, y el nombre de
  257. un contexto o un array de contextos. Como ejemplo, considere la
  258. siguiente clase controlador: </para>
  259. <programlisting language="php"><![CDATA[
  260. class FooController extends Zend_Controller_Action
  261. {
  262. public function listAction()
  263. {
  264. }
  265. public function viewAction()
  266. {
  267. }
  268. public function commentsAction()
  269. {
  270. }
  271. public function updateAction()
  272. {
  273. }
  274. }
  275. ]]></programlisting>
  276. <para> Supongamos que queremos añadir un contexto <acronym>XML</acronym>
  277. a la acción 'list', y contextos <acronym>XML</acronym> y
  278. <acronym>JSON</acronym> a la acción 'comments'. Podríamos
  279. hacerlo en el método <methodname>init()</methodname>: </para>
  280. <programlisting language="php"><![CDATA[
  281. class FooController extends Zend_Controller_Action
  282. {
  283. public function init()
  284. {
  285. $this->_helper->contextSwitch()
  286. ->addActionContext('list', 'xml')
  287. ->addActionContext('comments', array('xml', 'json'))
  288. ->initContext();
  289. }
  290. }
  291. ]]></programlisting>
  292. <para> Alternativamente, puede simplemente definir la propiedad del
  293. array <varname>$context</varname>: </para>
  294. <programlisting language="php"><![CDATA[
  295. class FooController extends Zend_Controller_Action
  296. {
  297. public $contexts = array(
  298. 'list' => array('xml'),
  299. 'comments' => array('xml', 'json')
  300. );
  301. public function init()
  302. {
  303. $this->_helper->contextSwitch()->initContext();
  304. }
  305. }
  306. ]]></programlisting>
  307. <para> El anterior es el menos sobrecargado, pero también está expuesto
  308. a posibles errores. </para>
  309. <para> Los siguientes métodos pueden ser utilizados para construir los
  310. mapeos del contexto: </para>
  311. <itemizedlist>
  312. <listitem>
  313. <para>
  314. <methodname>addActionContext($action,
  315. $context)</methodname>: marca uno o más contextos como
  316. disponibles para una acción. Si ya existen los mapeos,
  317. simplemente se añade a esos mapeos.
  318. <methodname>$context</methodname> puede ser un único
  319. contexto, o un array de contextos. </para>
  320. <para> Un valor de <constant>TRUE</constant> para el
  321. contexto marcará todos los contextos como disponibles para
  322. la acción. </para>
  323. <para> Un valor vacío de $contexto desactivará todos los
  324. contextos para la acción determinada. </para>
  325. </listitem>
  326. <listitem>
  327. <para>
  328. <methodname>setActionContext($action,
  329. $context)</methodname>: marca uno o más contextos como
  330. disponibles para una acción. Si el mapeo ya existe, se
  331. reemplaza con los especificados.
  332. <methodname>$context</methodname> puede ser un único
  333. contexto, o un array de contextos. </para>
  334. </listitem>
  335. <listitem>
  336. <para>
  337. <methodname>addActionContexts(array $contexts)</methodname>:
  338. agrega varios pares acción/contexto de una vez.
  339. <varname>$contexts</varname> debe ser un array
  340. asociativo de pares acción/contexto. Le pasa la petición a
  341. <methodname>addActionContext()</methodname>, lo que
  342. significa que si los emparejamientos ya existen, se añade a
  343. ellos. </para>
  344. </listitem>
  345. <listitem>
  346. <para>
  347. <methodname>setActionContexts(array $contexts)</methodname>:
  348. actúa como <methodname>addActionContexts()</methodname>,
  349. pero sobreescribe pares de acción/contexto existentes.
  350. </para>
  351. </listitem>
  352. <listitem>
  353. <para>
  354. <methodname>hasActionContext($action,
  355. $context)</methodname>: determina si una acción particular
  356. tiene un contexto determinado. </para>
  357. </listitem>
  358. <listitem>
  359. <para>
  360. <methodname>getActionContexts($action = null)</methodname>:
  361. devuelve o todos los contextos para una acción determinada,
  362. o todos los pares de acción/contexto. </para>
  363. </listitem>
  364. <listitem>
  365. <para>
  366. <methodname>removeActionContext($action,
  367. $context)</methodname>: elimina uno o más contextos de
  368. una acción determinada. <methodname>$context</methodname>
  369. puede ser un único contexto o un array de contextos. </para>
  370. </listitem>
  371. <listitem>
  372. <para>
  373. <methodname>clearActionContexts($action =
  374. null)</methodname>: elimina todos los contextos de una
  375. acción determinada, o de todas las acciones con contextos.
  376. </para>
  377. </listitem>
  378. </itemizedlist>
  379. </sect4>
  380. <sect4 id="zend.controller.actionhelpers.contextswitch.initcontext">
  381. <title>Inicializando Conmutación de Contextos (Context
  382. Switching)</title>
  383. <para> Para inicializar la conmutación de contexto, necesita llamar a
  384. <methodname>initContext()</methodname> en su controlador de
  385. acción: </para>
  386. <programlisting language="php"><![CDATA[
  387. class NewsController extends Zend_Controller_Action
  388. {
  389. public function init()
  390. {
  391. $this->_helper->contextSwitch()->initContext();
  392. }
  393. }
  394. ]]></programlisting>
  395. <para> En algunos casos, puede querer forzar el contexto utilizado; por
  396. ejemplo, puede que sólo quiera permitir el contexto XML si la
  397. conmutación de contexto está activada. Puede hacerlo pasando el
  398. contexto a <methodname>initContext()</methodname>: </para>
  399. <programlisting language="php"><![CDATA[
  400. $contextSwitch->initContext('xml');
  401. ]]></programlisting>
  402. </sect4>
  403. <sect4 id="zend.controller.actionhelpers.contextswitch.misc">
  404. <title>Funcionalidad Adicional</title>
  405. <para> Se pueden utilizar una variedad de métodos para alterar el
  406. comportamiento del ayudante <emphasis>ContextSwitch</emphasis>.
  407. Estos incluyen: </para>
  408. <itemizedlist>
  409. <listitem>
  410. <para>
  411. <methodname>setAutoJsonSerialization($flag)</methodname>:
  412. Por defecto, los contextos <acronym>JSON</acronym>
  413. serializarán cualquier variable de vista a notación
  414. <acronym>JSON</acronym> y lo devolverán como una
  415. respuesta. Si usted desea crear su propia respuesta, debe
  416. deshabilitar esta opción; esto debe hacerse antes de llamar
  417. a <methodname>initContext()</methodname>. </para>
  418. <programlisting language="php"><![CDATA[
  419. $contextSwitch->setAutoJsonSerialization(false);
  420. $contextSwitch->initContext();
  421. ]]></programlisting>
  422. <para> Puede recuperar el valor del flag con
  423. <methodname>getAutoJsonSerialization()</methodname>.
  424. </para>
  425. </listitem>
  426. <listitem>
  427. <para>
  428. <methodname>setSuffix($context, $suffix,
  429. $prependViewRendererSuffix)</methodname>: Con este
  430. método, puede especificar un sufijo diferente para
  431. utilizarlo en un contexto determinado. El tercer argumento
  432. es utilizado para indicar si anteponer o no el actual sufijo
  433. de ViewRenderer con el nuevo sufijo; este flag está activado
  434. por defecto. </para>
  435. <para> Pasando un valor vacío para el sufijo hará que sólo el
  436. sufijo ViewRenderer será utilizado. </para>
  437. </listitem>
  438. <listitem>
  439. <para>
  440. <methodname>addHeader($context, $header,
  441. $content)</methodname>: Añadir una cabecera de respuesta
  442. para un determinado contexto.
  443. <varname>$header</varname> es el nombre de la
  444. cabecera, y <varname>$content</varname> es el valor a
  445. pasar por esa cabecera. </para>
  446. <para> Cada contexto pueden tener múltiples cabeceras;
  447. <methodname>addHeader()</methodname> agrega cabeceras
  448. adicionales al stack de cabecera del contexto. </para>
  449. <para> Si el <varname>$header</varname> especificado ya
  450. existe para el contexto, arrojará una excepción. </para>
  451. </listitem>
  452. <listitem>
  453. <para>
  454. <methodname>setHeader($context, $header,
  455. $content)</methodname>:
  456. <methodname>setHeader()</methodname> actúa igual que
  457. <methodname>addHeader()</methodname>, excepto que le
  458. permite sobreescribir cabeceras del contexto actual. </para>
  459. </listitem>
  460. <listitem>
  461. <para>
  462. <methodname>addHeaders($context, array
  463. $headers)</methodname>: Añade varias cabeceras de una
  464. vez a un determinado contexto. Delega a
  465. <methodname>addHeader()</methodname>, así que si la
  466. cabecera ya existe, arrojará una excepción.
  467. <methodname>$headers</methodname> es un array de pares
  468. cabecera/contexto. </para>
  469. </listitem>
  470. <listitem>
  471. <para>
  472. <methodname>setHeaders($context, array
  473. $headers.)</methodname>: como
  474. <methodname>addHeaders()</methodname>, excepto que lo
  475. delegua a <methodname>setHeader()</methodname>,
  476. permitiéndole sobreescribir las cabeceras existentes.
  477. </para>
  478. </listitem>
  479. <listitem>
  480. <para>
  481. <methodname>getHeader($context, $header)</methodname>:
  482. recuperar el valor de una cabecera para un determinado
  483. contexto. Retorna null si no existe. </para>
  484. </listitem>
  485. <listitem>
  486. <para>
  487. <methodname>removeHeader($context, $header)</methodname>:
  488. eliminar una única cabecera para un determinado contexto.
  489. </para>
  490. </listitem>
  491. <listitem>
  492. <para>
  493. <methodname>clearHeaders($context, $header)</methodname>:
  494. eliminar todas las cabeceras para un determinado contexto.
  495. </para>
  496. </listitem>
  497. <listitem>
  498. <para>
  499. <methodname>setCallback($context, $trigger,
  500. $callback)</methodname>: establecer un callback en un
  501. determinado disparador para poner en marcha un determinado
  502. contexto. Los disparadores pueden ser 'init' o 'post'
  503. (indicando que se llamará a un callback para cada contexto
  504. de inicialización o postDispatch).
  505. <methodname>$callback</methodname> debe ser un callback
  506. válido de <acronym>PHP</acronym>. </para>
  507. </listitem>
  508. <listitem>
  509. <para>
  510. <methodname>setCallbacks($context, array
  511. $callbacks)</methodname>: establece varios callbacks
  512. para un determinado contexto.
  513. <methodname>$callbacks</methodname> deben ser pares de
  514. diparadores/callbacks. En realidad, la mayor cantidad de
  515. callbacks que pueden ser registrados son dos, uno para la
  516. inicialización y otro para el procesamiento posterior.
  517. </para>
  518. </listitem>
  519. <listitem>
  520. <para>
  521. <methodname>getCallback($context, $trigger)</methodname>:
  522. recuperar un callback para un determinado disparador en un
  523. contexto dado. </para>
  524. </listitem>
  525. <listitem>
  526. <para>
  527. <methodname>getCallbacks($context)</methodname>: recupera
  528. todos los callbacks para un determinado contexto. Devuelve
  529. un array de pares disparor/callback. </para>
  530. </listitem>
  531. <listitem>
  532. <para>
  533. <methodname>removeCallback($context, $trigger)</methodname>:
  534. elimina un callback para un determinado disparador y
  535. contexto. </para>
  536. </listitem>
  537. <listitem>
  538. <para>
  539. <methodname>clearCallbacks($context)</methodname>: elimina
  540. todos los callbacks para un determinado contexto. </para>
  541. </listitem>
  542. <listitem>
  543. <para>
  544. <methodname>setContextParam($name)</methodname>: establece
  545. el parámetro de petición para comprobar si un conmutador de
  546. contexto ha sido solicitado. El valor por defecto es
  547. 'format', pero este accededor puede ser utilizado para
  548. establecer un valor alternativo. </para>
  549. <para>
  550. <methodname>getContextParam()</methodname> puede ser
  551. utilizado para recuperar el valor actual. </para>
  552. </listitem>
  553. <listitem>
  554. <para>
  555. <methodname>setAutoDisableLayout($flag)</methodname>: Por
  556. defecto, los esquemas están deshabilitados cuando sucede una
  557. conmutación de contexto; esto es porque normalmente los
  558. esquemas sólo serán utilizados para devolver respuestas
  559. normales, y no tienen sentido en otros contextos. Sin
  560. embargo, si desea usar esquemas (tal vez puede tener un
  561. diseño para el nuevo contexto), puede cambiar este
  562. comportamiento pasando un valor falso a
  563. <methodname>setAutoDisableLayout()</methodname>. Usted
  564. debería hacer esto <emphasis>antes</emphasis> de llamar a
  565. <methodname>initContext()</methodname>. </para>
  566. <para> Para conseguir el valor de este flag, utilice el
  567. accededor <methodname>getAutoDisableLayout()</methodname>.
  568. </para>
  569. </listitem>
  570. <listitem>
  571. <para>
  572. <methodname>getCurrentContext()</methodname> Puede ser
  573. utilizado para determinar qué contexto fue detectado, si hay
  574. alguno. Este retorna null si no hubo conmutación de
  575. contexto, o si <methodname>initContext()</methodname> fue
  576. llamado antes de ser invocado. </para>
  577. </listitem>
  578. </itemizedlist>
  579. </sect4>
  580. <sect4 id="zend.controller.actionhelpers.contextswitch.ajaxcontext">
  581. <title>Funcionalidad de AjaxContext</title>
  582. <para> El ayudante <emphasis>AjaxContext</emphasis> extiende
  583. <emphasis>ContextSwitch</emphasis>, así que toda de la
  584. funcionalidad listada para <emphasis>ContextSwitch</emphasis>
  585. está disponible. Hay algunas diferencias fundamentales, sin embargo. </para>
  586. <para> En primer lugar, el controlador de acción utiliza una propiedad
  587. diferente para determinar contextos,
  588. <methodname>$ajaxable</methodname>. Esto es, que puede tener
  589. diferentes contextos utilizados para <acronym>AJAX</acronym> versus
  590. peticiones normales <acronym>HTTP</acronym>. Los diversos métodos
  591. <methodname>*ActionContext*()</methodname> de
  592. <emphasis>AjaxContext</emphasis> le escribirán a esta
  593. propiedad. </para>
  594. <para> En segundo lugar, sólo se disparará si se produjo un
  595. XmlHttpRequest, según lo determinado por la solicitud del método del
  596. objeto <methodname>isXmlHttpRequest()</methodname>. Así, si se pasa
  597. el parámetro de contexto ('format') en la solicitud, pero la
  598. solicitud no fue hecha como un XmlHttpRequest, no se disparará
  599. ninguna conmutación de contexto. </para>
  600. <para> En tercer lugar, <emphasis>AjaxContext</emphasis> agrega un
  601. contexto adicional, HTML. En este contexto, se establece el sufijo a
  602. '<filename>ajax.phtml</filename>' para diferenciar el contexto de una solicitud normal.
  603. No se devuelven cabeceras adicionales. </para>
  604. <example
  605. id="zend.controller.actionhelpers.contextswitch.ajaxcontext.example">
  606. <title>Permitiendo a las Acciones Responder a Requerimientos
  607. Ajax</title>
  608. <para> En el siguiente ejemplo, estamos permitiendo requerimientos a
  609. las acciones 'view', 'form', y 'process' para responder a
  610. peticiones <acronym>AJAX</acronym>. En los dos primeros casos,
  611. 'view' y 'form', devolveremos fragmentos (snippets) de HTML con
  612. los cuales actualizaremos la página; y en el último,
  613. devolveremos <acronym>JSON</acronym>. </para>
  614. <programlisting language="php"><![CDATA[
  615. class CommentController extends Zend_Controller_Action
  616. {
  617. public function init()
  618. {
  619. $ajaxContext = $this->_helper->getHelper('AjaxContext');
  620. $ajaxContext->addActionContext('view', 'html')
  621. ->addActionContext('form', 'html')
  622. ->addActionContext('process', 'json')
  623. ->initContext();
  624. }
  625. public function viewAction()
  626. {
  627. // Tirar para ver un único comentario.
  628. // Cuando se detecta AjaxContext, utiliza el script de vista
  629. // comment/view.ajax.phtml.
  630. }
  631. public function formAction()
  632. {
  633. // Mostrar el form "add new comment".
  634. // Cuando se detecta AjaxContext, utiliza el script de vista
  635. // comment/form.ajax.phtml.
  636. }
  637. public function processAction()
  638. {
  639. // Procesar un nuevo comentario
  640. // Devolver los resultados como JSON; simplemente asignar los
  641. // resultados como variables de la vista, y se devolverán como JSON.
  642. }
  643. }
  644. ]]></programlisting>
  645. <para> En el lado del cliente, su biblioteca <acronym>AJAX</acronym>
  646. simplemente pedirá los parámetros finales '<filename>/comment/view</filename>',
  647. '<filename>/comment/form</filename>', y '<filename>/comment/process</filename>', y pasar el parámetro
  648. 'format': '<filename>/comment/view/format/html</filename>',
  649. '<filename>/comment/form/format/html</filename>', '<filename>/comment/process/format/json</filename>'. (O
  650. puede pasar el parámetro via string de consulta: ejemplo
  651. "?format=json"). </para>
  652. <para> Asumiendo que su biblioteca pasa la cabecera
  653. 'X-Requested-With:XmlHttpRequest' entonces estas acciones
  654. devolverán la respuesta en el formato apropiado. </para>
  655. </example>
  656. </sect4>
  657. </sect3>