SPIP-Contrib

SPIP-Contrib

عربي | Deutsch | English | Español | français | italiano

251 Plugins, 182 contribs sur SPIP-Zone, 111 visiteurs en ce moment

Accueil du site > Navigation > Chemin de navigation > Balise #TITRE_PARENT > Balise #TITRE_PARENT

Balise #TITRE_PARENT

25 août 2007 – par b_b, James – 12 commentaires

10 votes

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.

Romy Têtue 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.

P.-S.

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

Retour en haut de la page

Vos commentaires

  • Le 24 novembre 2008 à 23:34, par Patrice Vanneufville

    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 .

    • Le 23 août 2009 à 00:11, par Cedric Morin

      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 ...

    • Le 26 octobre 2009 à 10:36, par SuperYMS

      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 !

    Répondre à ce message

  • Le 26 octobre 2009 à 08:42, par Clement

    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

  • Le 17 novembre 2008 à 18:05, par 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

  • Le 17 novembre 2008 à 15:59, par izo

    heu le logo est de moi ;)

    Répondre à ce message

  • Le 12 juin 2008 à 15:06, par 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

  • Le 18 septembre 2007 à 14:20, par middir

    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,

    • Le 29 septembre 2007 à 22:20, par James

      En effet, le plugin n’était pas compatible avec les séries 1.9.2. C’est chose faite maintenant.

    Répondre à ce message

  • Le 11 septembre 2007 à 15:09, par 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

  • Le 28 août 2007 à 19:48, par 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

Répondre à cet article

Qui êtes-vous ? (optionnel)

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 formulaire accepte les raccourcis SPIP et le code HTML. Pour créer des paragraphes, laissez simplement des lignes vides.

Ajouter un document

Retour en haut de la page

Ça discute par ici

  • Zpresse

    19 mars – commentaires

    L’idée c’est de faire un thème minimaliste et sobre que l’on pourrait ensuite personnaliser facilement. Donc trois colonnes, trois couleurs (ou deux tons plus une couleur, plutôt), gris, noir, rouge. Des filets, pour l’instant, d’une part parce que (...)

  • SPIP-Listes

    30 novembre 2006 – 745 commentaires

    SPIP-listes permet la gestion et l’envoi de lettres d’information (newsletters) au moyen d’un courriel au format html ou texte. Il est possible d’envoyer des messages aux abonnés qui se sont formellement inscrits à une ou plusieurs lettres (...)

  • Plugin Thélia

    26 juin 2007 – 526 commentaires

    Une approche basée sur l’utilisation conjointe des deux logiciels SPIP et Thélia pour la réalisation de sites de publication et de vente en ligne

  • Essayez SPIP 2.1-RC

    19 mars – 12 commentaires

    La version Release Candidate de SPIP est sortie de la forge.

  • Jeu de squelettes Multiflex 3 et le plugin "agenda2"

    22 octobre 2009 – commentaires

    Il s’agit d’un tutorial (pas à pas) expliquant comment mettre en route le calendrier du plugin "agenda2" dans le squelette "Jeu de squelettes Multiflex 3" et uniquement celui-là ! Prenez conscience que le plugin "agenda2" est passible d’évolution, (...)