Zend_Controller-ActionHelpers-ContextSwitch.xml 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!-- EN-Revision: 15617 -->
  3. <!-- Reviewed: no -->
  4. <sect3 id="zend.controller.actionhelpers.contextswitch">
  5. <title>ContextSwitch et AjaxContext</title>
  6. <para>
  7. L'aide d'action <code>ContextSwitch</code> est destinée à faciliter le retour de
  8. différents formats de réponse à une requête.L'<code>AjaxContext</code> est une aide
  9. spécialisée de <code>ContextSwitch</code> qui permet le renvoi de réponses à
  10. XmlHttpRequest.
  11. </para>
  12. <para>
  13. Pour l'activer, vous devez indiquer à votre contrôleur quelles actions répondent à
  14. quel contexte. Si une requête d'entrée indique un contexte valide pour une action, alors
  15. l'aide d'action en charge&#160;:
  16. </para>
  17. <itemizedlist>
  18. <listitem>
  19. <para>
  20. Va désactiver les Layouts, si elles sont activées
  21. (<classname>Zend_Layout</classname>).
  22. </para>
  23. </listitem>
  24. <listitem>
  25. <para>
  26. Va changer le suffixe de la vue à rendre, il faudra donc créer une vue par
  27. contexte.
  28. </para>
  29. </listitem>
  30. <listitem>
  31. <para>
  32. Va envoyer les bons en-têtes de réponse en fonction du contexte désiré.
  33. </para>
  34. </listitem>
  35. <listitem>
  36. <para>
  37. Va éventuellement en option appeler des fonctions pour configurer le
  38. contexte, ou des fonctions de post-processing.
  39. </para>
  40. </listitem>
  41. </itemizedlist>
  42. <para>Comme exemple, prenons le contrôleur suivant&#160;:</para>
  43. <programlisting language="php"><![CDATA[
  44. class NewsController extends Zend_Controller_Action
  45. {
  46. /**
  47. * page d'arrivée; forward vers listAction()
  48. */
  49. public function indexAction()
  50. {
  51. $this->_forward('list');
  52. }
  53. /**
  54. * Liste les news
  55. */
  56. public function listAction()
  57. {
  58. }
  59. /**
  60. * Affiche une new particulière
  61. */
  62. public function viewAction()
  63. {
  64. }
  65. }
  66. ]]></programlisting>
  67. <para>
  68. Imaginons que nous voulions que <code>listAction()</code> soit aussi accessible au
  69. format XML. Plutôt que de créer une autre action, nous pouvons lui indiquer qu'elle doit
  70. retourner du XML&#160;:
  71. </para>
  72. <programlisting language="php"><![CDATA[
  73. class NewsController extends Zend_Controller_Action
  74. {
  75. public function init()
  76. {
  77. $contextSwitch = $this->_helper->getHelper('contextSwitch');
  78. $contextSwitch->addActionContext('list', 'xml')
  79. ->initContext();
  80. }
  81. // ...
  82. }
  83. ]]></programlisting>
  84. <para>Ce code aura pour effet&#160;:</para>
  85. <itemizedlist>
  86. <listitem>
  87. <para>De changer le "Content-Type" de la réponse en "text/xml".</para>
  88. </listitem>
  89. <listitem>
  90. <para>
  91. De changer le suffixe de vue vers "xml.phtml" (ou un autre suffixe si vous en
  92. utilisez un personnalisé "xml.[votre suffixe]").
  93. </para>
  94. </listitem>
  95. </itemizedlist>
  96. <para>
  97. Il est donc nécessaire de créer un nouveau script de vue, "news/list.xml.phtml", qui
  98. créera et rendra le XML.
  99. </para>
  100. <para>
  101. Pour savoir si la requête doit utiliser un contexte switch, l'aide vérifie un jeton
  102. dans l'objet de requête. Par défaut, l'aide va chercher le paramètre de requête "format",
  103. ceci peut être changé. Ceci signifie que dans la plupart des cas, pour changer le contexte
  104. d'une réponse, il faut simplement injecter un paramètre "format" à la requête:
  105. </para>
  106. <itemizedlist>
  107. <listitem>
  108. <para>
  109. Via l'URL&#160;: <code>/news/list/format/xml</code> (le routeur par défaut utilise
  110. les paramètres dans ce style : {...}/action/parametre/valeur)
  111. </para>
  112. </listitem>
  113. <listitem>
  114. <para>Via un paramètre GET&#160;: <code>/news/list?format=xml</code></para>
  115. </listitem>
  116. </itemizedlist>
  117. <para>
  118. <code>ContextSwitch</code> vous permet d'écrire des contextes, ceux-ci spécifient le
  119. suffixe de vue qui change, les en-têtes HTTP de réponse à modifier, et les fonctions de
  120. rappel éventuelles.
  121. </para>
  122. <sect4 id="zend.controller.actionhelpers.contextswitch.contexts">
  123. <title>Contextes inclus par défaut</title>
  124. <para>
  125. Par défaut, il existe 2 contextes dans l'aide <code>ContextSwitch</code>&#160;: json
  126. et xml.
  127. </para>
  128. <itemizedlist>
  129. <listitem>
  130. <para>
  131. <emphasis>JSON</emphasis>. Le contexte JSON met le "Content-Type" de la
  132. réponse à "application/json", et le suffixe de la vue est "json.phtml".
  133. </para>
  134. <para>
  135. Par défaut cependant, aucun script de vue n'est nécessaire, il va
  136. simplement sérialiser en JSON toutes les variables de vues, et les envoyer en
  137. tant que réponse.
  138. </para>
  139. <para>
  140. Ce comportement peut être désactivé en passant le paramètre de
  141. sérialisation à <code>false</code>&#160;:
  142. </para>
  143. <programlisting language="php"><![CDATA[
  144. $this->_helper->contextSwitch()->setAutoJsonSerialization(false);
  145. ]]></programlisting>
  146. </listitem>
  147. <listitem>
  148. <para>
  149. <emphasis>XML</emphasis>. Le contexte XML met le "Content-Type" de la
  150. réponse à "text/xml", et utilise un suffixe de vue "xml.phtml". Vous devrez
  151. créer une nouvelle vue pour ce contexte.
  152. </para>
  153. </listitem>
  154. </itemizedlist>
  155. </sect4>
  156. <sect4 id="zend.controller.actionhelpers.contextswitch.custom">
  157. <title>Créer ses propres contextes</title>
  158. <para>
  159. Vous pouvez créer vos propres contextes d'action. Par exemple pour retourner du
  160. YAML, du PHP sérialisé, ou encore du RSS ou du ATOM. <code>ContextSwitch</code> est là
  161. pour cela.
  162. </para>
  163. <para>
  164. La manière la plus simple d'ajouter un nouveau contexte d'action est la méthode
  165. <code>addContext()</code>. Elle prend 2 paramètres : le nom du contexte, et un tableau
  166. d'options. Ce tableau d'option doit comporter au moins une des clés suivantes&#160;:
  167. </para>
  168. <itemizedlist>
  169. <listitem>
  170. <para>
  171. <emphasis>suffix</emphasis>&#160;: Le préfixe qui va s'ajouter au suffixe de
  172. vue. Il sera utiliser par le ViewRenderer.
  173. </para>
  174. </listitem>
  175. <listitem>
  176. <para>
  177. <emphasis>headers</emphasis>&#160;: un tableau d'en-têtes/valeurs que vous
  178. voulez ajouter à la réponse.
  179. </para>
  180. </listitem>
  181. <listitem>
  182. <para>
  183. <emphasis>callbacks</emphasis>&#160;: un tableau dont les clés peuvent être
  184. "init" ou "post", et les valeurs représentent des noms de fonctions PHP
  185. valides, qui seront utilisées pour initialiser ou traiter la fin du
  186. contexte.
  187. </para>
  188. <para>
  189. Les fonctions d'initialisation interviennent lorsque le contexte est
  190. détecté par <code>ContextSwitch</code>. Par exemple dans le contexte intégré
  191. JSON, la fonction désactive le ViewRenderer lorsque la sérialisation
  192. automatique est activée.
  193. </para>
  194. <para>
  195. Les fonctions de traitement de fin de contexte (Post processing)
  196. interviennent durant le processus de <code>postDispatch()</code> de l'action en
  197. cours. Par exemple pour le contexte intégré JSON, la fonction de post process
  198. regarde si la sérialisation automatique est demandée, si c'est le cas, elle va
  199. sérialiser les variables de la vue en JSON, et envoyer la réponse; mais dans le
  200. cas contraire, elle va réactiver le ViewRenderer.
  201. </para>
  202. </listitem>
  203. </itemizedlist>
  204. <para>Voici les méthodes d'interaction avec les contextes&#160;:</para>
  205. <itemizedlist>
  206. <listitem>
  207. <para>
  208. <code>addContext($context, array $spec)</code>&#160;: Ajoute un nouveau
  209. contexte. Si celui-ci existe déjà, une exception sera lancée.
  210. </para>
  211. </listitem>
  212. <listitem>
  213. <para>
  214. <code>setContext($context, array $spec)</code>&#160;: Ajoute un nouveau
  215. contexte, mais écrase celui-ci s'il existait déjà. Utilise les mêmes
  216. spécifications que <code>addContext()</code>.
  217. </para>
  218. </listitem>
  219. <listitem>
  220. <para>
  221. <code>addContexts(array $contexts)</code>&#160;: Ajoute plusieurs contextes
  222. d'un coup. Le tableau <code>$contexts</code> doit être un tableau de paires
  223. contexte/specifications. Si un des contextes existe déjà, une exception est
  224. lancée.
  225. </para>
  226. </listitem>
  227. <listitem>
  228. <para>
  229. <code>setContexts(array $contexts)</code>&#160;: Ajoute des nouveaux contextes,
  230. mais écrase ceux déjà présents éventuellement. Utilise les mêmes spécifications
  231. que <code>addContexts()</code>.
  232. </para>
  233. </listitem>
  234. <listitem>
  235. <para>
  236. <code>hasContext($context)</code>&#160;: retourne <code>true</code> si le
  237. contexte existe déjà, <code>false</code> sinon.
  238. </para>
  239. </listitem>
  240. <listitem>
  241. <para>
  242. <code>getContext($context)</code>&#160;: retourne un contexte par son nom. Le
  243. retour est un tableau qui a la même syntaxe que celui utilisé par
  244. <code>addContext()</code>.
  245. </para>
  246. </listitem>
  247. <listitem>
  248. <para>
  249. <code>getContexts()</code>&#160;: retourne tous les contextes. Le tableau de
  250. retour est de la forme contexte =&gt; spécifications.
  251. </para>
  252. </listitem>
  253. <listitem>
  254. <para>
  255. <code>removeContext($context)</code>&#160;: Supprime un contexte grâce à son
  256. nom. Retourne <code>true</code> si réussi, <code>false</code> si le contexte
  257. n'a pas été trouvé.
  258. </para>
  259. </listitem>
  260. <listitem>
  261. <para><code>clearContexts()</code>&#160;: Supprime tous les contextes.</para>
  262. </listitem>
  263. </itemizedlist>
  264. </sect4>
  265. <sect4 id="zend.controller.actionhelpers.contextswitch.actions">
  266. <title>Affecter des contextes par action</title>
  267. <para>
  268. Il existe deux mécanismes pour créer et affecter des contextes. Vous pouvez créer
  269. des tableaux dans vos contrôleurs, ou utiliser plusieurs méthodes de
  270. <code>ContextSwitch</code> pour les assembler.
  271. </para>
  272. <para>
  273. La méthode principale pour ajouter des contextes à des actions est
  274. <code>addActionContext()</code>. Elle attend 2 arguments, l'action et le contexte (ou
  275. un tableau de contextes). Par exemple, considérons la classe suivante&#160;:
  276. </para>
  277. <programlisting language="php"><![CDATA[
  278. class FooController extends Zend_Controller_Action
  279. {
  280. public function listAction()
  281. {
  282. }
  283. public function viewAction()
  284. {
  285. }
  286. public function commentsAction()
  287. {
  288. }
  289. public function updateAction()
  290. {
  291. }
  292. }
  293. ]]></programlisting>
  294. <para>
  295. Imaginons que nous voulions ajouter un contexte XML à l'action "list", et deux
  296. contextes XML et JSON à l'action "comments". Nous pourrions faire ceci dans la méthode
  297. <code>init()</code>&#160;:
  298. </para>
  299. <programlisting language="php"><![CDATA[
  300. class FooController extends Zend_Controller_Action
  301. {
  302. public function init()
  303. {
  304. $this->_helper->contextSwitch()
  305. ->addActionContext('list', 'xml')
  306. ->addActionContext('comments', array('xml', 'json'))
  307. ->initContext();
  308. }
  309. }
  310. ]]></programlisting>
  311. <para>
  312. De la même manière, il est aussi possible de simplement définir la propriété
  313. <code>$contexts</code>&#160;:
  314. </para>
  315. <programlisting language="php"><![CDATA[
  316. class FooController extends Zend_Controller_Action
  317. {
  318. public $contexts = array(
  319. 'list' => array('xml'),
  320. 'comments' => array('xml', 'json')
  321. );
  322. public function init()
  323. {
  324. $this->_helper->contextSwitch()->initContext();
  325. }
  326. }
  327. ]]></programlisting>
  328. <para>Cette syntaxe est simplement moins pratique et plus prompte aux erreurs.</para>
  329. <para>Pour construire vos contextes, les méthodes suivantes vous seront utiles&#160;:</para>
  330. <itemizedlist>
  331. <listitem>
  332. <para>
  333. <code>addActionContext($action, $context)</code>&#160;: Ajoute un ou plusieurs
  334. contextes à une action. <code>$context</code> doit donc être une chaîne, ou un
  335. tableau de chaînes.
  336. </para>
  337. <para>
  338. Passer la valeur <code>true</code> comme contexte marquera tous les
  339. contextes comme disponibles pour cette action.
  340. </para>
  341. <para>
  342. Une valeur vide pour <code>$context</code> désactivera tous les contextes
  343. donnés à cette action.
  344. </para>
  345. </listitem>
  346. <listitem>
  347. <para>
  348. <code>setActionContext($action, $context)</code>&#160;: Marque un ou plusieurs
  349. contextes comme disponibles pour cette action. Si ceux-ci existent déjà, ils
  350. seront remplacés. <code>$context</code> doit être une chaîne ou un tableau de
  351. chaînes.
  352. </para>
  353. </listitem>
  354. <listitem>
  355. <para>
  356. <code>addActionContexts(array $contexts)</code>&#160;: Ajoute plusieurs paires
  357. action/context en une fois. <code>$contexts</code> doit être un tableau
  358. associatif action/contexte. Cette méthode proxie vers
  359. <code>addActionContext()</code>.
  360. </para>
  361. </listitem>
  362. <listitem>
  363. <para>
  364. <code>setActionContexts(array $contexts)</code>&#160;: agit comme
  365. <code>addActionContexts()</code>, mais écrase les paires action/contexte
  366. existantes.
  367. </para>
  368. </listitem>
  369. <listitem>
  370. <para>
  371. <code>hasActionContext($action, $context)</code>&#160;: détermine si une action
  372. possède un contexte donné.
  373. </para>
  374. </listitem>
  375. <listitem>
  376. <para>
  377. <code>getActionContexts($action = null)</code>&#160;: Retourne tous les
  378. contextes d'une action donnée, si pas d'action passée, retourne alors toutes
  379. les paires action/contexte.
  380. </para>
  381. </listitem>
  382. <listitem>
  383. <para>
  384. <code>removeActionContext($action, $context)</code>&#160;: Supprime un ou
  385. plusieurs contextes pour une action. <code>$context</code> doit être une chaîne
  386. ou un tableau de chaînes.
  387. </para>
  388. </listitem>
  389. <listitem>
  390. <para>
  391. <code>clearActionContexts($action = null)</code>&#160;: Supprime tous les
  392. contextes d'une action. Si aucune action n'est spécifiée, supprime alors tous
  393. les contextes de toutes les actions.
  394. </para>
  395. </listitem>
  396. </itemizedlist>
  397. </sect4>
  398. <sect4 id="zend.controller.actionhelpers.contextswitch.initcontext">
  399. <title>Initialiser le Context Switch</title>
  400. <para>
  401. Pour initialiser la permutation de contextes (contexte switching), vous devez
  402. appeler <code>initContext()</code> dans vos contrôleurs d'action&#160;:
  403. </para>
  404. <programlisting language="php"><![CDATA[
  405. class NewsController extends Zend_Controller_Action
  406. {
  407. public function init()
  408. {
  409. $this->_helper->contextSwitch()->initContext();
  410. }
  411. }
  412. ]]></programlisting>
  413. <para>
  414. Dans certains cas, vous voudriez forcer un contexte pour une action et
  415. n'autoriser que celui-ci. Passez le alors à <code>initContext()</code>&#160;:
  416. </para>
  417. <programlisting language="php"><![CDATA[
  418. $contextSwitch->initContext('xml');
  419. ]]></programlisting>
  420. </sect4>
  421. <sect4 id="zend.controller.actionhelpers.contextswitch.misc">
  422. <title>Fonctionnalités avancées</title>
  423. <para>
  424. Voici quelques méthodes qui peuvent être utilisées pour changer le comportement
  425. de l'aide <code>ContextSwitch</code>&#160;:
  426. </para>
  427. <itemizedlist>
  428. <listitem>
  429. <para>
  430. <code>setAutoJsonSerialization($flag)</code>: Par défaut, le contexte
  431. JSON va sérialiser toute variable en notation JSON et les retourner en tant que
  432. réponse. Si vous voulez créer votre propre réponse, vous voudriez désactiver
  433. cet effet. Ceci doit être fait avant l'appel à <code>initContext()</code>.
  434. </para>
  435. <programlisting language="php"><![CDATA[
  436. $contextSwitch->setAutoJsonSerialization(false);
  437. $contextSwitch->initContext();
  438. ]]></programlisting>
  439. <para>
  440. Pour récupérer la valeur actuelle, utilisez
  441. <code>getAutoJsonSerialization()</code>.
  442. </para>
  443. </listitem>
  444. <listitem>
  445. <para>
  446. <code>setSuffix($context, $suffix, $prependViewRendererSuffix)</code>:
  447. Cette méthode permet de personnaliser le suffixe de vue d'un contexte. Le
  448. troisième argument indique si le suffixe actuel du ViewRenderer doit être
  449. utilisé comme préfixe de votre suffixe. Par défaut, c'est le cas.
  450. </para>
  451. <para>
  452. Passer une valeur vide au suffixe aura pour effet de n'utiliser que le
  453. suffixe du ViewRenderer.
  454. </para>
  455. </listitem>
  456. <listitem>
  457. <para>
  458. <code>addHeader($context, $header, $content)</code>&#160;: Ajoute un en-tête à
  459. la réponse pour un contexte donné. <code>$header</code> est le nom de l'en-tête
  460. et <code>$content</code> sa valeur.
  461. </para>
  462. <para>
  463. Chaque contexte peut posséder plusieurs en-têtes, <code>addHeader()</code>
  464. ajoute des en-têtes dans une pile, pour un contexte donné.
  465. </para>
  466. <para>
  467. Si l'en-tête spécifié pour le contexte existe déjà, une exception sera
  468. alors levée.
  469. </para>
  470. </listitem>
  471. <listitem>
  472. <para>
  473. <code>setHeader($context, $header, $content)</code>&#160;:
  474. <code>setHeader()</code> agit comme <code>addHeader()</code>, sauf qu'il va
  475. écraser un en-tête qui aurait déjà été présent.
  476. </para>
  477. </listitem>
  478. <listitem>
  479. <para>
  480. <code>addHeaders($context, array $headers)</code>&#160;: Ajoute plusieurs
  481. en-têtes en une seule fois. Proxie vers
  482. <code>addHeader()</code>.<code>$headers</code> est un tableau de paires header
  483. =&gt; contexte.
  484. </para>
  485. </listitem>
  486. <listitem>
  487. <para>
  488. <code>setHeaders($context, array $headers.)</code>&#160;: comme
  489. <code>addHeaders()</code>, sauf que cette méthode proxie vers
  490. <code>setHeader()</code>, vous permettant d'écraser des en-têtes déjà
  491. présents.
  492. </para>
  493. </listitem>
  494. <listitem>
  495. <para>
  496. <code>getHeader($context, $header)</code>&#160;: retourne une valeur d'en-tête
  497. pour un contexte. Retourne <code>null</code> si non trouvé.
  498. </para>
  499. </listitem>
  500. <listitem>
  501. <para>
  502. <code>removeHeader($context, $header)</code>&#160;: supprime un en-tête d'un
  503. contexte.
  504. </para>
  505. </listitem>
  506. <listitem>
  507. <para>
  508. <code>clearHeaders($context, $header)</code>&#160;: supprime tous les en-têtes
  509. d'un contexte.
  510. </para>
  511. </listitem>
  512. <listitem>
  513. <para>
  514. <code>setCallback($context, $trigger, $callback)</code>&#160;: affecte une
  515. fonction de rappel (callback) pour un contexte. <code>$trigger</code> peut être
  516. soit "init" ou "post" (la fonction de rappel sera appelée soit à
  517. l'initialisation du contexte, ou à la fin, en postDispatch).
  518. <code>$callback</code> doit être un nom de fonction PHP valide.
  519. </para>
  520. </listitem>
  521. <listitem>
  522. <para>
  523. <code>setCallbacks($context, array $callbacks)</code>&#160;: affecte plusieurs
  524. fonctions de rappel pour un contexte.<code>$callbacks</code> doit être un
  525. tableau de paires trigger/callback. Actuellement, seules deux fonctions maximum
  526. peuvent être enregistrées car il n'existe que 2 déclencheurs (triggers)&#160;:
  527. "init" et "post".
  528. </para>
  529. </listitem>
  530. <listitem>
  531. <para>
  532. <code>getCallback($context, $trigger)</code>&#160;: retourne un nom de fonction
  533. de rappel affectée à un contexte.
  534. </para>
  535. </listitem>
  536. <listitem>
  537. <para>
  538. <code>getCallbacks($context)</code>&#160;: retourne un tableau de paires
  539. trigger/callback pour un contexte.
  540. </para>
  541. </listitem>
  542. <listitem>
  543. <para>
  544. <code>removeCallback($context, $trigger)</code>&#160;: supprime une fonction de
  545. rappel d'un contexte.
  546. </para>
  547. </listitem>
  548. <listitem>
  549. <para>
  550. <code>clearCallbacks($context)</code>&#160;: supprime toutes les fonctions de
  551. rappel d'un contexte.
  552. </para>
  553. </listitem>
  554. <listitem>
  555. <para>
  556. <code>setContextParam($name)</code>&#160;: affecte le paramètre de requête à
  557. vérifier pour savoir si un contexte a été appelé. La valeur par défaut est
  558. "format".
  559. </para>
  560. <para><code>getContextParam()</code> en retourne la valeur actuelle.</para>
  561. </listitem>
  562. <listitem>
  563. <para>
  564. <code>setAutoDisableLayout($flag)</code>&#160;: Par défaut, les layouts sont
  565. désactivées lorsqu'un contexte intervient, ceci provient du fait que les
  566. layouts n'ont en théorie pas de signification particulière pour un contexte,
  567. mais plutôt pour une réponse 'normale'. Cependant si vous désirez utiliser les
  568. layouts pour des contexte, passez alors la valeur <code>false</code> à cette
  569. méthode. Ceci devant être fait <emphasis>avant</emphasis> l'appel à
  570. <code>initContext()</code>.
  571. </para>
  572. <para>
  573. Pour récupérer la valeur de ce paramètre, utilisez
  574. <code>getAutoDisableLayout()</code>.
  575. </para>
  576. </listitem>
  577. <listitem>
  578. <para>
  579. <code>getCurrentContext()</code> est utilisée pour savoir quel contexte a
  580. été détecté (si c'est le cas). Cette méthode retourne <code>null</code> si
  581. aucune permutation de contexte a été détectée, ou si elle est appelée avant
  582. <code>initContext()</code>.
  583. </para>
  584. </listitem>
  585. </itemizedlist>
  586. </sect4>
  587. <sect4 id="zend.controller.actionhelpers.contextswitch.ajaxcontext">
  588. <title>Fonctionnalité AjaxContext</title>
  589. <para>
  590. L'aide <code>AjaxContext</code> étend l'aide de permutation de contexte
  591. <code>ContextSwitch</code>, donc toutes ses fonctionnalités s'y retrouvent. Il y a
  592. cependant quelques différences&#160;:
  593. </para>
  594. <para>
  595. Cette aide utilise une propriété de contrôleur d'action différente pour
  596. déterminer les contextes, <code>$ajaxable</code>. Vous pouvez avoir différents
  597. contextes utilisés avec les requêtes AJAX. Les différentes méthodes
  598. <code>*ActionContext*()</code> de <code>AjaxContext</code> vont écrire dans cette
  599. propriété.
  600. </para>
  601. <para>
  602. De plus, cette aide ne sera déclenchée que si la requête répond au critère
  603. <code>isXmlHttpRequest()</code>. Donc même si le paramètre "format" est passée à la
  604. requête, il faut nécessairement que celle ci soit une requête XmlHttpRequest, sinon la
  605. permutation d'<code>AjaxContext</code> n'aura pas lieu.
  606. </para>
  607. <para>
  608. Enfin, <code>AjaxContext</code> ajoute un contexte, HTML. Dans ce contexte, le
  609. suffixe de vue est "ajax.phtml". Il n'y a pas d'en-tête particulier ajouté à la
  610. réponse.
  611. </para>
  612. <example id="zend.controller.actionhelpers.contextswitch.ajaxcontext.example">
  613. <title>Autoriser les actions à répondre aux requêtes AJAX</title>
  614. <para>
  615. Dans l'exemple qui suit, nous autorisons les actions "view", "form", et
  616. "process" à répondre aux requêtes AJAX. Dans les actions, "view" et "form", nous
  617. retournerons des portions de HTML; dans "process", nous retournerons du
  618. JSON.
  619. </para>
  620. <programlisting language="php"><![CDATA[
  621. class CommentController extends Zend_Controller_Action
  622. {
  623. public function init()
  624. {
  625. $ajaxContext = $this->_helper->getHelper('AjaxContext');
  626. $ajaxContext->addActionContext('view', 'html')
  627. ->addActionContext('form', 'html')
  628. ->addActionContext('process', 'json')
  629. ->initContext();
  630. }
  631. public function viewAction()
  632. {
  633. // Voir les commentaires.
  634. // Quand le AjaxContext est détecté, il utilise le script de vue
  635. // comment/view.ajax.phtml
  636. }
  637. public function formAction()
  638. {
  639. // Rend les formulaire "ajoutez un commentaire".
  640. // Lorsque le AjaxContext est détecté, il utilise le script de
  641. // vue : comment/form.ajax.phtml
  642. }
  643. public function processAction()
  644. {
  645. // Traite un commentaire
  646. // Retourne les résultats sous forme JSON ; assignez simplement
  647. // vos résultats comme variables de vues.
  648. }
  649. }
  650. ]]></programlisting>
  651. <para>
  652. Coté client, votre bibliothèque AJAX requêtera simplement "/comment/view",
  653. "/comment/form", et "/comment/process", en passant le paramètre "format" :
  654. "/comment/view/format/html", "/comment/form/format/html",
  655. "/comment/process/format/json". (Ceci fonctionne aussi avec "?format=json".)
  656. </para>
  657. <para>
  658. Il est nécessaire que votre bibliothèque envoie l'en-tête HTTP
  659. "X-Requested-With: XmlHttpRequest", ce qui est en général le cas.
  660. </para>
  661. </example>
  662. </sect4>
  663. </sect3>