UNE LISTE MÉLANGEANT ARTICLES ET RUBRIQUES
UNE LISTE MÉLANGEANT ARTICLES ET RUBRIQUES
Techniques SPIP

Vous trouverez ici des trucs et astuces destinés aux développeurs de sites sous SPIP.

La majorité de ces trucs est consacrée aux filtres graphiques introduits dans SPIP 1.9. Il y a là en effet un vaste champ d’expérimentation pour les webmestres et les graphistes.

Chaque truc est suivi d’un forum auquel nous vous invitons à participer.

N.B. La présence de ces trucs et astuces sur notre site professionnel est destinée à faire connaître notre activité de création de sites sous SPIP. Vous pouvez librement utiliser les morceaux de code fournis ici dans vos propres squelettes. Vous pouvez reprendre ces exemples sur votre site ou dans les forums d’un autre site ; dans ce cas, nous vous demandons simplement d’avoir la courtoisie de référencer la page d’où est tiré le code repris.

XML

[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 lithurgie
— Article : 90. Encore un article
— Rubrique : 40. Lithurgie
— 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. Lithurgie
— 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. Lithurgie

— ...
— 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. Lithurgie
— 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 lithurgie
— 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. Lithurgie
— 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 lithurgie
— 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. Lithurgie
— 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 lithurgie
— Rubrique : 70. Espace jeunesse
— Article : 10. Horaires des messes et offices
— Article : 20. Rencontrer un prêtre
— Article : 60. Musique et lithurgie
— 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>

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.

Juin 2007
Une liste mélangeant articles et rubriques
jacques

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

Août 2007
Une liste mélangeant articles et rubriques
Denis Florent (denisflorent chez gmail.com)

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.

Août 2007
Une liste mélangeant articles et rubriques
tchouk (massoud_78 chez hotmail.com)

rien de moins que génial ! merci

Septembre 2007
Une liste mélangeant articles et rubriques
EmmaR (emmrichard chez gmail.com)

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 !

il y a 3 mois
Une liste mélangeant articles et rubriques
Feliciana (antera chez wanadoo.fr)

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 ?

Votre message :
Un message, un commentaire ?

(Pour créer des paragraphes, laissez simplement des lignes vides.)

Qui êtes-vous ? (optionnel)