Comprendre AJAX à l’aide de jquery
On ne présente plus le framework jquery tant il est utilisé à travers le web, aussi bien pour les possibilités qu’il offre coté client, que pour sa facilité d’utilisation. Pour plus d’informations, visitez le site officiel ici.
Dans cet article, je vais l’utiliser pour réaliser de petits traitements en AJAX, récupérer l’heure du serveur et votre adresse IP de manière asynchrone (aucun rafraichissement de votre navigateur).
Pour synthétiser le fonctionnement, jquery va envoyer des informations au serveur via la méthode POST ou GET, puis récupérer un résultat (la réponse). Vous l’aurez donc compris, il nous faudra aussi un fichier PHP pour récupérer l’action à réaliser.
Coté client (code javascript):
<script type="text/javascript">
$(document).ready (function () {
var ajax = function (a, callback) {
$.ajax ({
url: 'ajax.php',
type: 'POST',
data: ({action:a}), // Paramètre POST
success: function (data) {
callback (data);
}
});
} // ajax ();
// ... autres fonctions ...
var alert_heure = function (data) {
alert ('Heure du serveur: '+data.heure);
} // alert_heure ();
$('button.heure').click (function () {
ajax ('heure', alert_heure);
});
});
</script>
$(‘button.heure’) correspond à l’élément HTML <button/>, et heure à sa classe (voir les sources HTML). Sur ce bouton, j’y applique un écouteur ‘onclick’ qui sera déclanché lorsque l’utilisateur cliquera sur ce bouton.
Lors du clique, ma fonction ‘ajax’ est appelée, c’est elle qui se charge de réaliser ma requête AJAX à l’aide de jquery. Le premier paramètre va permettre à mon script PHP de trouver le traitement à réaliser, le second, est une fonction callback qui sera appelée lorsque le serveur m’aura retourné une réponse. Je procède de la sorte dans un souci de généricité, car dans la pratique de ce tuto, il y aura 2 types de requête bien différentes, afficher l’heure du serveur ou votre adresse IP.
Après une rapide analyse du code, vous observez que c’est le fichier ‘ajax.php’ qui sera lancé coté serveur.
Coté serveur (code php):
$action = $_POST['action'];
// ...
switch ($action) {
case 'heure':
echo echoJSON (array ('heure'=>date ('H\hi\ms\s')));
break;
case 'ip':
echo echoJSON (array ('ip'=>$_SERVER['REMOTE_ADDR']));
break;
}
Après avoir analyser le type d’action à réaliser switch ($action) {}, notre script PHP va se contenter d’afficher un résultat avec ‘echo’, c’est la réponse, et c’est ce que réalise la fonction echoJSON ();. J’ai pris pour abitude de structurer mes données dans du JSON, c’est plus propre et plus facilement maniable.
Conclusion
jquery nous simplifie la vie, à mes débuts, ce type de framework n’existait pas encore et il fallait tout développer soit-même, pour obtenir un résultat qui ne fonctionnait pas forcément sur tous les navigateurs et avec beaucoup moins de possibilités!
Cependant, jquery n’est pas le seul framework proposant ce type de fonctionnalité, il y a aussi prototype et sciptaculous que j’utilisais beaucoup autrefois mais qui restent à mon sens, beaucoup moins performants que jquery.
Cet exemple montre une infime partie des possibilités offertes par AJAX. Puisqu’un script PHP est appelé, pourquoi ne pas consulter une base de données, générer des fichiers textes voire des images … les possibilités sont infinies!
Migration sous wordpress
Pour des raisons techniques, il fallu migrer le contenu de mon blog qui était sous dotclear v2, vers du wordpress.
En effet, dotclear n’est apriori pas compatible avec la version 5.3 de PHP. Après quelques recherches sur le net, j’ai appris à ma grande surprise que cela venait d’un problème lié aux paramètres passés par référence dans une fonction.
Le passage par référence, évite la copie du contenu d’une variable lorsque cette dernière est utilisée dans une fonction.
function incr_1 ($a) {++$a;}
$v1 = 1;
incr_1 ($v1);
echo $v1; // Affiche 1.
function incr_2 (&$a) {++$a;}
$v2 = 1;
incr_2 ($v2);
echo $v2; // Affiche 2.
Si vous avez bien analysé le code ci-dessus, vous comprenez que le paramètre de incr_1 est passé par copie, et celui de incr_2 par référence. En d’autres termes, dans incr_2 c’est la variable $a en mémoire qui est bien incrémentée.
Or en PHP, il était aussi possible de faire ceci:
function incr_1 ($a) {++$a;}
$nb = 1;
incr_1 (&$nb);
echo $nb; // Affiche 2.
Le procédé était identique, sauf que le passage par référence se réalisait au moment de l’appel de la fonction incr_1, ce qui désormais, depuis la version 5.3 de PHP est interdit! Donc ne fonctionne plus sous dotclear.
Bien entendu, un correctif va très prochainement être apporté si ce n’est pas déjà le cas au moment où je rédige cet article. D’ailleur, j’ai eu le droit à un tweet d’un certain Noé Cendrier, me conseillant d’installer une nightly build de dotclear … des fois que … mais en production, je préfère travailler sur du stable plutôt que sur du béta. Mais ça n’engage que moi!
Pour ce qui est de mes anciennes URL sous dotclear qui commençaient à être relativement bien référencées par google, j’ai dû patcher wordpress afin qu’il réalise une redirection permanente de mes anciennes URL. Et oui, les url sous wordpress sont différentes!
$redirect_http_patch = true;
switch ($_SERVER['REQUEST_URI']) {
case 'ancienne_adresse':
header ('Location: nouvelle_adresse');
break;
// ... etc ...
default: $redirect_http_patch = false;
}
if ($redirect_http_patch) {
header ('HTTP/1.0 301 Moved Permanently');
exit;
}
Un peu barbare je l’avoue, surtout s’il y a une 50aines d’articles, fort heureusement, j’en suis encore loin! Désormais, il ne me reste plus qu’à Françiser le thème que j’ai installé … une autre histoire!




