Des nouvelles de jQuery Update
D'abord, une mise à jour un peu tardive : le module jQuery Update pour Drupal 5 est sorti avec jQuery 1.2.6 (la version actuelle!). Merci à tous ceux qui ont pris les choses en main, en particulier Steve McKenzie, devenu co-mainteneur, et sun, qui a poussé cette version rc1. Je crois que tous les bogues connus que le nouveau jQuery causait dans les fichiers js du cœur, comme upload.js, collapse.js et d'autres, ont été complètement éliminés, mais les modules contribués enrichis de jQuery sont évidemment une tout autre histoire. J'ai appris à mes dépens que la mise à niveau vers 1.2.6 brise complètement TinyMCE, un module qui, malheureusement, ne reçoit pas beaucoup d'attention de son mainteneur ces temps-ci. Sans trop m'éloigner du sujet, un nouveau module de contrôle et d'API/cadre WYSIWYG, appelé Wysiwig, est en développement par sun et quicksketch; son but est « de fournir des hooks génériques pour implémenter les plugiciels des modules contribués avec les éditeurs de contenu ». On dirait donc que les jours du module TinyMCE sont comptés de toute façon.
Pendant ce temps, au pays de Drupal 6
La version de jQuery livrée avec Drupal 6 accuse déjà son âge : elle a maintenant trois versions de retard et il lui manque donc d'importantes corrections de bogues. Heureusement, webchick s'est affairée à porter le module jQuery Update vers D6, qui peut donc lui aussi profiter de la dernière version. Et grâce à une magie de prétraitement de page que je n'ai pas encore tout à fait saisie, utiliser le module n'exige pas de copier de nouvelles versions des fichiers js dans votre répertoire misc : il suffit de l'activer, et c'est réglé. Le module modifie la variable $scripts pour que les balises script produites pointent vers les nouveaux fichiers js du sous-répertoire /replace du module, plutôt que vers les anciens du répertoire misc. Et comme si ce n'était pas assez pratique, il vous permet même de choisir entre les scripts jQuery compactés (packed), minifiés ou non compressés. Wow.
Section d'exemples pointus
<technicalJargon>
Dans le dernier billet, nous avons examiné Drupal.behaviors et vu comment cette nouvelle propriété de l'objet js Drupal rend les liaisons jQuery sur du contenu généré par AJAX simples comme bonjour. Dans ce billet-ci, je voulais explorer Drupal.themes. Sauf qu'il ne semble rien y avoir à explorer. Dans Drupal.js, l'objet Drupal est initialisé comme suit :
var Drupal = Drupal || { 'settings': {}, 'behaviors': {}, 'themes': {}, 'locale': {} };
J'ai vu Drupal.settings, Drupal.behaviors et même Drupal.locale à l'œuvre, mais j'ai passé toute mon installation D6 au grep et je n'ai trouvé aucune référence à Drupal.themes. J'imagine qu'il s'agit d'une propriété réservée en prévision d'un usage futur. Si quelqu'un en sait davantage, merci de nous éclairer. Drupal.theme, par contre (notez l'absence du « s »), fait très certainement partie de la vie js dans Drupal. C'est l'équivalent JavaScript de la fonction theme côté serveur. Voici à quoi elle ressemble :
Drupal.theme = function(func) {
for (var i = 1, args = []; i < arguments.length; i++)
{
args.push(arguments[i]);
}
return (Drupal.theme[func] || Drupal.theme.prototype[func]).apply(this, args);
};
Ainsi, lorsque vous appelez Drupal.theme(), vous passez un nom de fonction comme premier argument, et tous les arguments suivants seront transmis à cette fonction. La fonction que vous passez devra être un objet prototype de Drupal.theme, dont voici un exemple :
Drupal.theme.prototype.myThemeFunction = function (left, top, width) {
var myDiv = '<div id="myDiv" style="left:'+ left +'px; top:'+ top +'px; width:'+ width +'px;">';
myDiv += '</div>';
return myDiv;
};
Et voici comment l'appeler :
Drupal.theme('myThemeFunction', 50, 100, 500);
Voyez ici la documentation officielle à ce sujet.
Une autre fonction Drupal côté serveur qui a fait le saut côté client est la fonction t(). Drupal.t() traduira les chaînes de votre code js à l'aide de la propriété Drupal.locale, qui devrait avoir été remplie avec toutes les chaînes requises par le module Language, à condition que toutes vos traductions soient bien configurées.
</technicalJargon>
De nouvelles utilisations formidables de jQuery dans l'administration de Drupal
Les boîtes de dialogue modales en superposition js font fureur ces temps-ci. Nous avons Thickbox et Lightbox depuis un bon moment, mais ce type de superposition est aussi très utile pour améliorer la convivialité de l'interface d'administration. La bibliothèque jQuery User Interface, pour laquelle il existe maintenant un module Drupal, encore une fois grâce à webchick, permet de transformer à peu près n'importe quoi en une telle boîte de dialogue. Apparemment, c'est aussi simple que « $("#myDiv").dialog(); », mais je ne parle pas d'expérience, car je n'ai pas encore eu l'occasion de l'essayer. Toutefois, starbow travaille à intégrer cette fonction à l'interface d'administration de Drupal, et elle fera, espérons-le, partie du cœur de Drupal 7. Pour citer le fil de discussion du problème :
Ce correctif règle le problème de convivialité de la page des blocs, qui survient lorsqu'un utilisateur a apporté des modifications, puis clique sur un lien comme « configurer » et perd tout son travail. Il le fait en introduisant l'infrastructure des boîtes de dialogue modales et en créant une boîte de dialogue « Non enregistré » qui peut être appliquée aux liens d'une page comportant des modifications non enregistrées. Cette boîte de dialogue offre à l'utilisateur la possibilité d'enregistrer son travail, de continuer en perdant ses modifications, ou d'annuler.
Mais il permet aussi d'exploiter la fonctionnalité générale de boîte de dialogue ailleurs sur le site. Comme ce changement n'a pas été intégré à Drupal 6, starbow en a fait un module, qui implémente des boîtes de dialogue sur la page des alias d'URL. L'administration des alias d'URL devient ainsi incroyablement rapide et facile et, une fois qu'on l'a vu en action, il ne faut pas beaucoup d'imagination pour voir comment on pourrait l'appliquer à bien d'autres pages d'administration, et à d'autres pages aussi. Et avec des sites comme Facebook qui ont rendu ce type d'interface extrêmement courant, c'est formidable de pouvoir maintenant l'implémenter si facilement dans Drupal.