Contactez-nous

1

Une liste mélangeant articles et rubriques

17 avril 2007
par ARNO*

[SPIP 1.8] Une demande fréquente pour la présentation de la navigation dans un site Web consiste à présenter, dans une même liste classée, les articles et les sous-rubriques d’une rubrique.

Voici par exemple ce que j’ai sur un site sur lequel je travaille actuellement (c’est un site religieux...) :

— Article : 10. Horaires des messes et offices
— Article : 20. Rencontrer un prêtre
— Article : 60. Musique et liturgie
— Article : 90. Encore un article
— Rubrique : 40. liturgie
— Rubrique : 50. Les acteurs
— Rubrique : 70. Espace jeunesse

Dans la rubrique que j’affiche, j’ai ainsi quatre articles et trois sous-rubriques (en gras). J’ai besoin, ici, de présenter ces éléments dans une même liste, selon le numéro des titres.

Notez bien. Avant tout, le bon réflexe est de commencer par refuser une telle utilisation : dans l’énorme majorité des cas, si l’on a besoin de mélanger des articles et des rubriques, c’est que l’on a une difficulté de structuration de l’information : les rubriques et les articles ne répondent pas à la même logique structurelle (les rubriques sont des « contenants », et les articles présentent directement l’information). J’insiste sur ce point : en règle général, quand on demande à mélanger des articles et des rubriques, c’est qu’on a un problème de structuration de l’information, qui ne sera certainement pas résolu par du code informatique... Le bon réflexe, face à cette demande, est d’analyser le contenu du site et de voir s’il n’y a pas une meilleure façon de structurer le site.

Cela dit, si réellement cette structure, qui mélange des articles et des rubriques dans des listes communes, est la meilleure solution pour le site en question, alors il faut faire avec.

C’est alors un problème fréquemment rencontré, et on aimerait parfois disposer d’une boucle de type (ARTICLES_ET_RUBRIQUES), comme on a déjà des boucles (ARTICLES) et (RUBRIQUES) !

Jusqu’à une époque récente, je m’en sortais avec un traitement en PHP. Un peu lourd et pas très élégant...

Voici une méthode, finalement assez simple, pour s’en sortir directement avec des boucles SPIP...

Le principe

La première chose à faire est de créer une boucle affichant les sous-rubriques. Rien de plus simple, et on obtient la liste :

— Rubrique : 40. liturgie
— Rubrique : 50. Les acteurs
— Rubrique : 70. Espace jeunesse

L’astuce va consister à insérer, avant chacune de ces sous-rubriques, les articles qui se trouvent « avant » la sous-rubrique. Ainsi :

— ...
— Tous les articles dont le titre est « avant » le titre de la sous-rubrique « 40... »
— ...
- Rubrique : 40. liturgie

— ...
— Tous les articles dont le titre est « avant » le titre de la sous-rubrique « 50... »
— ...
- Rubrique : 50. Les acteurs

— ...
— Tous les articles dont le titre est « avant » le titre de la sous-rubrique « 70... »
— ...
- Rubrique : 70. Espace jeunesse

Ce qui nous donnerait :

— Article : 10. Horaires des messes et offices
— Article : 20. Rencontrer un prêtre
— Rubrique : 40. liturgie
— Article : 10. Horaires des messes et offices
— Article : 20. Rencontrer un prêtre
— Rubrique : 50. Les acteurs
— Article : 10. Horaires des messes et offices
— Article : 20. Rencontrer un prêtre
— Article : 60. Musique et liturgie
— Rubrique : 70. Espace jeunesse

Il nous suffit d’interdire les doublons dans la boucle des articles pour éviter d’afficher les articles deux fois :

— Article : 10. Horaires des messes et offices
— Article : 20. Rencontrer un prêtre
— Rubrique : 40. liturgie
— Article : 10. Horaires des messes et offices
— Article : 20. Rencontrer un prêtre
— Rubrique : 50. Les acteurs
— Article : 10. Horaires des messes et offices
— Article : 20. Rencontrer un prêtre
— Article : 60. Musique et liturgie
— Rubrique : 70. Espace jeunesse

Finalement, il nous reste à afficher les articles qui n’ont pas encore été affichés. Cela permet d’afficher :
— les articles dont le titre est « après » la dernière sous-rubrique,
— tous les articles s’il n’y a pas de sous-rubrique du tout.

Ce qui donne :
— Article : 10. Horaires des messes et offices
— Article : 20. Rencontrer un prêtre
— Rubrique : 40. liturgie
— Article : 10. Horaires des messes et offices
— Article : 20. Rencontrer un prêtre
— Rubrique : 50. Les acteurs
— Article : 10. Horaires des messes et offices
— Article : 20. Rencontrer un prêtre
— Article : 60. Musique et liturgie
— Rubrique : 70. Espace jeunesse
— Article : 10. Horaires des messes et offices
— Article : 20. Rencontrer un prêtre
— Article : 60. Musique et liturgie
— Article : 90. Encore un article

Le code

  1. <BOUCLE_toutes_sous_rubriques(RUBRIQUES){id_parent}{par num titre}>
  2. <BOUCLE_articles_avant(ARTICLES){id_rubrique=#ID_PARENT}{par num titre}{titre<#TITRE}{doublons avant}>
  3. <li>Article: #TITRE
  4. </BOUCLE_articles_avant>
  5.  
  6. <li><b>Rubrique: #TITRE</b></li>
  7. </BOUCLE_toutes_sous_rubriques>
  8.  
  9. <BOUCLE_articles_apres(ARTICLES){id_rubrique}{par num titre}{doublons avant}>
  10. <li>Article: #TITRE
  11. </BOUCLE_articles_apres>

Télécharger

La BOUCLE_toutes_sous_rubriques affiche toutes les sous-rubriques, triées par titre numéroté.

Toute l’astuce réside dans la BOUCLE_articles_avant, appelée juste avant d’afficher le titre de la sous-rubrique. Ses critères sont :
— {par num titre} : on classe par titre numéroté d’article ;
— {titre<#TITRE} : on affiche les articles dont le titre est « inférieur » au titre de la sous-rubrique ;
— {id_rubrique=#ID_PARENT} : on sélectionne les articles installés dans la rubrique « parent » : en effet, on est déjà dans la boucle qui affiche les sous-rubriques, il faut donc ici « remonter d’un niveau » dans la hiérarchie des rubriques ;
— {doublons avant} : on interdit le réaffichage des articles ; notez qu’en précisant « doublons avant », on nomme une liste de doublons, ce qui permet de gérer plusieurs listes d’exclusion de doublons dans un même squelette.

Note. Ce sont les critères {titre<#TITRE} et {id_rubrique=#ID_PARENT} qui imposent l’utilisation, au minimum, de SPIP 1.8.

Enfin, la BOUCLE_articles_apres affiche les articles qui n’ont pas encore été affichés.

C’est tout...

Évidemment, on adaptera l’affichage des articles et des sous-rubriques selon ses besoins. Pour ma part, je préfère ici réaliser de tous petits squelettes que j’appelle par des <INCLURE>, faciles à réutiliser. Cela évite de plus de coder deux fois la présentation des articles à l’intérieur des boucles BOUCLE_articles_avant et BOUCLE_articles_apres.

Note 2, 24 juin 2008. À l’usage, j’ai découvert une limite à ce système : on ne peut pas faire le classement réellement par num titre à cause du critère {titre<#TITRE}. Du coup, si on a numéroté « 1, 10, 12, 25, 101... », le classement ne fonctionne pas. La solution de contournement consiste à l’astreindre à utiliser des numéros ayant tous le même nombre de chiffres : « 001, 010, 012, 025, 101... ».

  • jacques
    Juin 2007

    Merci, vous m’avez bien dépanné :-) la structure qui m’est demandée est inepte, et mon commanditaire n’en démord pas :-)

  • Denis Florent
    Août 2007

    Je vous jure... l’explication ci-dessus et le site de votre client religieux seront bien meilleurs... sans cet horrible H dans "Liturgie" :-)

    Amitiés, D.

  • tchouk
    Août 2007

    rien de moins que génial ! merci

  • EmmaR
    Septembre 2007

    Merci beaucoup ! C’est exactement ce que je cherchais. Et cela m’a donné l’occasion de revisiter votre site, dans lequel j’avais déjà trouvé plein d’informations intéressantes sur SPIP il y a quelque temps. Je vous mets tout de suite dans mes marque-pages !

  • Feliciana
    Février 2008

    Bonjour,

    Super technique !

    J’ai l’impression qu’elle n’est pas compatible avec

    pas compatible avec

    $table_des_traitements[’TITRE’][]= ’supprimer_numero(typo(%s))’ ;

    Me trompe-je ?

  • Juin 2008

    Trop de H nuit. "Rubrique : 40. Lithurgie " > liturgie

  • Benjamin Farrudja
    Novembre 2009

    Salut,

    Super bout de code, merci Arno.

    Je précise pour ceux qui voudront l’utiliser qu’il faut remplacer à la ligne 2 titre<#TITRE par titre<#TITRE* pour désactiver la suppression du numéro à l’affichage de la balise titre si on utilise la lame qui va bien dans le couteau suisse.

    Sincères salutations
    Benjamin

  • Hervé
    Mars 2011

    Bonjour,

    Merci pour cette astuce :-) Une question cependant : c’est volontaire de ne pas mettre dans les listes, à deux reprises pour les articles, de balise fermante </li> ou est-ce un oubli ?

Qui êtes-vous ?
Votre message

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