Balise #TITRE_PARENT

Une balise pour afficher le titre de la rubrique parente, sans boucle supplémentaire.

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.

merci à Mathieu Drouet (IZO) pour le logo :)

Discussion

10 discussions

  • 5

    Bonjour,

    Est-ce qu’il y a un équivalent pour SPIP3 ?

    Merci

    dd

    Répondre à ce message

  • 3

    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.

    • La portée en a été un peu étendue à tous les objets possédant une rubrique parente

      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

  • 2

    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é) :

      <BOUCLE_Art(ARTICLES)>
         <BOUCLE_Rub(RUBRIQUES){id_rubrique}>
              <br />Le grand-parent de #_Art:TITRE est #_Rub:TITRE_PARENT
         </BOUCLE_Rub>
      </BOUCLE_Art>

      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 :

      <BOUCLE_grand_parent(HIERARCHIE){id_article}{1,1}> #TITRE </BOUCLE_grand_parent>

      à 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

  • Tarek Boughanmi

    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

  • chankalan

    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

  • 1

    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

  • 1
    Grégoire G

    Bonjour

    Si tu es dans un boucle incluse dans une autre, c’est encore plus simple.

    <BOUCLE_lstRub(RUBRIQUES)>
        <BOUCLE_art(ARTICLES){id_rubrique}>
        <br /> Art :  #ID_ARTICLE - #TITRE
        [(#REM) titre de la rubrique maintenant]
        <br />#_lstRub:TITRE
        [(REM) ça marche avec les URL aussi]
        </BOUCLE_art>
    </BOUCLE_lstRub>

    Répondre à ce message

  • Cyril MARION

    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 :

  • 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