mercredi 3 octobre 2007

Dégradabilité javascript et Ajax dans Symfony avec jQuery

Pour un projet, je suis en train d'utiliser la librairie javascript jQuery dans Symfony, en lieu et place du couple prototype et scripaculous dont je vous avait déjà parlé.

L'idée est ici de ne pas avoir à utiliser les helpers fournis par Symfony (qui mettent en oeuvre exclusivement Scriptaculous) et ainsi d'éviter d'utiliser les deux librairies simultanément sur le projet, mais aussi de décoreller le code javascript des templates et de favoriser une meilleure dégradabilité de ce dernier.

Par exemple, au lieu d'utiliser la fonction link_to_remote() dans notre template, on peut tout à fait imaginer d'employer un bon vieux link_to() des familles et de lui appliquer une classe css qu'on va pouvoir cibler depuis jQuery afin d'effectuer un appel AJAX pointant vers l'url présente dans l'attribut href du lien. Avec un exemple, c'est un peu plus clair :

<?php echo link_to('Mon lien', '@maroute?monparam=mavaleur', array('class' => 'ajax_link')) ?>

Dans un fichier javascript (jQuery doit bien entendu être chargé) :

$(document).ready(function() {
  $('a.ajax_link').click(function()
    {
      $.ajax(
        {
          type: 'post',
          url: $(this).attr('href'),
          success: function(msg)
          {
            alert("Résultat: " + msg);
          }
        });
      return false;
    }
  );
});

Avantage supplémentaire, vous continuez à bénéficier du système de routing Symfony (pas d'urls en dur dans les fichiers javascripts externalisés.)

Là où Symfony va également nous aider, c'est au travers de sa gestion native de la décoration d'une vue en fonction du type d'appel HTTP : le framework va detecter si l'action a été appelée ou non depuis une requête XmlHttpRequest et, si c'est le cas, décorer la vue avec le layout global de l'application et donc présenter à vos utilisateur le résultat escompté, qu'ils aient activé javascript ou non pour surfer sur votre site.

Si vous désirez mettre à jour un élément de l'arbre DOM avec le contenu reçu d'une requête Ajax, voici une autre petite astuce ; on va utiliser une ancre dans l'url et s'en servir comme argument décrivant l'id DOM qu'on veut mettre à jour :

<?php echo link_to('Mon lien', '@maroute?monparam=mavaleur#mon_div', array('class' => 'ajax_link')) ?>
<div id="mon_div" style="display:none"></div>

Et en javascript :

$(document).ready(function() {
  $('a.ajax_link').click(function()
    {
      var href = $(this).attr('href');
      var target = href.substring(href.lastIndexOf('#'), href.length);
      $.ajax(
        {
          type: 'post',
          url: href,
          success: function(msg)
          {
            if ($(target))
            {
              $(target).html(msg).show('slow');
            }
          }
        }
      );
      return false;
    }
  );
});

Note : on aurait pu aussi détourner l'attribut target à cette fin mais ce dernier n'est pas valide en XHTML strict.

Bien entendu, ceci n'est qu'un microscopique aperçu de l'étendu des possibilités de jQuery et de son intégration possible avec Symfony (ou d'autre frameworks et langages, bien entendu.)

dimanche 12 mars 2006

Une messagerie instantanée embarquée à votre site

[Via Scoopeo]

Gabbly est un truc de dingue. Ce n'est ni plus ni moins qu'un client de messagerie instantanée tout javascript et AJAX intégrable à tout site qui en fait potentiellement la demande. Fil RSS des conversations inclus, cela va de soi. C'est gratuit, c'est sympa, c'est top.

Pour essayer le service sur ce site, cliquez ici. Pour le fil RSS, c'est par là.

mardi 14 février 2006

En vrac

Pfiouuuu, pas vraiment le temps de bloguer ces derniers temps, donc voila une petite selection en vrac de liens interessants...

Ah, oui, je prépare un tuto pour Rails, mais ça fait quatre fois que je le réécris car à chaque fois je trouve une méthode encore plus simple... Just be patient.

dimanche 20 novembre 2005

Bouse 2.0

Ajax, c'est mieux quand ça marche, ça évite de passer pour des brêles en profitant du buzz.

Un gros bug Ajax

dimanche 6 novembre 2005

Calendes, riez !

Lecteur, mon ami, tu vas peut-être pouvoir m'aider : je cherche desespéremment une solution en ligne de gestion d'agenda. Dans mon ancien boulot, je bavais d'envie devant les fonctionnalités d'iCal sur Mac. Je voudrais retrouver la même chose, mais si possible en ligne, avec moult AJAX pour l'utilisabilité au quotidien et le plaisir des yeux. Genre la fonctionnalité qui tue : dessiner ses rendez vous sur le calendrier, à la dizaine de minute près, sans passer par d'immondes boites de dialogue de sélection de dates. Idéalement, il supporte un format ouvert comme iCalendar pour éventuellement partager l'agenda et travailler collaborativement.

Bon, pour vous épargner de vains efforts, voila ce que j'ai déjà testé :

Lire la suite...

dimanche 26 juin 2005

Debugging AJAX facile avec Firefox

Peut-être cette astuce est-elle déjà archie connue de tous, mais moi je suis drôlement content de l'avoir trouvée : je développe beaucoup en AJAX ces derniers temps, et lorsque l'on injecte du contenu dynamique via javaScript dans un élément de l'arbre DOM, il est très difficile de voir le code source HTML du contenu injecté.

Heureusement, Firefox dispose d'un outil fort pratique : la possibilité de voir la source HTML de la sélection (menu contextuel clic-droit sur une selection dans une page). L'avantage de cette fonctionnalité est qu'elle affiche la source du contenu chargé post-traitement, c'est à dire notamment après nos fameuses injections ! D'ailleurs cela marche également avec le contenu généré par javaScript seul :)

Lire la suite...

jeudi 16 juin 2005

Moteur de recherche sympa : A9

En fouinant dans mes referers, je suis tombé sur un moteur de recherche dont j'ignorais jusqu'ici l'existence : A9. Je dois dire que c'est la première fois depuis belle lurette que je me dis : Wow, voilà peut-être une alternative sérieuse et crédible à Google !.

A9 fait la part belle aux dernières technologies comme AJAX, c'est un vrai régal à utiliser. Sans compter la présence de colones de résultats spécifiques (images, vidéos, livres, réfénrences, définitions, pages jaunes, et des centaines d'autres types de filtrages - tous configurables après une inscription auprès d'Amazon.com[1]).

Seuls petits reproches pour l'instant, l'impossibilité de filtrer les résultats par langue et - comme souvent hélas - la présence de publicités en tête des pages de réponses (vite, un script Greasemonkey ^^').

Edit

Il y a même une extension Firefox dédiée : A9 Toolbar.

Comme le fait remarquer neolao, A9 est finalement plus un gestionnaire de recherches qu'à proprement parler un moteur. Quoi qu'il en soit, l'utilisation d'AJAX y est vraiment interessante à étudier :)

Notes

[1] A9 est une entreprise du groupe Amazon.

jeudi 14 avril 2005

Ne vous fiez pas à son nom : SproutLiner

SproutLiner

Je viens de tomber sur un site proposant un service très interessant, simplissime et potentiellement très utile : SproutLiner (ne riez pas, ça n'est pas sale). Il s'agit d'un gestionnaire de projet en ligne, ultrasimple.

Pour créer un gestionnaire de suivi de projet en ligne, c'est très simple, il suffit d'entrer le nom du projet et d'appuyer sur Entrée. Après, on se retrouve dans une interface sobre permettant d'ajouter ligne et colonnes, listes, checkboxes, champs texte... Tout cela est bien évidemment gavé de XMLHttpRequest, la techno javaScript permettant le rapatriement de données externe dans l'objet DOM de la page en cours de consultation (voir à ce sujet mon billet sur LiveSearch).

Mine de rien, voila un micro-outil permettant de partager une roadmap très simple, pour un projet collectif par exemple. Voire même pour organiser une petite soirée entre ami, ça peut donner ça :

Capture d'exemple d'utilisation du service Sproutliner

Ce qui est interessant avec l'utilisation de XMLHttpRequest que fait ce service, c'est la sauvegarde en temps réel des données au moment même de leur saisie. Impossible de perdre des données !

Bon, pour ceux qui sont interessés pour la soirée chez René, il leur suffit de tapper Soirée Foot chez René dans le champs Registered users :green:

- page 1 de 2