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

Qui êtes-vous ?
Votre message

Ce formulaire accepte les raccourcis SPIP [->url] {{gras}} {italique} <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Lien hypertexte

(Si votre message se réfère à un article publié sur le Web, ou à une page fournissant plus d’informations, vous pouvez indiquer ci-après le titre de la page et son adresse.)