SPIP 1.9 - Le Compilateur

Les entrailles de SPIP...

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 !

Discussion

Aucune discussion

Ajouter un commentaire

Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :

  • Désactiver tous les plugins que vous ne voulez pas tester afin de vous assurer que le bug vient bien du plugin X. Cela vous évitera d’écrire sur le forum d’une contribution qui n’est finalement pas en cause.
  • Cherchez et notez les numéros de version de tout ce qui est en place au moment du test :
    • version de SPIP, en bas de la partie privée
    • version du plugin testé et des éventuels plugins nécessités
    • version de PHP (exec=info en partie privée)
    • version de MySQL / SQLite
  • Si votre problème concerne la partie publique de votre site, donnez une URL où le bug est visible, pour que les gens puissent voir par eux-mêmes.
  • En cas de page blanche, merci d’activer l’affichage des erreurs, et d’indiquer ensuite l’erreur qui apparaît.

Merci d’avance pour les personnes qui vous aideront !

Par ailleurs, n’oubliez pas que les contributeurs et contributrices ont une vie en dehors de SPIP.

Qui êtes-vous ?
[Se connecter]

Pour afficher votre trombine avec votre message, enregistrez-la d’abord sur gravatar.com (gratuit et indolore) et n’oubliez pas d’indiquer votre adresse e-mail ici.

Ajoutez votre commentaire ici

Ce champ accepte les raccourcis SPIP {{gras}} {italique} -*liste [texte->url] <quote> <code> et le code HTML <q> <del> <ins>. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Suivre les commentaires : RSS 2.0 | Atom