Les boucles récursives

Les boucles récursives offrent une fonctionnalité très puissante de mise en page de structure hiérarchique. Leur écriture est concise, mais leur utilisation demande une bonne maîtrise logique de l’enchaînement des boucles.

Pour construire une boucle récursive, il suffit d’indiquer dans son TYPE le nom d’une boucle contenant celle qu’on écrit :

<BOUCLEx …>
…
<BOUCLEn(BOUCLEx)></BOUCLEn>
…
</BOUCLEx>

La boucle n fonctionne comme si l’on avait recopié l’intégralité de la boucle x (toutes les balises et le code HTML, ainsi que les textes conditionnels avant, après et alternatif) à l’endroit où l’on insère la boucle n.
La boucle n étant à l’intérieur de la boucle x, on obtient un comportement récursif : la boucle x contient une boucle n, qui elle-même reproduit la boucle x qui contient la boucle n, et ainsi de suite, jusqu’à ce que la boucle x ne donne plus aucun résultat.
Aucun critère ne figure dans la boucle n, le changement de contexte à chaque appel de la boucle x devant conduire les critères de celle-ci à ne plus trouver aucun élément.

Cette technique permet de créer notamment l’affichage des threads des forums. Une première boucle « fabrique » l’entrée des threads (les messages qui répondent directement à un article), une seconde boucle affiche les réponses à ces messages, et une boucle récursive provoque la récursivité sur cette seconde boucle :

<BOUCLE_forum(FORUMS){id_article}>
   #TITRE
   <B_reponses>
   <ul>
   <BOUCLE_reponses(FORUMS){id_parent}>
      <li>#TITRE
      <BOUCLE_recursive(BOUCLE_reponses)>
      </BOUCLE_recursive>
      </li>
   </BOUCLE_reponses>
   </ul>
   </B_reponses>
</BOUCLE_forum>

Plus généralement, cette fonctionnalité provoque un affichage graphiquement très clair de structures arborescentes, en particulier la hiérarchie des rubriques de votre site.

Remarque 1 : Le compilateur considère que la notation BOUCLEn(BOUCLEx)> à l’extérieur de la boucle x est vide de sens, ce qui lui permet d’atteindre l’optimalité du nombre de champs des requêtes SQL qu’il produit, pour tout type de boucles.
Cet emploi n’est pas une récursion mais une inclusion, fonctionnalité à laquelle répond la balise INCLURE, nettement préférable.

Remarque 2 : Dans l’état actuel du compilateur de SPIP, la séquence <BOUCLEn(BOUCLEx)></BOUCLEn> doit figurer au premier niveau de la boucle x, autrement dit la boucle n doit être immédiatement englobée par la boucle x, non par une autre boucle elle-même à l’intérieur de la boucle x.
La levée de cette restriction est à l’étude.

Remarque 3 : On peut appeler une balise homonyme de l’une des boucles englobantes en explicitant le nom de la boucle à laquelle la balise appartient. Il faut alors spécifier le nom de la boucle entre le # et le nom de la balise. Plus de détail dans l’article La syntaxe des balises SPIP.

On écrira alors la balise #BALISE de la boucle _boucle [1] de la façon suivante :
#_boucle:BALISE.

Auteur L’équipe de SPIP Publié le : Mis à jour : 20/04/23

Traductions : عربي, català, Deutsch, English, Español, français, italiano, Nederlands