ESJ nous a fait un topo sur les entrailles du compilateur. Technique et ardu, je ne reproduis pas ici l’ensemble de ses propos, surtout que ça repose sur un schéma au tableau !...

Une application pratique
Utiliser une boucle sur une table mysql crée par l’utilisateur
Il n’est pas nécessaire de paramétrer quoi que ce soit.
Exemple :
vous créez une table contacts, avec les champs id_contact, nom, prenom, adresse au moyen de phpmyadmin ;
Vous pouvez ensuite dans vos squelettes directement utiliser des :
<BOUCLES_mescontacts(CONTACTS){nom=toto}>
#ID_CONTACT : #NOM : #PRENOM <br/>
</BOUCLES_mescontacts>Cela marche parce que SPIP, ne connaisant pas la table contacts par défaut, va rechercher dans votre base mysql si elle existe. La trouvant, il va s’en servir, et associer automatiquement les balises #ID_CONTACT, #NOM, #PRENOM aux champs respectifs id_contact, nom, prenom.
Attention : l’utilisation de nom de champs majuscules peut poser des petits problèmes de compréhension par le compilateur. Il est donc prudent d’utiliser des noms de champs en minuscule.
Les Critères
Comme vu ci-dessus, les critères correspondant au nom des champs sont automatiquement supportés. Toutefois vous pouvez définir des critères personalisés pour répondre à d’autres besoins.
Ceci se fait au moyen d’une fonction critere_xxx avec xxx le nom du critère
Exemple du critère origine_traduction :
// {origine_traduction}
// http://www.spip.net/@origine_traduction
function critere_origine_traduction_dist($idb, &$boucles, $crit) {
$boucle = &$boucles[$idb];
$boucle->where[] = $boucle->id_table.".id_trad = "
. $boucle->id_table . '.' . $boucle->primary;
}Ce critère permet de rechercher les articles dont id_trad correspond à l’id_article du contexte de la boucle.
Pour cela, il rajoute une condition where a la requete sql qui sera génrée par la boucle, ceci se fait en ajoutant un élément au tableau $boucle->where :
$boucle->id_table.".id_trad = ". $boucle->id_table . ’.’ . $boucle->primary ;
$boucle->id_table : le nom de la table
$boucle->primary : la clé primaire de la table, id_article ici
Et hop emballé c’est pesé !
Bonus !
Et même, _fil_ a ajouté une « feature » en live :
function critere_origine_traduction_dist($idb, &$boucles, $crit) {
$where = $boucle->id_table.".id_trad = "
. $boucle->id_table . '.' . $boucle->primary;
if ($crit->not)
$where = "NOT($where)";
$boucle->where[] = $where;
}Pour supporter la syntaxe !id_trad
Voyez comme ça valait pas le coup de s’en priver !

























