Zend_Controller-ActionHelpers-ContextSwitch.xml 32 KB

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