Zend_Controller-ActionHelpers-ContextSwitch.xml 31 KB

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