Afficher le nombre de messages répondant à un article

Pour afficher le nombre de messages du forum lié à un article, nous devons créer une boucle de type FORUMS, liée à un article, de façon à compter son nombre de résultats.

À première vue, il est très simple de connaître le nombre d’éléments d’une boucle : il suffit d’utiliser la balise : #TOTAL_BOUCLE. Mais son usage est un poil acrobatique.

Bien sélectionner tous les messages

Première subtilité : nous voulons tous les messages des forums liés à l’article, en comptant les réponses aux messages, les réponses aux réponses...

Une simple boucle de type : <BOUCLE_forum(FORUMS) {id_article}> sélectionne uniquement les messages qui répondent directement à l’article. Pour accéder aux réponses à ces messages, on inclut habituellement une seconde boucle à l’intérieur de celle-ci, mais ce n’est pas ce que nous souhaitons faire ici.
Pour pouvoir tous les compter, nous voulons que la boucle sélectionne absolument tous les messages du forum lié à l’article, sans tenir compte de leur hiérarchie. Pour cela, il faut spécifier le critère {plat}, qui comme son nom l’indique sert à afficher un forum à plat. Ce qui donne : <BOUCLE_forum(FORUMS) {id_article} {plat}>

N’afficher que le total

Voyons maintenant comment compter les éléments qu’elle contient. La difficulté, ici, c’est que justement cette boucle ne doit rien afficher ! Elle n’affiche ni les messages ni leur titre, et on évitera même de lui faire afficher des espaces ou des retours à la ligne (sinon votre code HTML final contiendra des dizaines de lignes vides, inélégantes), en ne laissant pas même un espace entre les deux tags ouvrants et fermants de la boucle : <BOUCLE_forum(FORUMS) {id_article} {plat}></BOUCLE_forum>.

L’intérieur de la boucle n’affiche donc rigoureusement rien, mais on doit afficher, après la boucle, le nombre de résultats. La balise #TOTAL_BOUCLE peut s’utiliser non seulement à l’intérieur de la boucle, mais aussi (c’est la seule dans ce cas) dans le texte conditionnel après (le texte qui s’affiche après la boucle si elle contient des éléments) et le texte conditionnel alternatif (le texte qui s’affiche si la boucle est vide).

Une subtilité à bien comprendre : le texte conditionnel alternatif s’affiche si la boucle ne trouve aucune réponse ; il est donc affiché même si la boucle sélectionne des éléments (ici des messages de forum) mais qu’elle ne contient aucun affichage.

Nous devons donc placer #TOTAL_BOUCLE dans le texte conditionnel alternatif.
S’il n’y aucun message de forum attaché à l’article, #TOTAL_BOUCLE sera vide, il ne faut donc pas afficher le texte englobant (« il y a N message(s) de forum ») dans ce cas.

<BOUCLE_combien(FORUMS) {id_article} {plat}></BOUCLE_combien>
[Il y a (#TOTAL_BOUCLE) message(s) de forum.]
<//B_combien>

Un message, des messages...

Nous affichons désormais le nombre de messages, s’il en existe. Mais nous voulons faire mieux : nous souhaitons que le terme « message » soit automatiquement accordé au singulier lorsque la boucle ne trouve qu’un seul résultat, et accordé au pluriel lorsqu’elle en trouve plusieurs.

Pour cela, nous allons utiliser les filtres de test |<{...} et |?{...,...} pour accorder « message » selon la valeur de #TOTAL_BOUCLE :
[(#TOTAL_BOUCLE|<{2}|?{message,messages})]

Ce qui nous donne donc :

<BOUCLE_combien(FORUMS) {id_article} {plat}></BOUCLE_combien>
[Il y a (#TOTAL_BOUCLE) [(#TOTAL_BOUCLE|<{2}|?{message,messages})] de forum.]
<//B_combien>

Auteur L’équipe de SPIP Publié le : Mis à jour : 29/06/23

Traductions : català, English, Español, français, italiano, Nederlands, Türkçe