Spip :: Filtre |qr_code
Dans le Hack n°1 je vous proposais de générer un QR Code avec l’url de la page en cours via une requête en Javascript. Cette approche simple à mettre en œuvre avait quand même le problème de faire une nouvelle requête au web service de Google à chaque affichage de la page, ce qui peut être pénalisant en cas de non réponse ou de latence. De plus le Javascript était obligatoire pour que cela fonctionne.
L’approche de ce nouveau Hack est basée sur la création d’un filtre pour Spip. Ce filtre pourra être appliqué à divers éléments et plus seulement à l’url de la page. De plus, ce filtre va gérer un cache et ne fera une requête au web service qu’en cas de besoin, c’est à dire que quand l’image du QR Code sera retournée par le web service elle sera stockée en cache dans le répertoire /local et ne sera regénérée quand cas de modification du contenu du QR Code ou en cas de purge du cache.
Le code ci-dessous est à placer dans le fichier mes_fonctions.php à la racine de votre squelette. Si ce fichier n’existe pas créez-le.
* Filtre pour générer un QRCode à partir d'un texte
*/
function qr_code ( $txt, $dim=200 )
{
// S'il existe pas on crée le répertoire qui va accueillir nos QRCodes
if ( !is_dir( _DIR_VAR."cache-qrcode/" ) )
{
if ( !mkdir ( _DIR_VAR."cache-qrcode/", 0777 ) )
{
spip_log( "impossible de creer le repertoire", "qrcode" );
}
}
// l'url du service web de Google qui va bien
$url = 'http://chart.apis.google.com/chart';
// On colle dans un tableau les arguments pour la requète
$args = array( "cht"=>"qr",
"chs"=>$dim . "x" . $dim,
"chl"=>urlencode($txt)
);
// On crée le context pour la requète
$context = stream_context_create( array(
'http' => array(
'method' => 'POST',
'content' => http_build_query($args)
)
)
);
// Ici on va générer un nom et un chemin pour notre fichier final
$hash = md5(serialize($txt));
$fichier = _DIR_VAR."cache-qrcode/qrcode-$hash.png";
// Si notre fichier n'existe pas on requète le service et on crée le fichier
if ( !is_file( $fichier ) ){
file_put_contents( $fichier, file_get_contents( $url, false, $context ) );
}
// On retourne un tag image avec la source qui va bien
return "<img src='$fichier' alt='' width='$dim' height='$dim' />";
}
Pour utiliser notre filtre dans un squelette rien de bien compliqué :
Par défaut la taille du QR Code est de 200px de coté mais on peut également la lui imposer :
Pour plus d’information sur comment utiliser les QR Code et comment formater les informations que vous allez y stocker, vous pouvez consulter cette documentation BarcodeContents.
Voila, à vous de jouer.
Vos commentaires
1. Le 3 novembre 2010 à 16:08, par matiasgrenn
Bonjour,
Merci beaucoup pour ce code qui fonctionne partiellement sur mon site car j’obtiens une url de ce style :
http%3A%2F%2Fles-ombres.sprechgesang.net%2FLe-journal-Implications.html
au lieu d’être rediriger vers
http://les-ombres.sprechgesang.net/...
à moi de regarder quel filtre php changer pour cela mais bon pour l’instant ce n’est pas urgent...
en tous cas beau travail !
2. Le 3 novembre 2010 à 16:40, par matiasgrenn
bonjour,
j’ai remarqué que c’était le "chl" qui me proposait une url avec http%3A... mais même en mettant : "chl"=>rawurldecode(urlencode($txt))
lorsque je fais un echo mon url est bonne mais mon qrcode me propose toujours la même url http%3A...
MatiasG
3. Le 3 novembre 2010 à 16:42, par matiasgrenn
Rebonjour encore,
la dernière solution est la bonne ! Comme souvent il suffisait de vider le cache !
MatiasG
Répondre à cet article
Suivre les commentaires :
| 