GrabDuck

Balise #TITRE_PARENT - SPIP-Contrib

:

Voici une simple balise qui évite d’ajouter une boucle dans un squelette pour afficher le titre de la rubrique parente.

tetue nous disait au Ticket #1003 :

Ce n’est pas grand-chose, mais c’est un besoin que j’ai de façon répétitive depuis que je connais SPIP : dans un squelette article, afficher rapidement le titre de sa rubrique parente, pour faire un lien de retour (par exemple).

Dans une boucle article, on peut utiliser #URL_RUBRIQUE et #ID_RUBRIQUE... mais pas #TITRE pour afficher le titre de la rubrique en question, pour lequel on devra alors sortir l’artillerie d’une boucle, si bien qu’on peut se retrouver avec quelque chose d’un peu grotesque :

<a href="#URL_RUBRIQUE">
<BOUCLE_rub(RUBRIQUES){id_rubrique}>#TITRE</BOUCLE_rub>
</a>

 ;-)

Mais une balise #TITRE_PARENT simplifierait drôlement la vie :

<a href="#URL_RUBRIQUE">#TITRE_PARENT</a>

Elle permettrait d’afficher facilement le titre de la rubrique parente dans les boucles articles, brèves, rubriques...

La chose est faite. Ce plugin ajoute à l’arsenal des balises utilisables sur votre site la fameuse balise, sans boucle supplémentaire.

Explications

Le fichier titre_parent.php est le seul fichier réellement essentiel à SPIP pour fournir la fonctionnalité. En effet, le plugin n’a pour rôle que de proposer ce fichier comme extension au compilateur de SPIP.

Il se décompose en trois parties : un filtre, une balise, une spécification de traitement de la balise.

LE FILTRE :
La fonction « titre_parent() » est le filtre qui permet de récupérer l’information voulue :

<?php
function titre_parent($id_rubrique) {
/* Utiliser la bonne fonction de recherche sql (fetch)
selon la version de SPIP, */
$fetch function_exists('sql_fetch') ? 'sql_fetch' 'spip_fetch_array';
/* par précaution, on vérifié que le paramètre est
une valeur numérique entière, */
if(!($id_rubrique intval($id_rubrique))) return '';
/* on rédige puis on exécute la requête pour la base de données */
$q 'SELECT titre FROM spip_rubriques WHERE id_rubrique='.$id_rubrique;
if(
$r spip_query($q))
/* si cette requête renvoie un résultat pour le champ demandé,
on le retourne */
if($row $fetch($r))
return 
$row['titre'];
/* sinon, on renvoie une chaine vide */
return '';
}
?>

Seul ce filtre suffirait, puisque qu’on peut récupérer l’information par l’écriture suivante dans un squelette :

<BOUCLE_a(ARTICLES)>
[(#ID_RUBRIQUE|titre_parent)]
</BOUCLE_a>

LA BALISE :
La balise #TITRE_PARENT ne sert qu’à une chose, faire croire au compilateur SPIP qu’il existe un champ dans la base de données.

Le code va subtilement lui faire chercher autre chose, un ’vrai’ champ de la base de données et on profitera de l’aubaine pour appliquer directement le filtre qu’on vient d’imaginer.

La fonction « balise_TITRE_PARENT_dist() » définit donc la balise #TITRE_PARENT. Cette fonction est appelée par le compilateur au recalcul de la page, pour remplacer le symbole « #TITRE_PARENT » par l’appel du code php, voilà comment :

Le fichier html dans lequel on va placer #TITRE_PARENT, qu’on appelle squelette, est décortiqué par le compilateur pour y découvrir des symboles qu’il va transformer en une portion de code plus complexe.

Ces portions de code vont être empilées dans une mémoire à laquelle on accédera plus tard pour recomposer un nouveau fichier, écrit en php.

La définition d’une balise SPIP sert donc à préciser par quelle portion de code sera remplacé le symbole auquel il fait référence, le tout étant stocké au bon endroit dans la pile. Cet endroit est un objet technique appelé Champ (parce qu’il fait référence au champ dans une table de base de données). Celui-ci est capable d’explorer la pile de code qu’on a mémorisé et pour faciliter l’exploration de cette pile mémoire, ainsi que la composition du code, on peut utiliser les fonctions du compilateur. C’est le fameux paramètre $p.

<?php
function balise_TITRE_PARENT_dist($p) {
/* explorer la pile memoire pour atteindre le 'vrai' champ */
$id_rubrique champ_sql('id_rubrique'$p);
/* le code php qui sera execute */
$p->code "titre_parent(".$id_rubrique.")";
return 
$p;
}
?>

On enregistre donc dans ce Champ le code php qu’on souhaite. Ici, un appel au filtre titre_parent détaillé plus haut, avec en paramètre, la référence à un ’vrai’ champ de la la table de base de données. D’où l’utilisation de la fonction champ_sql, qui explore la pile pour atteindre le « vrai » champ sql qui nous intéresse ici.

LA SPÉCIFICATION DES TRAITEMENTS :
Une fois que le compilateur à entièrement exploré le fichier html et constitué cette fameuse pile mémoire, il va fabriquer un fichier en php qui aura donc remplacé tous les symboles par du « vrai » code. Ce résultat est visible quand on affiche le débusqueur (&var_mode=debug).

Mais avant d’imprimer le code qu’on a demandé dans le fichier, SPIP va ajouter d’autres traitements, autrement dit, il va appliquer d’autres filtres. Par exemple, la typographie, la fonction propre() qui transformera les raccourcis spip en html ou autre. Tout ces traitements sont regroupés dans une variable $table_des_traitements.

Un SPIP installé connaît les traitements qu’il doit appliquer au champ qui lui sont connu. Mais #TITRE_PARENT, il ne le connaît pas encore. Or, c’est le titre d’une rubrique, il faut appliquer la typographie des #TITREs traditionnels. On explique donc au compilateur que #TITRE_PARENT est à traiter comme un #TITRE normal et par conséquent, la typographie standard lui sera appliquée avant son affichage.

<?php
/* invoquer la table des traitements */
include_spip('public/interfaces');
global 
$table_des_traitements;
/* un TITRE_PARENT est un TITRE, sauf si on y tient absolument */
if (!isset($table_des_traitements['TITRE_PARENT'])) {
$table_des_traitements['TITRE_PARENT'] = $table_des_traitements['TITRE'];
}
?>

Petite finesse ici : Les experts pourront toute de même personnaliser le traitement qu’ils tiennent à réserver à cette nouvelle balise. Aussi, si un traitement spécifique lui est affecté dans le fichier config/mes_options.php, on ne l’écrase pas.

Évolution possible

Cette balise est directement utilisable dans une boucle de rubriques, d’articles, de sites et de brèves. Toutes celles et ceux qui ont imaginé d’autres objets éditoriaux attachés aux rubriques pourront l’utiliser aussi.

Par contre, un MOTS est attaché à un GROUPE de mots et non à une rubrique. Il faut donc « patcher », c’est à dire proposer du code supplémentaire, si on souhaite que cette même balise fonctionne pour un mot-clé.

L’envie d’aller plus loin ne manquera pas : trier une boucle par titre_parent ! :) C’est un peu plus compliqué, mais pas infaisable ;)

Nous proposons donc que ces deux évolutions, et celles qui vous viennent à l’esprit, fassent l’objet d’un petit jeu : Utilisez ce forum ou venez discuter sur SPIP-ZONE pour proposer vos solutions.

Dans SPIP3

Dans spip3, ce plugin n’est pas disponible car on peut accéder directement à cette information avec l’appel à  #INFO_TITRE{rubrique,#ID_PARENT}.
Cf Balise #INFO_XXX.