Cookies et SPIP : la ruse de sioux

Comment, dans SPIP, servir des squelettes différents selon qu’on a ou non un cookie ?

Pour la version 6 de ce site, je voulais non seulement faire du design réactif (responsive design) mais ce n’est pas suffisant : il faut qu’un utilisateur puisse poser un cookie quand il veut explicitement une version mobile (pour charger le moins possible de scripts, de CSS, et des images retaillées sur le serveur plutôt que de grosses images redimensionnées via CSS).

Je creuse dans Spip et je finis par découvrir au détour d’une archive de forum qu’on peut évaluer des variables HTTP directement dans Spip, comme ceci :

#SET{mobile,#EVAL{$_COOKIE['mobile']}}

Mais comme Spip est une brave bête, il met tout en cache. Ainsi donc mon visiteur 1 arrive avec son cookie sur une page lambda, il fait composer par Spip la page « mobile ». Bien, jusque-là ça va.

Et puis ensuite il met en cache. Et donc le visiteur 2, qui n’a pas de cookie, ne verra pas la page classique : il verra la page mise en cache, demandée par le visiteur 1.

Je crie au bug, mais Cédric me sort de derrière les fagots la ruse de sioux, tellement rusée qu’on n’en trouve qu’une toute petite trace dans la documentation (sisisi, regardez bien, cherchez $marqueur dans la page).

Il faut ouvrir votre fichier de configuration dans config/mes_options.php et ajouter la ligne magique :

# gestion des cookies
$GLOBALS['marqueur'] .= ':'.$_COOKIE['mobile'];

Videz votre cache, et le tour est joué. Chaque contexte, avec et sans cookie, générera ses propres fichiers dans le cache. Nous sommes sauvés.

Et donc voilà, nota-bene.org version 6 est en ligne maintenant qu’est résolu cet épineux problème.

Commentaires

  • alice (8 avril 2014)

    merci pour cette astuce bien pratique qui permet de "lire" et "transmettre" le cookie à travers la navigation

    mais comment fais tu pour déposer un cookie dans SPIP ?
    par l’intermediaire d’un filtre ou alors tu passes par du php au détour d’une action ou d’un bouton ou autre chose ?

    Répondre à alice

Qui êtes-vous ?
Votre message

Pour créer des paragraphes, laissez simplement des lignes vides. Tous les liens sortants comporteront un attribut rel="nofollow". Merci de ne pas spammer.