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 :
</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 :</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> :
</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 :</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> : <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> :
<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> :
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> :
</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 :
</para>
<itemizedlist>
<listitem>
<para>
<emphasis>suffix</emphasis> : Le préfixe qui va s'ajouter au suffixe de
vue. Il sera utiliser par le ViewRenderer.
</para>
</listitem>
<listitem>
<para>
<emphasis>headers</emphasis> : un tableau d'en-têtes et de valeurs que
vous voulez ajouter à la réponse.
</para>
</listitem>
<listitem>
<para>
<emphasis>callbacks</emphasis> : 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 ;
mais dans le cas contraire, elle va réactiver le ViewRenderer.
</para>
</listitem>
</itemizedlist>
<para>Voici les méthodes d'interaction avec les contextes :</para>
<itemizedlist>
<listitem>
<para>
<methodname>addContext($context, array $spec)</methodname> : 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> : 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> : 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> : 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> : retourne
<constant>TRUE</constant> si le contexte existe déjà,
<constant>FALSE</constant> sinon.
</para>
</listitem>
<listitem>
<para>
<methodname>getContext($context)</methodname> : 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> : retourne tous les contextes.
Le tableau de retour est de la forme contexte => spécifications.
</para>
</listitem>
<listitem>
<para>
<methodname>removeContext($context)</methodname> : 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> : 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 :
</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> :
</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> :
</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 :</para>
<itemizedlist>
<listitem>
<para>
<methodname>addActionContext($action, $context)</methodname> : 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> : 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> : 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> : agit comme
<methodname>addActionContexts()</methodname>, mais écrase les paires
action et contexte existantes.
</para>
</listitem>
<listitem>
<para>
<methodname>hasActionContext($action, $context)</methodname> : détermine
si une action possède un contexte donné.
</para>
</listitem>
<listitem>
<para>
<methodname>getActionContexts($action = null)</methodname> : 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> : 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> : 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 :
</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 ; par exemple
vous pouvez vouloir seulement le contexte <acronym>XML</acronym> si la permutation de
contexte est active. Passez le alors à <methodname>initContext()</methodname> :
</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> :
</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> :
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> : 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> :
<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> : Ajoute
plusieurs en-têtes en une seule fois. Proxie vers
<methodname>addHeader()</methodname>.<varname>$headers</varname> est un
tableau de paires header => contexte.
</para>
</listitem>
<listitem>
<para>
<methodname>setHeaders($context, array $headers.)</methodname> : 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> : 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> : supprime
un en-tête d'un contexte.
</para>
</listitem>
<listitem>
<para>
<methodname>clearHeaders($context, $header)</methodname> : supprime
tous les en-têtes d'un contexte.
</para>
</listitem>
<listitem>
<para>
<methodname>setCallback($context, $trigger, $callback)</methodname> :
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> :
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) : "init" et "post".
</para>
</listitem>
<listitem>
<para>
<methodname>getCallback($context, $trigger)</methodname> : retourne un
nom de fonction de rappel affectée à un contexte.
</para>
</listitem>
<listitem>
<para>
<methodname>getCallbacks($context)</methodname> : retourne un tableau
de paires trigger et callback pour un contexte.
</para>
</listitem>
<listitem>
<para>
<methodname>removeCallback($context, $trigger)</methodname> : supprime
une fonction de rappel d'un contexte.
</para>
</listitem>
<listitem>
<para>
<methodname>clearCallbacks($context)</methodname> : supprime toutes
les fonctions de rappel d'un contexte.
</para>
</listitem>
<listitem>
<para>
<methodname>setContextParam($name)</methodname> : 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> : 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 :
</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> ;
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" :
"<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>
|