Aller au contenu

Archive de mai, 2010

22
mai

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).

Voir l’exemple

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!

Télécharger les sources

22
mai

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!

8
mai

Barre de progression pour upload en PHP/AJAX/APC

Dans ce nouvel article, nous allons voir comment utiliser le cache APC (voir ici pour son installation), afin de réaliser une barre de progression lors de l’upload de vos fichiers. L’utilisation de cette méthode apporte de nombreux avantages:

  • elle met en attente l’utilisateur sans pour autant geler le navigateur ;
  • l’utilisateur peut voir la progression de l’upload ;
  • il n’y a plus de limite en terme de poids.

Toutefois, il faut des connaissances solides en PHP et JavaScript, comprendre le fonction asynchrone en AJAX, et je ne parle même pas du fonctionnement du cache APC.

Je ne vais pas détailler tout le code à mettre en place ou mon article serait trop long et fastidieux à lire. En revanche j’ai pris la peine de réaliser un petit schéma explicatif. Les images sont libres de droits et téléchargées ici.

Si vous avez bien compris, tout se passe de manière asynchrone en AJAX. Pour faire simple, le navigateur n’a pas été rechargé, mais au moins une requête a été envoyée au serveur (1). Cette requête à pour but de lancer un script PHP, qui va consulter le cache APC (2) et nous retourner diverses informations (nom du fichier, son poids total etc…). Une fois toutes ces informations récupérées, le navigateur (le code JavaScript en réalité) va lire la réponse du serveur, qui se trouve être du JSON très facile à utiliser pour nos besoins. Il nous reste plus qu’à mettre à jour (3) notre barre de progression.

Voici le résultat pour le même fichier à transférer:

Composition des sources:

  • ./js/prototpye/*
  • ./js/scriptaculouts/*
  • ./js/img/*./js/cupload.js
  • ./js/cprogressbar.js
  • ./js/cprogressbar.css
  • ./upload/
  • ./index.html
  • ./upload.php

Le code JavaScript qui gère l’upload (AJAX + Barre de progression) se trouve dans le fichier cupload.js. Le script appelé pour la consultation du cache APC et qui retourne du JSON est dans upload.php.

Ces sources datent de l’année dernière, je les ai adapté pour réaliser ce petit tuto. Il y a des améliorations à apporter notamment au niveau de la validation des fichiers (jpg, jpeg, png etc…). En effet il serait dangereux voire suicidaire d’autoriser l’upload de fichiers PHP par exemple. N’oubliez pas de donner les droits suffisants au répertoire upload qui va contenir tous vos fichiers transférés. Dans un prochain tuto, nous verrons la démarche à suivre pour réaliser le même type d’upload (avec barre de progression) mais avec Flex cette fois-ci!

Télécharger les sources