Zend_Controller-ActionHelpers-ContextSwitch.xml 37 KB

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