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.
Discussions par date d’activité
10 discussions
Bonjour,
Est-ce qu’il y a un équivalent pour SPIP3 ?
Merci
dd
Oui, la balise
#INFO_
cf http://www.spip.net/fr_article5544.html#INFO_XXDonc
#INFO_TITRE{article,#ID_ARTICLE}
et hop :)Impec !
Merci
Le plugin est désormais compatible avec SPIP 3, depuis les révisions 90004 et 90005 !
Ce serait chouette dans la colonne adéquate de l’indiqué si il est compatible :)
Oui le plugin est bien compatible avec SPIP 3, mais uniquement le trunk (v2) et non la branche v1 qui est celle disponible en zip. Il faudrait ajouter le trunk à la liste des zips...
Répondre à ce message
Bonjour !
Voila, fort pratique, cette balise a été intégrée dans le plugin « Le Couteau Suisse ». La portée en a été un peu étendue à tous les objets possédant une rubrique parente, et complétée grâce à la balise #TITRE_GROUPE (qui en fait est un équivalent de #TYPE).
Article correspondant : Les balises #TITRE_PARENT et #TITRE_OBJET.
Encore une fois, tu fork le plugin original, et tu ne le fais pas bénéficier des améliorations que tu propose ...
bonjour,
effectivement je trouve que c’est pas juste de forker des plugins très bons (comme blocs dépliables, en travaux, titre-parent, ...) sur le couteau suisse (@ Patrice-Vanneufville) sans apporter les améliorations au plugin original ?
d’ailleurs personnellement je ne veux pas utiliser le couteau suisse pour une ou deux fonctions seulement, je préfère passer par mes_options.php ou par certains plugins.
amicalement et bonne continuation à tous.
vive SPIP !
Ce plugin incorpore désormais ces améliorations, depuis la révision 90008.
Répondre à ce message
Bonsoir,
dans un article situé dans une sous-rubrique de niveau 4, je cherche a recuperer le titre de la sous-rubrique de niveau 2, sans succès.
je recupere bien le niveau 1 avec SECTEUR, niveau 3 avec PARENT et 4 avec RUBRIQUE, quid du niveau 2 ? n’existe t’il pas une astuce « GRAND_PARENT » ?
Merci d’avance pour vos lumières et bonne soirée.
Salut,
Pour le grand-parent, le raccourci n’existe pas en effet... Dans ce cas la boucle semble inévitable... Un truc du genre (non testé) :
N’hésite pas à nous renvoyer le résultat de tes expériences... ;-)
Je complète, pour les internautes :
« Tu peux passer par une boucle HIERARCHIE :
à placer dans une boucle ARTICLE.
ÉricL »
Répondre à ce message
Bonjour, et merci pour la présentation de création de balise par plugin. En la combinant avec un champ extra, j’arrive à ajouter un champs extra à un article et à l’afficher dans un squelette « article.html ».
Cependant, ça ne marche pas dans une « boucle(articles) » et pour cause : j’ai lu quelque part que le PHP d’un squelette est lu APRES le code spip. Ma boucle sort donc uniquement les valeurs du premier enregistrement de la table « spip_articles ».
Quelqu’un sait-il comment déclarer de façon propre une nouvelle balise qui ira prendre directement la valeur du champs « duree » de la table « spip_articles » ?
Merci :)
Répondre à ce message
Bonjour,
J’arrive au même résultat en utilisant une boucle de type HIERARCHIE inverse ;)
Bonne soirée
Répondre à ce message
heu le logo est de moi ;)
Répondre à ce message
ce plugin est très simple et limpide, c’est un très bon support pour approfondir la construction/fabrication de plugin justement : connaissant rien encore à la chose, je l’ai décortiqué et adapté pour créer la balise #TITRE_SECTEUR, utile dans un projet précis... et utile pour apprendre à faire un plugin
Répondre à ce message
Salut,
je trouve cette contrib trés partaique , mais j’ai des soucis a la faire marché.
J’ai installer et activé le plugin. Dés que je fais appel a cette nouvelle balise je me retrouve avec une page blanche.
Je n’utilise ausun autre plugin, et je suis sous spip 1.9.2a
Merci de votre aide,
Cdlt,
En effet, le plugin n’était pas compatible avec les séries 1.9.2. C’est chose faite maintenant.
Répondre à ce message
Bonjour
Si tu es dans un boucle incluse dans une autre, c’est encore plus simple.
hé hé :) cf les commentaires de ce ticket Pour afficher la rubrique parente d’un article : #TITRE_PARENT
Répondre à ce message
Super ! Enfin quelques explications claires sur la fameuse variable $p !
Du coup, je comprends mieux ce que j’ai un peu fait « à l’arrache » dans ma précédente contrib (voir balise trimestre).
En cours : une balise #SUIVANT et #PRECEDENT...
A+
Cyril
Répondre à ce message
Ajouter un commentaire
Avant de faire part d’un problème sur un plugin X, merci de lire ce qui suit :
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.
Suivre les commentaires : |