Oui mais non, c’était pas si simple mais pas beaucoup plus compliqué non plus ;-)
En fait la soluce que j’ai donnée, n’en est pas une car elle exécute le code php au moment où le squelette est compilé (analysé et son cache généré). Alors que le code doit l’être quand le cache du squelette est exécuté, càd quand le cache de l’article, rubrique, brève... est généré. En effet, je veux pouvoir substituer la variable php par sa valeur au moment où le cache de l’article est généré, càd quand le cache du squelette est exécuté, pas quand il est compilé, opération qui ne se fait normalement que si on modifie le squelette.
Oubliez la modif renseignée plus haut, le code ne s’exécute que quand le squelette est modifié avec la valeur de la variable à ce moment là. Les autres appels ne tiendront pas compte du paramètre passé dans l’url et reprendront tjs sa valeur au moment de la compile du squelette.
J’ai un peu farfouillé dans les sources de spip et je comprends mieux le fonctionnement de son cache à deux niveaux : squelette et contenu (article, rubrique, brève...). J’ai trouvé une soluce qui convient à mes besoins, à savoir utiliser une variable php dans un critère de boucle. Ca passe par l’utilisation du tableau $contexte partagé par les fonctions du squelette compilé (en cache) et qui permet de rendre la variable disponible dans la boucle, du moins dans la partie qui calcule la requête SQL qui m’intéresse.
On repart de la version distribuée de spip 1.6. Les modifications à apporter à "inc-calcul-squel.php3" :
– Renommer la fonction "calculer_texte" en "calculer_texte1"
– Ajouter cette nouvelle fonction "calculer_texte" :
//
// Extraire du texte le code php entre balises <SPIP_PHP> et </SPIP_PHP>
//
// extension par Jean-Christophe Godart
//
function calculer_texte($texte)
{
$code = "";
while(($b1 = strpos($texte, '<SPIP_PHP>')) !== false) {
$b2 = $b1 + strlen('<SPIP_PHP>');
if(($e1 = strpos($texte, '</SPIP_PHP>', $b2)) === false) {
break; // erreur : pas de balise de fin
}
$e2 = $e1 + strlen('</SPIP_PHP>');
$code .= calculer_texte1(substr($texte, 0, $b1));
$code .= substr($texte, $b2, $e1-$b2);
$texte = substr($texte, $e2);
}
$code .= calculer_texte1($texte);
return $code;
}
Dans le squelette html, il faut ajouter au tableau $contexte[] les variables utilisées plus loin. On peut simplement y transférer les paramètres de la page appelée. Par ex dans "article.html", ajouter un code du genre :
<SPIP_PHP>
$contexte['monparam'] = $HTTP_GET_VARS['monparam'];
</SPIP_PHP>
Il faut ajouter ce code avant que la variable ne soit utilisée par une boucle pour qu’elle y soit disponible. Au besoin, vous pouvez faire des calculs, appels de fonctions ou tout autre code php pour la calculer. Ce qui importe, c’est que la variable se retrouve dans le tableau $contexte avec comme indice son nom, dans notre exemple $contexte[’monparam’]. Elle sera alors normalement disponible dans toutes les boucles qui suivent en tant variable locale, dans notre exemple $monparam.
Pour utiliser la variable dans une boucle de votre squelette html, il suffira de la reprendre comme "$monparam", pas besoin de balises ni de echo, simplement la variable précédée du $. Par ex dans "article.html" :
<BOUCLE_articles(ARTICLES) {id_rubrique} {titre==^[$monparam]} {par titre}>
...
</BOUCLE_articles>
Je n’ai essayé cette modification que dans un critère de boucle et cela marche bien pour moi. Je n’ai pas essayé pour d’autres balises SPIP, mais c’est possible que cela marche aussi. Néanmoins, la commande <INCLURE()>
de SPIP, semble traitée différemment et c’est probable qu’il faille une autre méthode.
Je me suis basé sur la version 1.6 de SPIP. Il est possible que d’autres versions fonctionnent autrement.
La config php que j’ai utilisé est celle de apinc.org (php 4.3.1), mais le code est très simple et devrait tourner sous d’autres versions de php, y compris php 3.
Cette modification du code n’a pas été testée en profondeur, mais elle ne devrait pas produire d’effet désatreux, sauf peut être si votre code php entre balises <SPIP_PHP>
est désastreux !
En espérant être utile,
Jean-Christophe Godart