<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Artisan Numérique</title>
  <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/1273"/>
  <link rel="self" type="application/atom+xml" href="http://artisan.karma-lab.net/node/1273/atom/feed"/>
  <id>http://artisan.karma-lab.net/node/1273/atom/feed</id>
  <updated>2008-11-14T08:30:29+01:00</updated>
  <entry>
    <title>Drupal, Utiliser Ajax pour générer du contenu</title>
    <link rel="alternate" type="text/html" href="http://artisan.karma-lab.net/node/1273" />
    <id>http://artisan.karma-lab.net/node/1273</id>
    <published>2007-11-25T22:27:11+01:00</published>
    <updated>2008-11-14T08:30:29+01:00</updated>
    <author>
      <name>Ulhume</name>
    </author>
    <category term="Drupal" />
    <category term="drupalfr.org" />
    <category term="OK" />
    <category term="Planet Libre" />
    <category term="Tutoriel" />
    <summary type="html"><![CDATA[<p>
  Dernièrement je faisais quelques recherches sur Drupal et 
  <a target='_blank' href='http://fr.wikipedia.org/wiki/AJAX'>
  AJAX
  </a> 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. 
</p>
    ]]></summary>
    <content type="html"><![CDATA[<p>
  Dernièrement je faisais quelques recherches sur Drupal et 
  <a target='_blank' href='http://fr.wikipedia.org/wiki/AJAX'>
  AJAX
  </a> 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. 
</p>
<!--break-->


	<a name='chapter_1'></a>
  <h2>Mise en oeuvre</h2>
	
<p>
   L'exemple que je vais prendre ici est très simple et reprends l'exemple Ajax de l'horloge développé <a class='external' target='_blank' href='/node/1275' >tour ici</a>. 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. 
</p>
<p>
  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 <img src="http://artisan.karma-lab.net/sites/all/modules/contrib/smileys/packs/crystal/wink2.gif" title="Wink" alt="Wink" class="smiley-content"/> 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 <kbd>callbacks</kbd>, c'est à dire des menus Drupal redirigés sur des fonctions. 
</p>
<p>
  La première chose à faire est donc de créer un module de base (Si vous ne savez par où commencer, vous pouvez prendre <a class='external' target='_blank' href='/node/1245' >cet exemple</a> pour démarrer). Module que nous allons nommer <kbd>exemple_ajax</kbd> et activer dans Drupal. 
</p>
<p>
  Ceci fait, nous allons implémenter le hook <kbd>_menu</kbd> 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)

  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://www.php.net/function"><span class="kw2">function</span></a> exemple_ajax_menu<span class="br0">&#40;</span><span class="re0">$may_cache</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="re0">$items</span><span class="sy0">=</span> <a target="blank" href="http://www.php.net/array"><span class="kw3">array</span></a> <span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <a target="blank" href="http://www.php.net/if"><span class="kw1">if</span></a> <span class="br0">&#40;</span><span class="re0">$may_cache</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><span class="br0">&#125;</span> <a target="blank" href="http://www.php.net/else"><span class="kw1">else</span></a> <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$path</span><span class="sy0">=</span> drupal_get_path<span class="br0">&#40;</span><span class="st0">'module'</span><span class="sy0">,</span> <span class="st0">'exemple_ajax'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; drupal_add_js<span class="br0">&#40;</span><span class="re0">$path</span> <span class="sy0">.</span> <span class="st0">'./exemple_ajax.js'</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$items</span><span class="br0">&#91;</span><span class="br0">&#93;</span><span class="sy0">=</span> <a target="blank" href="http://www.php.net/array"><span class="kw3">array</span></a> <span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">'title'</span> <span class="sy0">=&gt;</span> <span class="st0">'Exemple AJAX'</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">'path'</span> <span class="sy0">=&gt;</span> <span class="st0">'exemple_ajax/horloge'</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">'callback'</span> <span class="sy0">=&gt;</span> <span class="st0">'exemple_ajax_horloge'</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">'access'</span> <span class="sy0">=&gt;</span> <a target="blank" href="http://www.php.net/true"><span class="kw2">TRUE</span></a><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">;</span><br />
<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="re0">$items</span><span class="br0">&#91;</span><span class="br0">&#93;</span><span class="sy0">=</span> <a target="blank" href="http://www.php.net/array"><span class="kw3">array</span></a> <span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">'path'</span> <span class="sy0">=&gt;</span> <span class="st0">'exemple_ajax/getTime'</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">'callback'</span> <span class="sy0">=&gt;</span> <span class="st0">'exemple_ajax_getTime'</span><span class="sy0">,</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">'access'</span> <span class="sy0">=&gt;</span> <a target="blank" href="http://www.php.net/true"><span class="kw2">TRUE</span></a><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#41;</span><span class="sy0">;</span>
  </div>
  
  </div>
</p>
<p>
  Dans le code du hook, rien de particulier, si ce n'est la présence de la fonction <kbd>drupal_add_js(...)à</kbd> 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). 
</p>
<p>
  Ensuite, nous codons la première callback qui est chargé de l'affichage de la vue, une simple description. 
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://www.php.net/function"><span class="kw2">function</span></a> exemple_ajax_horloge<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<span class="br0">&#123;</span><br />
&nbsp; <a target="blank" href="http://www.php.net/return"><span class="kw1">return</span></a> <span class="st0">&quot;Bienvenue sur l'Horloge AJAX/Drupal. Il est actuellement &lt;span id=&quot;</span>heure<span class="st0">&quot;/&gt;&quot;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
  </div>
  
  </div>
</p>
<p>
  É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 <kbd>exemple_ajax.js</kbd> au même niveau que le module :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <span class="kw2">function</span> changeHeure<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; jQuery.<span class="me1">get</span><span class="br0">&#40;</span><span class="st0">&quot;getTime.php&quot;</span><span class="sy0">,</span> <span class="br0">&#123;</span><span class="br0">&#125;</span><span class="sy0">,</span> reponseServeur<span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<br />
<span class="kw2">function</span> reponseServeur<span class="br0">&#40;</span>texte<span class="sy0">,</span> erreur<span class="sy0">,</span> requete<span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; $<span class="br0">&#40;</span><span class="st0">'#heure'</span><span class="br0">&#41;</span>.<span class="me1">html</span><span class="br0">&#40;</span>texte<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; setTimeout<span class="br0">&#40;</span>changeHeure<span class="sy0">,</span> <span class="nu0">1000</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
<span class="kw2">function</span> initializePage<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; changeHeure<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><br />
$<span class="br0">&#40;</span>initializePage<span class="br0">&#41;</span><span class="sy0">;</span>
  </div>
  
  </div>
</p>
<p>
  Je ne reviens pas sur ce code, il est décrit dans le <a class='external' target='_blank' href='http://artisan.karma-lab.net/node/1275' >tutorial sur jQuery</a>. 
</p>  
<p>
  Dernière étape, retour à Drupal et écriture de deuxième callback, celle qui va répondre à la requête AJAX :
  
  <div class='code-block code-block-fragment'>
  <div class='container'>
  <a target="blank" href="http://www.php.net/function"><span class="kw2">function</span></a> exemple_ajax_getTime<span class="br0">&#40;</span><span class="re0">$argument</span><span class="br0">&#41;</span> <span class="br0">&#123;</span><br />
&nbsp; <a target="blank" href="http://www.php.net/header"><span class="kw3">header</span></a><span class="br0">&#40;</span><span class="st0">&quot;Cache-Control: no-cache, must-revalidate&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <a target="blank" href="http://www.php.net/header"><span class="kw3">header</span></a><span class="br0">&#40;</span><span class="st0">&quot;Expires: Mon, 26 Jul 1997 05:00:00 GMT&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <a target="blank" href="http://www.php.net/print"><span class="kw3">print</span></a> <a target="blank" href="http://www.php.net/date"><span class="kw3">date</span></a><span class="br0">&#40;</span><span class="st0">&quot;H:i:s&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; <a target="blank" href="http://www.php.net/exit"><span class="kw3">exit</span></a> <span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span>
  </div>
  
  </div>
</p>
<p>
  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 <kbd>print</kbd> suivi du formatage de l'heure. La fonction termine sur un <kbd>exit()</kbd> 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..). 
</p>
<p>
 Vous pouvez tester la fonction dans un navigateur en y tapant l'url <kbd>exemple_ajax/getTime</kbd> qui devrait vous donner un message : <kbd>XX:YY:ZZ</kbd>.
</p>
<p>
  Et voilà, c'est terminé. Il vous suffit maintenant d'aller sur l'url <kbd>/exemple_ajax/horloge</kbd> 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. 
</p>

	<a name='chapter_2'></a>
  <h2>Conclusion</h2>
	
<p>
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é. 
</p>    ]]></content>
  </entry>
</feed>
