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

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.