Dernièrement je faisais quelques recherches sur Drupal et AJAX pour me rendre compte qu'il y avait finalement assez peu de ressources, même en anglais, traitant de ce sujet. Pourtant cette technique, au delà du buzz généré autour d'elle, peut rendre de réels services et grandement fluidifier des interfaces trop lourds ou trop peu intelligent. Et pour simplifier son utilisation, rien de mieux que JQuery, inclus dans le coeur de Drupal depuis sa version 5.
L'exemple que je vais prendre ici est très simple et reprends l'exemple Ajax de l'horloge développé tour ici. Il s'agit simplement d'afficher une page Drupal, contenant une horloge dont l'heure est donnée, toute les secondes, par une requête Ajax.
Tout le jeu ici, est de s'intégrer parfaitement dans un module Drupal. Et ceci tant du point de vue de la page "horloge" (facile
que du serveur de requête Ajax (un peu moins facile..). Cela nous permet de faire des modules totalement autonomes utilisant Ajax, mais aussi de bénéficier de toute l'infrastructure de Drupal (base de données, thèmes, etc) au niveau du serveur Ajax. Et pour réussir cette intégration, nous allons simplement utiliser le système des callbacks, c'est à dire des menus Drupal redirigés sur des fonctions.
La première chose à faire est donc de créer un module de base (Si vous ne savez par où commencer, vous pouvez prendre cet exemple pour démarrer). Module que nous allons nommer exemple_ajax et activer dans Drupal.
Ceci fait, nous allons implémenter le hook _menu pour définir deux menus/callback. Le premier servira à afficher la page que l'on va ajaxifier (exemple_ajax/horloge) et le second va être notre source de donnée AJAX (exemple_ajax/getTime)
Dans le code du hook, rien de particulier, si ce n'est la présence de la fonction drupal_add_js(...)à qui va demander à Drupal d'ajouter à la page générée, un lien vers un fichier javascript que nous allons bientôt créer (exemple_ajax.js).
Ensuite, nous codons la première callback qui est chargé de l'affichage de la vue, une simple description.
Étape suivante, créer le fichier javascript qui va prendre en charge la mise à jour de l'horloge. Comme indiqué dans le hook menu, ceci doit être stocké dans un fichier exemple_ajax.js au même niveau que le module :
Je ne reviens pas sur ce code, il est décrit dans le tutorial sur jQuery.
Dernière étape, retour à Drupal et écriture de deuxième callback, celle qui va répondre à la requête AJAX :
Les deux définitions de header permettent d'éviter que le navigateur ne mette en cache notre résultat de requête. Suit un simple print suivi du formatage de l'heure. La fonction termine sur un exit() pour arrêter le traitement ici. Et c'est presque là le point le plus important. Car en c'est en cassant ainsi le traitement de Drupal que l'on bénéficie de toute son infrastructure tout en ayant un contrôle parfait sur ce qui est renvoyé au client (pas de thèmes, de pages, etc..).
Vous pouvez tester la fonction dans un navigateur en y tapant l'url exemple_ajax/getTime qui devrait vous donner un message : XX:YY:ZZ.
Et voilà, c'est terminé. Il vous suffit maintenant d'aller sur l'url /exemple_ajax/horloge pour que la page initiale s'affiche, que le script soit chargé et modifie le comportement du message et pour que l'horloge se mette à tourner en utilisant des requêtes en Ajax, sur une source de donnée Drupal, pour se mettre à jour.
Une fois que l'on a les bases Ajax et jQuery, la mise en oeuvre dans Drupal est vraiment très simple et permet tout les types d'utilisation de requêtes asynchrones sur notre CMS préféré.
- répondre
tenshu , le 26 November, 2007 - 10:05Je vois que mon commentaire sur ton précédent billet t'a intrigué
Merci en tout cas c'est encore un peut plus clair pour moi
- répondre
Ulhume, le 26 November, 2007 - 10:39Disons que c'est une conjonction de beaucoup de choses vu que je travaille en ce moment sur un "vrai" projet Drupal (au sens professionnel du terme), mais oui, ça m'a alimenté
En tout cas, ravis que cela te serve !
- répondre
tenshu , le 26 November, 2007 - 18:29la avec mon collègue on vient de tripatouiller a fond jquery pour implémenter une sauvegarde par cookie des menu/sous menu depliés ou nom
c'est mignon tout plein 
- répondre
Ulhume, le 26 November, 2007 - 21:29- répondre
gagarine, le 8 January, 2008 - 14:27Hello,
Merci pour l'exemple
.
Mais pourquoi le deuxième call back pointe sur exemple_ajax_getTime et par sur exemple_ajax_ajax? J'ai beau relire le post, je comprend pas...
- répondre
Ulhume, le 13 January, 2008 - 15:03@gagarine La réponse est simple, il s'agit d'une boulette. C'est corrigé, désolé
- répondre
Guim , le 18 January, 2008 - 16:59Merci beaucoup pour cet article, il m'a vraiment permis d'avancer! Ce genre d'information manque vraiment sur le site officiel de Drupal.
- répondre
Ulhume, le 18 January, 2008 - 21:27@Guim A ton service, la connaissance n'est utile que lorsqu'on la partage
Poster un nouveau commentaire