File: Zend_Controller-ActionHelpers-ContextSwitch.xml

package info (click to toggle)
zendframework 1.12.9%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: jessie-kfreebsd
  • size: 133,584 kB
  • sloc: xml: 1,311,829; php: 570,173; sh: 170; makefile: 125; sql: 121
file content (756 lines) | stat: -rw-r--r-- 32,383 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
<?xml version="1.0" encoding="utf-8"?>
<!-- EN-Revision: 24438 -->
<!-- Reviewed: no -->
<sect3 id="zend.controller.actionhelpers.contextswitch">
    <title>ContextSwitch et AjaxContext</title>

    <para>
        L'aide d'action <emphasis>ContextSwitch</emphasis> est destinée à faciliter le retour de
        différents formats de réponse à une requête.L'<emphasis>AjaxContext</emphasis> est une aide
        spécialisée de <emphasis>ContextSwitch</emphasis> qui permet le renvoi de réponses à
        XmlHttpRequest.
    </para>

    <para>
        Pour l'activer, vous devez indiquer à votre contrôleur quelles actions répondent à
        quel contexte. Si une requête d'entrée indique un contexte valide pour une action, alors
        l'aide d'action en charge&#160;:
    </para>

    <itemizedlist>
        <listitem>
            <para>
                Va désactiver les layouts, si elles sont activées.
            </para>
        </listitem>
        <listitem>
            <para>
                Va changer le suffixe de la vue à rendre, il faudra donc créer une vue par
                contexte.
            </para>
        </listitem>
        <listitem>
            <para>
                Va envoyer les bons en-têtes de réponse en fonction du contexte désiré.
            </para>
        </listitem>
        <listitem>
            <para>
                Va éventuellement en option appeler des fonctions pour configurer le
                contexte, ou des fonctions de post-processing.
            </para>
        </listitem>
    </itemizedlist>

    <para>Comme exemple, prenons le contrôleur suivant&#160;:</para>

    <programlisting language="php"><![CDATA[
class NewsController extends Zend_Controller_Action
{
    /**
     * page d'arrivée; forward vers listAction()
     */
    public function indexAction()
    {
        $this->_forward('list');
    }

    /**
     * Liste les news
     */
    public function listAction()
    {
    }

    /**
     * Affiche une new particulière
     */
    public function viewAction()
    {
    }
}
]]></programlisting>

    <para>
        Imaginons que nous voulions que <methodname>listAction()</methodname> soit aussi accessible
        au format <acronym>XML</acronym>. Plutôt que de créer une autre action, nous pouvons lui
        indiquer qu'elle doit retourner du <acronym>XML</acronym>&#160;:
    </para>

    <programlisting language="php"><![CDATA[
class NewsController extends Zend_Controller_Action
{
    public function init()
    {
        $contextSwitch = $this->_helper->getHelper('contextSwitch');
        $contextSwitch->addActionContext('list', 'xml')
                      ->initContext();
    }

    // ...
}
]]></programlisting>

    <para>Ce code aura pour effet&#160;:</para>

    <itemizedlist>
        <listitem>
            <para>
                De changer le "Content-Type" de la réponse en
                "<filename>application/xml</filename>".
            </para>
        </listitem>
        <listitem>
            <para>
                De changer le suffixe de vue vers "<filename>xml.phtml</filename>" (ou un autre
                suffixe si vous en utilisez un personnalisé "xml.[votre suffixe]").
            </para>
        </listitem>
    </itemizedlist>

    <para>
        Il est donc nécessaire de créer un nouveau script de vue,
        "<filename>news/list.xml.phtml</filename>", qui créera et rendra le
        <acronym>XML</acronym>.
    </para>

    <para>
        Pour savoir si la requête doit utiliser un contexte switch, l'aide vérifie un jeton
        dans l'objet de requête. Par défaut, l'aide va chercher le paramètre de requête "format",
        ceci peut être changé. Ceci signifie que dans la plupart des cas, pour changer le contexte
        d'une réponse, il faut simplement injecter un paramètre "format" à la requête:
    </para>

    <itemizedlist>
        <listitem>
            <para>
                Via l'<acronym>URL</acronym>&#160;: <filename>/news/list/format/xml</filename>
                (le routeur par défaut utilise les paires clés et valeurs fournies après l'action)
            </para>
        </listitem>
        <listitem>
            <para>
                Via un paramètre <constant>GET</constant>&#160;:
                <command>/news/list?format=xml</command>
            </para>
        </listitem>
    </itemizedlist>

    <para>
        <emphasis>ContextSwitch</emphasis> vous permet d'écrire des contextes, ceux-ci spécifient le
        suffixe de vue qui change, les en-têtes de réponse à modifier, et les fonctions de
        rappel éventuelles.
    </para>

    <sect4 id="zend.controller.actionhelpers.contextswitch.contexts">
        <title>Contextes inclus par défaut</title>

        <para>
            Par défaut, il existe 2 contextes dans l'aide <emphasis>ContextSwitch</emphasis>&#160;:
            json et <acronym>XML</acronym>.
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    <emphasis><acronym>JSON</acronym></emphasis>. Le contexte
                    <acronym>JSON</acronym> met le "Content-Type" de la réponse à
                    "<filename>application/json</filename>", et le suffixe de la vue est
                    "<filename>json.phtml</filename>".
                </para>
                <para>
                    Par défaut cependant, aucun script de vue n'est nécessaire, il va simplement
                    sérialiser en <acronym>JSON</acronym> toutes les variables de vues, et les
                    envoyer en tant que réponse.
                </para>
                <para>
                    Ce comportement peut être désactivé en éteigant le paramètre de
                    sérialisation <acronym>JSON</acronym>&#160;:
                </para>
                <programlisting language="php"><![CDATA[
$this->_helper->contextSwitch()->setAutoJsonSerialization(false);
]]></programlisting>
            </listitem>
            <listitem>
                <para>
                    <emphasis><acronym>XML</acronym></emphasis>. Le contexte <acronym>XML</acronym>
                    met le "Content-Type" de la réponse à "<filename>application/xml</filename>", et
                    utilise un suffixe de vue "<filename>xml.phtml</filename>". Vous devrez
                    créer une nouvelle vue pour ce contexte.
                </para>
            </listitem>
        </itemizedlist>
    </sect4>

    <sect4 id="zend.controller.actionhelpers.contextswitch.custom">
        <title>Créer ses propres contextes</title>

        <para>
            Vous pouvez créer vos propres contextes d'action. Par exemple pour retourner du
            <acronym>YAML</acronym>, du <acronym>PHP</acronym> sérialisé, ou encore du
            <acronym>RSS</acronym> ou du <acronym>ATOM</acronym>. <emphasis>ContextSwitch</emphasis>
            est là pour cela.
        </para>

        <para>
            La manière la plus simple d'ajouter un nouveau contexte d'action est la méthode
            <methodname>addContext()</methodname>. Elle prend 2 paramètres : le nom du contexte,
            et un tableau d'options. Ce tableau d'option doit comporter au moins une des clés
            suivantes&#160;:
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    <emphasis>suffix</emphasis>&#160;: Le préfixe qui va s'ajouter au suffixe de
                    vue. Il sera utiliser par le ViewRenderer.
                </para>
            </listitem>
            <listitem>
                <para>
                    <emphasis>headers</emphasis>&#160;: un tableau d'en-têtes et de valeurs que
                    vous voulez ajouter à la réponse.
                </para>
            </listitem>
            <listitem>
                <para>
                    <emphasis>callbacks</emphasis>&#160;: un tableau dont les clés peuvent être
                    "init" ou "post", et les valeurs représentent des noms de fonctions
                    <acronym>PHP</acronym> valides, qui seront utilisées pour initialiser ou
                    traiter la fin du contexte.
                </para>
                <para>
                    Les fonctions d'initialisation interviennent lorsque le contexte est détecté
                    par <emphasis>ContextSwitch</emphasis>. Par exemple dans le contexte intégré
                    <acronym>JSON</acronym>, la fonction désactive le ViewRenderer lorsque la
                    sérialisation automatique <acronym>JSON</acronym> est activée.
                </para>
                <para>
                    Les fonctions de traitement de fin de contexte (Post processing) interviennent
                    durant le processus de <methodname>postDispatch()</methodname> de l'action en
                    cours. Par exemple pour le contexte intégré <acronym>JSON</acronym>, la
                    fonction de post process regarde si la sérialisation automatique
                    <acronym>JSON</acronym> est active, si c'est le cas, elle va sérialiser les
                    variables de la vue en <acronym>JSON</acronym>, et envoyer la réponse&#160;;
                    mais dans le cas contraire, elle va réactiver le ViewRenderer.
                </para>
            </listitem>
        </itemizedlist>

        <para>Voici les méthodes d'interaction avec les contextes&#160;:</para>

        <itemizedlist>
            <listitem>
                <para>
                    <methodname>addContext($context, array $spec)</methodname>&#160;: Ajoute un
                    nouveau contexte. Si celui-ci existe déjà, une exception sera lancée.
                </para>
            </listitem>
            <listitem>
                <para>
                    <methodname>setContext($context, array $spec)</methodname>&#160;: Ajoute un
                    nouveau contexte, mais écrase celui-ci s'il existait déjà. Utilise les mêmes
                    spécifications que <methodname>addContext()</methodname>.
                </para>
            </listitem>
            <listitem>
                <para>
                    <methodname>addContexts(array $contexts)</methodname>&#160;: Ajoute plusieurs
                    contextes d'un coup. Le tableau <varname>$contexts</varname> doit être un
                    tableau de paires contexte et specifications. Si un des contextes existe déjà,
                    une exception est lancée.
                </para>
            </listitem>
            <listitem>
                <para>
                    <methodname>setContexts(array $contexts)</methodname>&#160;: Ajoute des
                    nouveaux contextes, mais écrase ceux déjà présents éventuellement. Utilise
                    les mêmes spécifications que <methodname>addContexts()</methodname>.
                </para>
            </listitem>
            <listitem>
                <para>
                    <methodname>hasContext($context)</methodname>&#160;: retourne
                    <constant>TRUE</constant> si le contexte existe déjà,
                    <constant>FALSE</constant> sinon.
                </para>
            </listitem>
            <listitem>
                <para>
                    <methodname>getContext($context)</methodname>&#160;: retourne un contexte
                    par son nom. Le retour est un tableau qui a la même syntaxe que celui utilisé
                    par <methodname>addContext()</methodname>.
                </para>
            </listitem>
            <listitem>
                <para>
                    <methodname>getContexts()</methodname>&#160;: retourne tous les contextes.
                    Le tableau de retour est de la forme contexte =&gt; spécifications.
                </para>
            </listitem>
            <listitem>
                <para>
                    <methodname>removeContext($context)</methodname>&#160;: Supprime un contexte
                    grâce à son nom. Retourne <constant>TRUE</constant> si réussi,
                    <constant>FALSE</constant> si le contexte n'a pas été trouvé.
                </para>
            </listitem>
            <listitem>
                <para>
                    <methodname>clearContexts()</methodname>&#160;: Supprime tous les contextes.
                </para>
            </listitem>
        </itemizedlist>
    </sect4>

    <sect4 id="zend.controller.actionhelpers.contextswitch.actions">
        <title>Affecter des contextes par action</title>

        <para>
            Il existe deux mécanismes pour créer et affecter des contextes. Vous pouvez créer
            des tableaux dans vos contrôleurs, ou utiliser plusieurs méthodes de
            <emphasis>ContextSwitch</emphasis> pour les assembler.
        </para>

        <para>
            La méthode principale pour ajouter des contextes à des actions est
            <methodname>addActionContext()</methodname>. Elle attend 2 arguments, l'action et le
            contexte (ou un tableau de contextes). Par exemple, considérons la classe
            suivante&#160;:
        </para>

        <programlisting language="php"><![CDATA[
class FooController extends Zend_Controller_Action
{
    public function listAction()
    {
    }

    public function viewAction()
    {
    }

    public function commentsAction()
    {
    }

    public function updateAction()
    {
    }
}
]]></programlisting>

        <para>
            Imaginons que nous voulions ajouter un contexte <acronym>XML</acronym> à l'action
            "list", et deux contextes <acronym>XML</acronym> et <acronym>JSON</acronym> à
            l'action "comments". Nous pourrions faire ceci dans la méthode
            <methodname>init()</methodname>&#160;:
        </para>

        <programlisting language="php"><![CDATA[
class FooController extends Zend_Controller_Action
{
    public function init()
    {
        $this->_helper->contextSwitch()
             ->addActionContext('list', 'xml')
             ->addActionContext('comments', array('xml', 'json'))
             ->initContext();
    }
}
]]></programlisting>

        <para>
            De la même manière, il est aussi possible de simplement définir la propriété
            <varname>$contexts</varname>&#160;:
        </para>

        <programlisting language="php"><![CDATA[
class FooController extends Zend_Controller_Action
{
    public $contexts = array(
        'list'     => array('xml'),
        'comments' => array('xml', 'json')
    );

    public function init()
    {
        $this->_helper->contextSwitch()->initContext();
    }
}
]]></programlisting>

        <para>Cette syntaxe est simplement moins pratique et plus prompte aux erreurs.</para>

        <para>Pour construire vos contextes, les méthodes suivantes vous seront utiles&#160;:</para>

        <itemizedlist>
            <listitem>
                <para>
                    <methodname>addActionContext($action, $context)</methodname>&#160;: Ajoute un
                    ou plusieurs contextes à une action. <varname>$context</varname> doit donc être
                    une chaîne, ou un tableau de chaînes.
                </para>
                <para>
                    Passer la valeur <constant>TRUE</constant> comme contexte marquera tous les
                    contextes comme disponibles pour cette action.
                </para>
                <para>
                    Une valeur vide pour <varname>$context</varname> désactivera tous les contextes
                    donnés à cette action.
                </para>
            </listitem>
            <listitem>
                <para>
                    <methodname>setActionContext($action, $context)</methodname>&#160;: Marque un
                    ou plusieurs contextes comme disponibles pour cette action. Si ceux-ci existent
                    déjà, ils seront remplacés. <varname>$context</varname> doit être une chaîne ou
                    un tableau de chaînes.
                </para>
            </listitem>
            <listitem>
                <para>
                    <methodname>addActionContexts(array $contexts)</methodname>&#160;: Ajoute
                    plusieurs paires action et contexte en une fois. <varname>$contexts</varname>
                    doit être un tableau associatif action et contexte. Cette méthode proxie vers
                    <methodname>addActionContext()</methodname>.
                </para>
            </listitem>
            <listitem>
                <para>
                    <methodname>setActionContexts(array $contexts)</methodname>&#160;: agit comme
                    <methodname>addActionContexts()</methodname>, mais écrase les paires
                    action et contexte existantes.
                </para>
            </listitem>
            <listitem>
                <para>
                    <methodname>hasActionContext($action, $context)</methodname>&#160;: détermine
                    si une action possède un contexte donné.
                </para>
            </listitem>
            <listitem>
                <para>
                    <methodname>getActionContexts($action = null)</methodname>&#160;: Retourne tous
                    les contextes d'une action donnée, si pas d'action passée, retourne alors toutes
                    les paires action et contexte.
                </para>
            </listitem>
            <listitem>
                <para>
                    <methodname>removeActionContext($action, $context)</methodname>&#160;: Supprime
                    un ou plusieurs contextes pour une action. <varname>$context</varname> doit être
                    une chaîne ou un tableau de chaînes.
                </para>
            </listitem>
            <listitem>
                <para>
                    <methodname>clearActionContexts($action = null)</methodname>&#160;: Supprime
                    tous les contextes d'une action. Si aucune action n'est spécifiée, supprime
                    alors tous les contextes de toutes les actions.
                </para>
            </listitem>
        </itemizedlist>
    </sect4>

    <sect4 id="zend.controller.actionhelpers.contextswitch.initcontext">
        <title>Initialiser le Context Switch</title>

        <para>
            Pour initialiser la permutation de contextes (contexte switching), vous devez
            appeler <methodname>initContext()</methodname> dans vos contrôleurs d'action&#160;:
        </para>

        <programlisting language="php"><![CDATA[
class NewsController extends Zend_Controller_Action
{
    public function init()
    {
        $this->_helper->contextSwitch()->initContext();
    }
}
]]></programlisting>

        <para>
            Dans certains cas, vous voudriez forcer un contexte pour une action&#160;; par exemple
            vous pouvez vouloir seulement le contexte <acronym>XML</acronym> si la permutation de
            contexte est active. Passez le alors à <methodname>initContext()</methodname>&#160;:
        </para>

        <programlisting language="php"><![CDATA[
$contextSwitch->initContext('xml');
]]></programlisting>
    </sect4>

    <sect4 id="zend.controller.actionhelpers.contextswitch.misc">
        <title>Fonctionnalités avancées</title>

        <para>
            Voici quelques méthodes qui peuvent être utilisées pour changer le comportement
            de l'aide <emphasis>ContextSwitch</emphasis>&#160;:
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    <methodname>setAutoJsonSerialization($flag)</methodname>: Par défaut, le
                    contexte <acronym>JSON</acronym> va sérialiser toute variable en notation
                    <acronym>JSON</acronym> et les retourner en tant que réponse. Si vous voulez
                    créer votre propre réponse, vous voudriez désactiver cet effet. Ceci doit être
                    fait avant l'appel à <methodname>initContext()</methodname>.
                </para>
                <programlisting language="php"><![CDATA[
$contextSwitch->setAutoJsonSerialization(false);
$contextSwitch->initContext();
]]></programlisting>
                <para>
                    Pour récupérer la valeur actuelle, utilisez
                    <methodname>getAutoJsonSerialization()</methodname>.
                </para>
            </listitem>
            <listitem>
                <para>
                    <methodname>setSuffix($context, $suffix,
                        $prependViewRendererSuffix)</methodname>&#160;:
                    Cette méthode permet de personnaliser le suffixe de vue d'un contexte. Le
                    troisième argument indique si le suffixe actuel du ViewRenderer doit être
                    utilisé comme préfixe de votre suffixe. Par défaut, c'est le cas.
                </para>
                <para>
                    Passer une valeur vide au suffixe aura pour effet de n'utiliser que le
                    suffixe du ViewRenderer.
                </para>
            </listitem>
            <listitem>
                <para>
                    <methodname>addHeader($context, $header, $content)</methodname>&#160;: Ajoute
                    un en-tête à la réponse pour un contexte donné. <varname>$header</varname>
                    est le nom de l'en-tête et <varname>$content</varname> sa valeur.
                </para>
                <para>
                    Chaque contexte peut posséder plusieurs en-têtes,
                    <methodname>addHeader()</methodname> ajoute des en-têtes dans une pile,
                    pour un contexte donné.
                </para>
                <para>
                    Si l'en-tête <varname>$header</varname> spécifié pour le contexte existe déjà,
                    une exception sera alors levée.
                </para>
            </listitem>
            <listitem>
                <para>
                    <methodname>setHeader($context, $header, $content)</methodname>&#160;:
                    <methodname>setHeader()</methodname> agit comme
                    <methodname>addHeader()</methodname>, sauf qu'il va écraser un en-tête
                    qui aurait déjà été présent.
                </para>
            </listitem>
            <listitem>
                <para>
                    <methodname>addHeaders($context, array $headers)</methodname>&#160;: Ajoute
                    plusieurs en-têtes en une seule fois. Proxie vers
                    <methodname>addHeader()</methodname>.<varname>$headers</varname> est un
                    tableau de paires header =&gt; contexte.
                </para>
            </listitem>
            <listitem>
                <para>
                    <methodname>setHeaders($context, array $headers.)</methodname>&#160;: comme
                    <methodname>addHeaders()</methodname>, sauf que cette méthode proxie vers
                    <methodname>setHeader()</methodname>, vous permettant d'écraser des en-têtes
                    déjà présents.
                </para>
            </listitem>
            <listitem>
                <para>
                    <methodname>getHeader($context, $header)</methodname>&#160;: retourne une
                    valeur d'en-tête pour un contexte. Retourne <constant>NULL</constant>
                    si non trouvé.
                </para>
            </listitem>
            <listitem>
                <para>
                    <methodname>removeHeader($context, $header)</methodname>&#160;: supprime
                    un en-tête d'un contexte.
                </para>
            </listitem>
            <listitem>
                <para>
                    <methodname>clearHeaders($context, $header)</methodname>&#160;: supprime
                    tous les en-têtes d'un contexte.
                </para>
            </listitem>
            <listitem>
                <para>
                    <methodname>setCallback($context, $trigger, $callback)</methodname>&#160;:
                    affecte une fonction de rappel (callback) pour un contexte. Le déclencheur
                    peut être soit "init" ou "post" (la fonction de rappel sera appelée soit à
                    l'initialisation du contexte, ou à la fin, en postDispatch).
                    <varname>$callback</varname> doit être un nom de fonction <acronym>PHP</acronym>
                    valide.
                </para>
            </listitem>
            <listitem>
                <para>
                    <methodname>setCallbacks($context, array $callbacks)</methodname>&#160;:
                    affecte plusieurs fonctions de rappel pour un contexte.
                    <varname>$callbacks</varname> doit être un tableau de paires trigger et
                    callback. Actuellement, seules deux fonctions maximum peuvent être enregistrées
                    car il n'existe que 2 déclencheurs (triggers)&#160;: "init" et "post".
                </para>
            </listitem>
            <listitem>
                <para>
                    <methodname>getCallback($context, $trigger)</methodname>&#160;: retourne un
                    nom de fonction de rappel affectée à un contexte.
                </para>
            </listitem>
            <listitem>
                <para>
                    <methodname>getCallbacks($context)</methodname>&#160;: retourne un tableau
                    de paires trigger et callback pour un contexte.
                </para>
            </listitem>
            <listitem>
                <para>
                    <methodname>removeCallback($context, $trigger)</methodname>&#160;: supprime
                    une fonction de rappel d'un contexte.
                </para>
            </listitem>
            <listitem>
                <para>
                    <methodname>clearCallbacks($context)</methodname>&#160;: supprime toutes
                    les fonctions de rappel d'un contexte.
                </para>
            </listitem>
            <listitem>
                <para>
                    <methodname>setContextParam($name)</methodname>&#160;: affecte le paramètre
                    de requête à vérifier pour savoir si un contexte a été appelé. La valeur par
                    défaut est "format".
                </para>
                <para>
                    <methodname>getContextParam()</methodname> en retourne la valeur actuelle.
                </para>
            </listitem>
            <listitem>
                <para>
                    <methodname>setAutoDisableLayout($flag)</methodname>&#160;: Par défaut, les
                    layouts sont désactivées lorsqu'un contexte intervient, ceci provient du fait
                    que les layouts n'ont en théorie pas de signification particulière pour un
                    contexte, mais plutôt pour une réponse 'normale'. Cependant si vous désirez
                    utiliser les layouts pour des contexte, passez alors la valeur
                    <constant>FALSE</constant> à <methodname>setAutoDisableLayout()</methodname>.
                    Ceci devant être fait <emphasis>avant</emphasis> l'appel à
                    <methodname>initContext()</methodname>.
                </para>
                <para>
                    Pour récupérer la valeur de ce paramètre, utilisez
                    <methodname>getAutoDisableLayout()</methodname>.
                </para>
            </listitem>
            <listitem>
                <para>
                    <methodname>getCurrentContext()</methodname> est utilisée pour savoir quel
                    contexte a été détecté (si c'est le cas). Cette méthode retourne
                    <constant>NULL</constant> si aucune permutation de contexte a été détectée,
                    ou si elle est appelée avant <methodname>initContext()</methodname>.
                </para>
            </listitem>
        </itemizedlist>
    </sect4>

    <sect4 id="zend.controller.actionhelpers.contextswitch.ajaxcontext">
        <title>Fonctionnalité AjaxContext</title>

        <para>
            L'aide <emphasis>AjaxContext</emphasis> étend l'aide de permutation de contexte
            <emphasis>ContextSwitch</emphasis>, donc toutes les fonctionnalités de
            <emphasis>ContextSwitch</emphasis> s'y retrouvent. Il y a cependant quelques
            différences&#160;:
        </para>

        <para>
            Cette aide utilise une propriété de contrôleur d'action différente pour
            déterminer les contextes, <varname>$ajaxable</varname>. Vous pouvez avoir différents
            contextes utilisés avec les requêtes <acronym>AJAX</acronym> ou <acronym>HTTP</acronym>.
            Les différentes méthodes <methodname>ActionContext()</methodname> de
            <emphasis>AjaxContext</emphasis> vont écrire dans cette propriété.
        </para>

        <para>
            De plus, cette aide ne sera déclenchée que si la requête répond au critère
            <methodname>isXmlHttpRequest()</methodname>. Donc même si le paramètre "format" est
            passée à la requête, il faut nécessairement que celle ci soit une requête
            XmlHttpRequest, sinon la permutation de contexte n'aura pas lieu.
        </para>

        <para>
            Enfin, <emphasis>AjaxContext</emphasis> ajoute un contexte, <acronym>HTML</acronym>.
            Dans ce contexte, le suffixe de vue est "<filename>ajax.phtml</filename>". Il n'y a
            pas d'en-tête particulier ajouté à la réponse.
        </para>

        <example id="zend.controller.actionhelpers.contextswitch.ajaxcontext.example">
            <title>Autoriser les actions à répondre aux requêtes AJAX</title>

            <para>
                Dans l'exemple qui suit, nous autorisons les actions "view", "form", et
                "process" à répondre aux requêtes <acronym>AJAX</acronym>. Dans les actions,
                "view" et "form", nous retournerons des portions de <acronym>HTML</acronym>&#160;;
                dans "process", nous retournerons du <acronym>JSON</acronym>.
            </para>

            <programlisting language="php"><![CDATA[
class CommentController extends Zend_Controller_Action
{
    public function init()
    {
        $ajaxContext = $this->_helper->getHelper('AjaxContext');
        $ajaxContext->addActionContext('view', 'html')
                    ->addActionContext('form', 'html')
                    ->addActionContext('process', 'json')
                    ->initContext();
    }

    public function viewAction()
    {
        // Voir les commentaires.
        // Quand le AjaxContext est détecté, il utilise le script de vue
        // comment/view.ajax.phtml
    }

    public function formAction()
    {
        // Rend les formulaire "ajoutez un commentaire".
        // Lorsque le AjaxContext est détecté, il utilise le script de
        // vue : comment/form.ajax.phtml
    }

    public function processAction()
    {
        // Traite un commentaire
        // Retourne les résultats sous forme JSON ; assignez simplement
        // vos résultats comme variables de vues.
    }
}
]]></programlisting>

            <para>
                Coté client, votre bibliothèque <acronym>AJAX</acronym> requêtera simplement
                "<filename>/comment/view</filename>",
                "<filename>/comment/form</filename>", et "<filename>/comment/process</filename>",
                en passant le paramètre "format"&#160;:
                "<filename>/comment/view/format/html</filename>",
                "<filename>/comment/form/format/html</filename>",
                "<filename>/comment/process/format/json</filename>".
                (Ceci fonctionne aussi avec "?format=json".)
            </para>

            <para>
                Il est nécessaire que votre bibliothèque envoie l'en-tête
                "X-Requested-With: XmlHttpRequest", ce qui est en général le cas.
            </para>
        </example>
    </sect4>
</sect3>