Accueil > TIC > SPIP > SPIP : modèles pour dénombrements d’éléments (articles, documents, rubriques...)

SPIP : modèles pour dénombrements d’éléments (articles, documents, rubriques...)

vendredi 7 novembre 2025, par Spip DEKRI

J’ai été amené à créer des modèles SPIP afin de répondre à un besoin : connaître (et afficher) le nombre d’articles et/ou de rubriques contenus dans une rubrique ou le nombre d’images (de médias) associées à un article.

Voici les informations dont j’avais besoin :

  • connaître le nombre d’articles contenus dans une rubrique
  • connaître le nombre de rubriques contenues dans une rubrique
  • connaître le nombre d’images (médias) associés à un article
  • ...

Évidemment, j’ai tout de suite pensé à la balise #TOTALBOUCLE. Mais j’en avais besoin dans les champs "descriptif" ou plutôt les champs "chapo" et évidemment quelquefois dans les champs "texte".

J’ai donc réalisé des modèles afin de répondre à ma demande. L’avantage des modèles, c’est qu’ils sont réutilisables mais ils ont besoin de paramètres (quelle rubrique ou quel article par exemple). Un autre problème est venu suite au comptage pour plusieurs rubriques simultanément (addition des nombres d’articles de chaque rubrique concernée par exemple). Un dernier problème, un peu anecdotique est apparu : l’orthographe. Comment écrire au singulier pour les quantités zéro ou unitaire et au pluriel pour les autres ?. Enfin, une dernière contrainte est apparue : ne pas nécessairement utiliser l’unité du nombre calculé mais utiliser "question/questions" par exemple ou "jeu/jeux" (et pourquoi pas "cheval/chevaux").

Pour le singulier et le pluriel, le filtre singulier_ou_pluriel me semblait convenir mais je n’avais pas prêté attention à la langue utilisée sur le site (il est vrai que je n’utilise que le français mais sait-on jamais ?)

Voici ce que j’ai fait :

[(#REM) 
nbarticlesrubrique
Nombre d'articles dans une rubrique
A appeler par <nbarticlesrubriqueX|sngl=mot_singulier|plrl=mot_pluriel>
)]
<BOUCLE_combien(ARTICLES){id_rubrique=#ENV{id}}></BOUCLE_combien>
	#TOTAL_BOUCLE [(#TOTAL_BOUCLE|singulier_ou_pluriel{#ENV{sngl},#ENV{plrl}})]
<//B_combien>

X est l’id rubrique évidemment, sngl est le mot utilisé comme unité au singulier et plrl le même mot écrit au pluriel.

Exemple d’appel : <nbarticlesrubrique17|sngl=question|plrl=questions> affiche "".

[(#REM) 
nbrubriquesrubrique
Nombre de rubriques dans une rubrique
A appeler par <nbrubriquesrubriqueX|sngl=mot_singulier|plrl=mot_pluriel>
)]
<BOUCLE_combienRub(RUBRIQUES){id_parent=#ENV{id}}></BOUCLE_combienRub>
	#TOTAL_BOUCLE [(#TOTAL_BOUCLE|singulier_ou_pluriel{#ENV{sngl},#ENV{plrl}})]
<//B_combienRub>

Exemple d’appel : <nbrubriquesrubrique17|sngl=catégorie|plrl=catégories> affiche "3  catégories".

[(#REM) 
nbimagesarticle
Nombre d'images associées à un article
A appeler par <nbimagesarticleX|sngl=mot_singulier|plrl=mot_pluriel>
)]
<BOUCLE_combienimages(DOCUMENTS) {id_article=#ENV{id}} {media=image}></BOUCLE_combienimages>
	#TOTAL_BOUCLE [(#TOTAL_BOUCLE|singulier_ou_pluriel{#ENV{sngl},#ENV{plrl}})]
<//B_combienimages>

Exemple d’appel : <nbimagesarticle1|sngl=image|plrl=images> affiche "87  images".

[(#REM) Faire la somme des nombres d'articles de plusieurs rubriques)]
<BOUCLE_combien1(ARTICLES){id_rubrique=13}></BOUCLE_combien1>
	#SET{total1,#TOTAL_BOUCLE} <!-- #GET{total1} + -->
<//B_combien1>
<BOUCLE_combien2(ARTICLES){id_rubrique=14}></BOUCLE_combien2>
	#SET{total2,#TOTAL_BOUCLE} <!-- #GET{total2} + -->
<//B_combien2>
<BOUCLE_combien3(ARTICLES){id_rubrique=15}></BOUCLE_combien3>
	#SET{total3,#TOTAL_BOUCLE} <!-- #GET{total3} = -->
<//B_combien3>
<BOUCLE_combien4(ARTICLES){id_rubrique=16}></BOUCLE_combien4>
	#SET{total4,#TOTAL_BOUCLE} <!-- #GET{total4} = -->
<//B_combien4>
 [(#GET{total1}|plus{#GET{total2}}|plus{#GET{total3}}|plus{#GET{total4}})]

Pour ce modèle, vite abandonné, le calcul fonctionne mais, évidemment, c’est bloqué sur quelques rubriques identifiées par leur n° en dur.

J’ai donc remplacé par ceci :

[(#REM) 
nbartplusieursrub
Somme des nombres d'articles de plusieurs rubriques
A appeler par <nbartplusieursrub|afficher=X+Y+Z>
Attention pas de termes unitaires définis
Donc, si le nbart est 1 ou zéro... on conserve le pluriel !
Pas d'essai d'utilisation du filtre singulier_ou_pluriel...
)]
#SET{total,0}
<BOUCLE_rub(RUBRIQUES){id_rubrique IN #ENV{afficher}|explode{'+'}}>
	<BOUCLE_nbart(ARTICLES){id_rubrique}></BOUCLE_nbart>
		#SET{t1,#TOTAL_BOUCLE}
	<//B_nbart>
	#SET{t2,#GET{total}}
	#SET{total,#GET{t2}|plus{#GET{t1}}}
</BOUCLE_rub>
#GET{total}

C’est probablement pas très "élégant" mais ça fonctionne.
Exemple d’appel : <nbartplusieursrub|afficher=13+14+15+16+23> affiche "322".

J’ai envisagé de créer un fichier par langues mais il faudrait aussi prévoir une automatisation de l’ajout d’éléments. De toutes façons, quand on appelle cette procédure, on est quasiment à coup sûr dans la langue dans la langue souhaitée pour la réponse. Sion est en anglais et qu’on appelle par <nbarticlesrubrique17|sngl=post|plrl=posts> affiche "10  posts".

Le fichier de langue fr aurait pu donner ça :

<?php [
// fichier snglplrl_fr.php
// C'est un fichier de langues de Spip
// mais il n'existe qu'en français !
// donc il ne sert pas à grand chose...
	'article' => '1 article',
	'articles' => '@nb@ articles',
	'rubrique' => '1 rubrique',
	'rubriques' => '@nb@ rubriques',
	'question' => '1 question',
	'questions' => '@nb@ questions',
	'concours' => '@nb@ concours',
];

L’appel se ferait donc par <nbarticlesrubrique17|:snglplrl:question|:snglplrl:questions>. Je n’ai pas testé : j’espère que ça fonctionne.