Carnet Wiki

CreerUnCritere ( avec pipeline pre_boucle )

Version 4 — Octobre 2015 JLuc

| NouveauCompilo | NouvelleBoucle | NouvelleBalise | InterfaceEtUsages | CreerUnCritere

Question Philippe :

<blockquote class="spip_poesie">
Bonjour !
Sous 1.8pr1 :
- J’ai un champ #NOM_SITE qui contient une liste d’id_article
séparés par des points virgules. Ex : 66 ;58
- Je fais :
La boucle b ne renvoie que le premier n° (66).
Le séparateur peut être ; ou , ou | ou ... c’est pareil.
La requête MySQL est ainsi faite :
SELECT articles.id_article,
FIND_IN_SET(articles.id_article, « ’66 ;58’ ») AS rang, articles.lang
FROM spip_articles AS articles
WHERE articles.id_article IN (’66 ;58’)
AND articles.statut=’publie’
AND articles.date < NOW()
ORDER BY rang
(Que je mette #NOM_SITE ou #NOM_SITE*, les guillemets
simples sont tjrs là, et le résultat est le même)
Une idée ?
</blockquote>

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.

Contexte

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.

Données disponibles

- $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])

Accéder à l’environnement

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 !