Je suis en train de terminer un plugin Spip (version 2.0.9) qui a pour
principe d'afficher des pages dynamiques et qui se base sur le pipeline
"pre_liens". Je dois utiliser ce pipeline car c'est le premier qui reçoit le
source de l'article tel qu'il est enregistré en base de données. Pour être
sûr qu'il est exécuté sur un article, je vérifie l'existance de
$GLOBALS['contexte']['id_article'].
Pour que les pages soient dynamiques, j'ai besoin d'annuler la fonction
cache pour les articles qui y font appel. Pour empêcher le cache d'un
article depuis un pipeline "pre_liens", je n'ai trouvé qu'un seul moyen,
c'est d'ajouter le code : $GLOBALS['delais'] = 0; dans le plugin. Sans cette
ligne de code, le plugin n'est pas exécuté quand l'article est en cache.
Cela marche bien, mais à ma grande surprise, je me rend compte que le plugin
est appelé deux fois sur le même contenu lorsqu'on consulte un article.
Après quelques enquêtes, j'ai constaté que c'est le résultat du second appel
qui est affiché. Les variables globales PHP sont presque les mêmes à
quelques exceptions près :
* Premier appel :
$mode_abs_url='texte'
$CHARSET est un tableau vide
* Seconde appel :
$mode_abs_url='url'
$CHARSET est un tableau remplie
Variables supplémentaires : $marqueur_notes, $puce, $idx_lang et
$i18n_public_fr.
Côté Spip, le pipeline n'est appelé que dans expanser_liens(), définie dans
"ecrire\inc\lien.php".
Elle-même appelée uniquement dans propre(), définie dans
"ecrire\inc\texte.php"
J'en viens donc à mes questions :
Savez-vous pourquoi cette fonction est appelée deux fois avec le contenu de
l'article ?
Est-ce normal ?
Ya-t-il un autre moyen d'empêcher le cache d'un article depuis un plugin
basé sur "pre_liens" ?
Merci si vous connaissez la réponse,
Et en tout cas, bonne journée à vous,
Je suis en train de terminer un plugin Spip (version 2.0.9) qui a pour
principe d'afficher des pages dynamiques et qui se base sur le pipeline
"pre_liens". Je dois utiliser ce pipeline car c'est le premier qui reçoit le
source de l'article tel qu'il est enregistré en base de données. Pour être
sûr qu'il est exécuté sur un article, je vérifie l'existance de
$GLOBALS['contexte']['id_article'].
J'ai peur que ton code soit assez contraire au fonctionnement même de SPIP.
Est-ce qu'un même contenu ne produit pas un même résultat à chaque fois ?
Peux tu décrire exactement ce que fait ton plugin, et pourquoi tu as choisi cette solution technique ?
Pour que les pages soient dynamiques, j'ai besoin d'annuler la fonction
cache pour les articles qui y font appel. Pour empêcher le cache d'un
article depuis un pipeline "pre_liens", je n'ai trouvé qu'un seul moyen,
c'est d'ajouter le code : $GLOBALS['delais'] = 0; dans le plugin. Sans cette
ligne de code, le plugin n'est pas exécuté quand l'article est en cache.
Le vilain hack sur la $GLOBALS['delais'] n'est pas garanti fonctionnel.
J’ai peur que ton code soit assez contraire au fonctionnement même de SPIP.
Est-ce qu’un même contenu ne produit pas un même résultat à chaque fois ?
Peux tu décrire exactement ce que fait ton plugin, et pourquoi tu as choisi cette solution technique ?
A la demande de plusieurs développeurs, je développe un plugin d’article dynamiques pour SPIP.
Il s’agit de pouvoir ajouter des fonctionnements applicatifs par l’intermédiaire des pages articles. La solution est basée sur un moteur de template (TinyButStrong en l’occurence). J’ai déjà développé un tél plugin pour les CMS pmWiki et Joomla.
Par sa nature même, ce plugin a donc besoin de pouvoir empêcher la mise en cache de l’article. Je n’ai pas eu de soucis pour les autres CMS, mais bien sûr chaque solution a sa philosophie.
Pour empêcher le cache d’un article depuis un pipeline « pre_liens », je n’ai trouvé qu’un seul moyen,
c’est d’ajouter le code : $GLOBALS[‹ delais ›] = 0; dans le plugin. Sans cette
ligne de code, le plugin n’est pas exécuté quand l’article est en cache.
Le vilain hack sur la $GLOBALS[‹ delais ›] n’est pas garanti fonctionnel.
Ok, mais qu’est ce qui est garanti fonctionnel alors ?
J’ai trouvé l’ordonnancent des pipelines et leur fonctions texchniques en allant voir le code source, la doc officielle est trop timide sur ce point.
Bon ben j'ai finalement basé le plugin sur le pipeline "affichage_final", il
semble que ce soit celui là le plus préposé pour le besoin de mon plugin.
Pour que ça marche, je dois nettoyer un peu l'article avant de le traiter,
mais c'est moins galère que le plugin "pre_liens". Mais au final ça marche
bien, et je profile un peu du cache de l'article.