Version 4 — Octobre 2015 — JLuc
| NouveauCompilo | NouvelleBoucle | NouvelleBalise | InterfaceEtUsages | CreerUnCritere
Question Philippe :
<blockquote class="spip_poesie">Réponse Fil :
ce que cherche à faire Philippe, il me semble, c’est à définir un nouveau critère basé sur le PS de l’article. Il faut donc qu’il ecrive un nouvelle fonction critere_montruc()
Elements de compréhension utiles sur à utiliser sous la manière d’écrire des critères forme montruc
2015 : Cette analyse a été réalisée à partir du code du critère pages_pre_boucle($boucle)
et elle est probablement incomplète.
Le compilateur SPIP analyse le source et crée la structure de donnée représentative du squelette, de ses boucles et donc des critères qu’on veut analyser.
Les critères ’maison’ doivent donc respecter la syntaxe SPIP.
Pour les définir, (on peut | il faut) glisser un code de traitement dans le pipeline pre_boucle.
Ce pipeline transmet la structure de donnée $boucle qui contient toutes les informations syntaxiques sur tous les critères de la boucle et permet de les compléter ou modifier. Il faut ici
- détecter si le critère maison est utilisé
- modifier la structure $boucle pour y coder le résultat de l’interprétation du critère maison d’une manière utilisable pour l’exécution du code ensuite.
- $boucle->criteres
contient tous les critères.
Ex : On peut faire foreach($boucle->criteres as $_critere)
pour les examiner un à un
- $_critere->op
contient l’opérateur quand il y a une comparaison :
Ex : {page=3}
=> ’=’
et contient le critère pour les syntaxe raccourcies sinon
Ex : {page}
=> ’page’
{page?}
=> ’page’
- $_critere->param[0][0]->texte
contient l’opérande gauche dans un critère avec opérateur (de comparaison)
Ex : dans {page = 1}
=> ’page’
- Incertain $_critere->param[1][0]->texte
contient la valeur dans le cas d’une comparaison avec une constante
Ex : {page=3}
=> 3
- $_critere->param[1][1]->texte
contient l’expression à évaluer quand la comparaison porte sur une expression avec #
Ex : {page=#ENV{artichaud}}
C’estr ce dont témoigne le log
« Le critère page=xxx accepte à nouveau que xxx soit un ENV ou un GET ou tout autre balise.
pour permettre le calcul d’une balise dans le critère, et pas seulement une constante »
associé à la condition supplémentaire :
AND empty($_critere->param[1][1])
Si on a besoin de tester un élément de l’env on y accède par la pile
Ex 1 : Accéder à la valeur de id_rubrique :
$env_id = "\$Pile[0]['id_rubrique']";
Tester si sa valeur est positive :
$boucle->where[] = array(
"'?'",
"(isset($env_id)?(is_array($env_id)?count($env_id):strlen($env_id)):'')",
"''",
"'articles.id_rubrique>0'");
Incertitude : pourquoi tester si complexement in_array et count et strlen ici ?
Ex 2 : Tester si une rubrique est positive ou = -1
$boucle->where[] = array("'>'", "'articles.id_rubrique'", "'\"0\"'");
$boucle->where[] = array("'='", "'articles.id_rubrique'", "'\"-1\"'");
A ce moment il n’y aura pas à faire appel à une construction complexe
x IN #TRUC qui en effet n’est pas prévue pour ça.
FranckSG : une astuce serait d’utiliser d’autres séparateurs que le point virgule. Avec | il est possible d’utiliser un critere=regex( | ), les expressions régulières sont parfaites dans ce cas !