Carnet Wiki

CreerUnCritere avec pipeline pre_boucle

Version 6 — Octobre 2015 JLuc

| NouveauCompilo | NouvelleBoucle | NouvelleBalise | InterfaceEtUsages | Créer un nouveau critère | Accéder à l’environnement

Elements de compréhension utiles sur la manière d’écrire des critères + accéder à l’environnement

2015 : Cette analyse a été réalisée à partir du code du critère pages_pre_boucle($boucle). Elle complète l’introduction aux critères qui présente la définition d’un critère en se servant des fonctiuon critere_.

Contexte

Rappel : 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, le plus simple est sûrement de définir une fonction critère_nomducritere, mais on peut aussi glisser un code de traitement dans le pipeline pre_boucle : c’est ce qu’on illustre ici.

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

Voir aussi :
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\"'");