Os loops recursivos

Os loops recursivos fornecem uma poderosa funcionalidade de montagem de uma estrutura hierárquica. A sua sintaxe é concisa, mas a sua utilização requer um bom domínio lógico do encadeamento dos loops.

Para construir um loop recursivo, basta designar o seu TYPE o nome de um loop que contenha o loop que se está a escrever:

<BOUCLE_x…>
…
<BOUCLE_n(BOUCLE_x)></BOUCLE_n>
…
</BOUCLE_x>

O loop n funciona como se se tivesse recopiado a íntegra do loop x (todas as tags e o código HTML, bem como os textos condicionais anterior, posterior e alternativo) na posição em que se está a inserir o loop n.

Com o loop n estando no interior do loop x, obtém-se um comportamento recursivo: o loop x contém um loop n que, por sua vez, reproduz o loop x que contém o loop n, e assim sucessivamente, até que o loop x não produza mais algum resultado.

Nenhum critério se aplica ao loop n, sendo a mudança de contexto a cada iteração do loop x que leva os critérios deste a não mais encontrar algum elemento.

Esta técnica permite exibir, por exemplo, os threads de um fórum. Um primeiro loop «gera» as entradas dos threads (as mensagens que respondem diretamente a uma matéria), um segundo loop exibe as respostas a estas mensagens, e um loop recursivo aplica a recursividade neste segundo loop:

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

De um modo mais geral, esta funcionalidade possibilita uma exibição mais clara de estruturas hierárquicas, particularmente a hierarquia das seções do seu site.

Nota 1: O compilador considera que a notação <BOUCLE_n(BOUCLE_x)> fora do loop x é desprovida de sentido, o que permite alcançar a otimização do número de campos das consultas SQL que o mesmo produz, para todo o tipo de loops
Este uso não é uma recursão e sim uma inclusão, funcionalidade suprida pela tag INCLURE, que é claramente preferível.

Nota 2: No estado atual do compilador do SPIP, a sequência <BOUCLE_n(BOUCLE_x)></BOUCLE_n> deve figurar no primeiro nível do loop x, ou seja, o loop n deve estar imediatamente englobado pelo loop x, e não por outro loop também contido no loop x.
A remoção desta restrição encontra-se em estudo.

Nota 3: É possível chamar uma tag homonima de um dos loops envolventes, ao especificar-se o nome do loop ao qual a tag pertence. Para tal, deve-se especificar o nome do loop entre o # e o nome da tag. Mais detalhes na matéria A sintaxe das tags SPIP.

Nesse caso, a tag #BALISE do loop _boucle [1] deverá ser escrita da seguinte forma:
#_boucle:BALISE.

Autor Ricardo Porto Publié le :

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