racine uZine

Dans la même rubrique
Mise en page : manuel de référence
26 mai 2003
16 août 2002
15 juin 2002
11 décembre 2001
7 décembre 2001
2 juin 2001
24 mai 2001
22 mai 2001
20 mai 2001
18 mai 2001
16 mai 2001
14 mai 2001
3 mai 2001
 
lundi 28 mai 2001

La syntaxe des boucles

par l’équipe de SPIP

Syntaxe de base

La syntaxe simplifiée d’une boucle est la suivante :

<BOUCLEn(TYPE){critère1}{critère2}...{critèrex}>
    Code HTML + balises SPIP
</BOUCLEn>

On a vu, dans l’explication sur les boucles et les balises, que le Code HTML + balises SPIP se répétait autant de fois que la boucle obtenait d’éléments tirés de la base de données (c’est-à-dire une fois, plusieurs fois, ou zéro fois).

La ligne importante, ici, est :

<BOUCLEn(TYPE){critère1}{critère2}...{critèrex}>

- L’élément BOUCLE est l’ordre indiquant qu’il s’agit d’une boucle SPIP ; on ne peut donc pas le modifier ; dit autrement, toutes les boucles de SPIP commencent par l’instruction BOUCLE.

- L’élément n est, au choix, le nom de la boucle, ou le numéro de la boucle. Cet élément est choisi par le webmestre, pour chaque boucle qu’il utilise. On verra plus loin qu’il est possible (c’est même tout l’intérêt de la manoeuvre) d’utiliser plusieurs boucles dans un même squelette : leur donner un nom est donc indispensable pour les identifier.

Si vous décidez de numéroter vos boucles, la syntaxe devient par exemple (pour la boucle 5) :

<BOUCLE5...>
...
</BOUCLE5>

Si vous décidez de donner un nom à vos boucles (c’est généralement plus pratique, votre code est plus lisible), il faut impérativement faire précéder ce nom par le symbole « _ » (que l’on appelle habituellement underscore). Par exemple :

<BOUCLE_sousrubriques...>
...
</BOUCLE_sousrubriques>

- L’élément (TYPE). Cet élément est primordial : il indique quel type d’éléments on veut récupérer. La syntaxe est importante : le TYPE est indiqué entre parenthèses (sans espaces), en majuscules, et ce TYPE doit correspondre obligatoirement à l’un des types prévus dans SPIP (qu’on trouvera dans la présente documentation) : ARTICLES, RUBRIQUES, AUTEURS, BREVES, etc.

Pour l’exemple précédent, on aurait donc :

<BOUCLE_sousrubriques(RUBRIQUES)...>
...
</BOUCLE_sousrubriques>

- Les critères {critère1}{critère2}... Ils indiquent à la fois selon quels critères on veut sélectionner les éléments de la base de données (afficher les sous-rubriques incluses dans cette rubrique, afficher les autres rubriques installées au même niveau hiérarchique que la présente rubrique...), et la façon dont on va classer ou sélectionner les éléments (classer les articles selon leur date, selon leur titre... afficher uniquement les 3 premiers articles, afficher la moitié des articles...). Comme on peut combiner les critères, on peut très aisément fabriquer des requêtes très puissantes, du genre « afficher la liste des 5 articles les plus récents écrits par cet auteur ».

<BOUCLE_meme_auteur(ARTICLES){id_auteur}{par date}{inverse}{0,5}>
...
</BOUCLE_meme_auteur>

Les différents critères et leur syntaxe seront explicités dans la suite, pour chaque type de boucle (certains critères fonctionnent pour tous les types de boucles, certains sont spécifiques à certaines boucles).

Syntaxe complète

Le syntaxe indiquée précédemment peut être complétée par des éléments conditionnels. En effet, la boucle précédente affiche successivement les éléments contenus à l’intérieur de la boucle. SPIP permet de plus d’indiquer ce qu’on affiche avant et après la boucle au cas où elle contient un ou plusieurs résultats, et ce qu’on affiche s’il n’y a aucun élément.

Cela donne :

<Bn>
    Code HTML optionnel avant
<BOUCLEn(TYPE){critère1}{critère2}...{critèrex}>
    Code HTML + balises SPIP
</BOUCLEn>
    Code HTML optionnel après
</Bn>
    Code HTML alternatif
<//Bn>

Le code optionnel avant (précédé de <Bn>) n’est affiché que si la boucle contient au moins une réponse. Il est affiché avant les résultats de la boucle.

Le code optionnel après (terminé par </Bn>) n’est affiché que si la boucle contient au moins une réponse. Il est affiché après les résultats de la boucle.

Le code alternatif (terminé par <//Bn>) est affiché à la place de la boucle (et donc également à la place des codes optionnels avant et après) si la boucle n’a trouvé aucune réponse.

Par exemple, le code :

<B1>
    Cette rubrique contient les éléments suivants:
    <UL>
<BOUCLE1(ARTICLES){id_rubrique}>
    <LI>#TITRE
</BOUCLE1>
    </UL>
</B1>
    Cette rubrique ne contient pas d'article.
<//B1>

donne les résultats suivants :

- Il y a un seul article :

    Cette rubrique contient les éléments suivants:
    <UL>
      <LI> Titre de l'article
    </UL>

- Il y a plusieurs articles :

    Cette rubrique contient les éléments suivants:
    <UL>
      <LI> Titre de l'article 1
      <LI> Titre de l'article 2
      ...
      <LI> Titre du dernier article
    </UL>

- Il n’y a aucun article :

    Cette rubrique ne contient pas d'article.

Remarque : La manière dont SPIP interprète les boucles interdit de mettre une boucle entre <B1> et <BOUCLE1>. Par contre, il est possible de mettre des boucles supplémentaires dans les parties optionnelles situées après la définition <BOUCLE1...>. Si vous devez vraiment installer une boucle dans la partie optionnelle avant, il faut passer par une commande <INCLURE()>, voir ci-dessous...

Des critères d’environnement en cascade

Chaque boucle effectue la sélection des éléments tirés de la base de données en fonction de critères. Ces critères correspondent à l’environnement dans lequel se trouve la boucle.

Par exemple : si on prévoit une boucle du genre « Afficher les articles inclus dans cette rubrique », il faut savoir de quelle rubrique il s’agit. C’est ce que l’on nomme l’environnement.

- L’environnement fourni par l’URL

Lorsque l’on visite une page d’un site SPIP, son adresse contient généralement une variable. Par exemple :
- rubrique.php3 ?id_rubrique=15

Cette variable définit donc un premier environnement : la boucle « Afficher les articles inclus dans cette rubrique » doit alors être compris comme « Afficher les articles de la rubrique 15 ».

Clairement, avec le même code de squelette, si on appelle l’adresse :
- rubrique.php3 ?id_rubrique=7

l’interprétation de cette boucle deviendra « Afficher les articles de la rubrique 7 ».

- L’environnement fourni par les autres boucles

À l’intérieur d’une boucle, l’environnement est modifié par chaque élément de la boucle. En plaçant des boucles les unes à l’intérieur des autres, on hérite ainsi d’environnements imbriqués les uns dans les autres.

Ainsi, dans la structure suivante :

<BOUCLE_articles: afficher les articles de cette rubrique>
    <LI>Afficher le titre de l'article
    <BOUCLE_auteurs: afficher les auteurs de cet article>
    Nom de l'auteur
    </BOUCLE_auteurs>

</BOUCLE_articles>

On doit comprendre que :
- la première boucle (BOUCLE_articles) affiche les articles en fonction de la rubrique, selon l’environnement fournit par l’URL (id_rubrique=15 par exemple) ;
- dans cette boucle, on obtient un ou plusieurs articles ;
- « à l’intérieur » de chacun de ces articles, on a un environnement différent (celui de l’article, c’est-à-dire, par exemple, id_article=199) ;
- la seconde boucle (BOUCLE_auteurs), qui est installée à l’intérieur de la première boucle, dépend pour chacune de ses exécutions successives (elle est exécutée pour chaque article de la première boucle) : « afficher les auteurs de cet article » devient successivement « afficher les auteurs du premier article », « du deuxième article » et ainsi de suite.

On voit que, par l’imbrication de boucles successives, on obtient différentes boucles, incluses les unes dans les autres, qui dépendent du résultat des boucles dans lesquelles elles sont situées. Et finalement, la toute première boucle (celle qui contient toutes les autres) dépend d’un paramètre fixé dans l’adresse de la page.

Boucles incluses et boucles successives

Si l’on peut inclure des boucles les unes à l’intérieur des autres (chaque boucle incluse dépendant alors du résultat de la boucle à l’intérieur de laquelle elle est installée), on peut tout aussi bien installer des boucles les unes à la suite des autres ; des boucles successives n’influent pas les unes sur les autres.

Par exemple, la page d’une rubrique est typiquement constituée des éléments suivants :

<BOUCLE_rubrique(RUBRIQUES){id_rubrique}>
    Titre de la rubrique
      <BOUCLE_articles(ARTICLES){id_rubrique}>
      <LI> Titre de l'article
      </BOUCLE_articles>

      <BOUCLE_sous_rubriques(RUBRIQUES){id_rubrique}>
      <LI> Titre de la sous-rubrique
      </BOUCLE_sous_rubriques>
</BOUCLE_rubrique>
    Il n'y a pas de rubrique à cette adresse.
<//B_rubrique>

La première boucle (BOUCLE_rubrique) dépend de la variable passée dans l’URL de la page (id_rubrique=15 par exemple).

Les boucles suivantes (BOUCLE_articles et BOUCLE_sous_rubriques) sont installées à l’intérieur de la première boucle. Ainsi, s’il n’existe pas de rubrique 15, la première boucle ne donne aucun résultat (le code alternatif « Il n’y a pas de rubrique... » est affiché), et donc les deux rubriques incluses sont totalement ignorées. Mais s’il existe une rubrique 15, ces deux sous-boucles seront analysées.

On constate également que ces deux boucles se présentent l’une après l’autre. Ainsi, elles fonctionnent en fonction de la première boucle, mais indépendamment l’une de lautre. S’il n’y a pas d’articles dans la rubrique 15 (BOUCLE_articles), on affichera tout de même la liste des sous-rubriques de la rubrique 15 (BOUCLE_sous_rubriques) ; et inversement.

 
 
l’équipe de SPIP
Imprimer
format impression
l’équipe de SPIP
2 septembre 2002
1er juin 2001
24 mai 2001
 
SPIP
Web indépendant


> 3. La syntaxe des boucles
24 août 2001, message de oelita
 

Dans la partie optionnelle avant, peut-on uniquement mettre du HTML pur, ou bien peut-on faire une autre boucle ?

Répondre


lister toutes les sous rubriques de la rubrique courante
15 août 2001
 

tout d’abord ficelle de caleçon..euh nan félicitation pour le soft. comme dirait un certain joey...hmmm c’est dla bombe baby :)

bref, après avoir imprimé et lu la doc 1-19 guide du bidouilleur, j’ai testé diverses boucles pour afficher les sous-rubriques de la rubrique affichée, la dernière boucle qui me semble la plus proche mais donne une erreur. voici ma requête :


#TITRE /

si quelqu’un pouvait m’aider à résoudre ce problème...
merci :)

Répondre
> lister toutes les sous rubriques de la rubrique co, 15 août 2001

oups les balises n’ont pas été converties...
ma requête était :

<BOUCLE_liste_sous_rub(RUBRIQUES)meme_parentpar titre
<A HREF="#URL_RUBRIQUE">#TITRE</A> /
</BOUCLE_liste_sous_rub>

Répondre


filtre id_rubrique avec variable php
23 juillet 2001, message de Philippe Renard
 

bonjour,

je souhaite utiliser le filtre (id_rubrique= avec une variable php e je n’y arrive pas.
j’ai essayé différentes syntaxe et rien ne fonctionne
exemple
dans mes_fonctions.ph3 j’ai mis
Id_Rub_Toto = 7 ; ou Id_Rub_Toto = "7" ;

et dans mon squelette (sommaire.html en l’occurence), une boucle article avec id_rubrique=$Id_Rub_Toto ou id_rubrique= <?$Id_Rub_Toto?> ou id_rubrique= <?echo $id_Rub_Toto ?>

Est ce faisable ? si oui, quelle est la possibilité que je n’ai pas explorée ?

Merci d’avance
Philippe.

PS : pourquoi vouloir faire cela ?

Mon site est en développement et la base comprend un peu n’importe quoi (faut bien faire des tests). Je veux avoir les numéros des rubriques spécifiques (par exemple agenda ou revue de presse) sous forme de variable, pour ne pas devoir revoir tout mes fichiers au moment ou j’épurerai ma base et ou ls numéros de rubrique risquent de changer.

Répondre
> filtre id_rubrique avec variable php, ARNO*, 23 juillet 2001

On ne peut pas.

- En effet, l’analyse des boucles se fait sur le texte brut, et non sur des variables PHP. Lorsqu’il fabrique le fichier cache, SPIP analyse "id_rubrique=7", en tant que texte, non en tant que fonction PHP.

- Ensuite seulement le fichier cache (qui ne contient plus de boucles, mais uniquement le texte HTML (et PHP s’il y en a) est sauvegardé, puis inclus lors de la visite (d’où interprétation du PHP).

- De fait, impossible de balance "id_rubrique=$variable" dans une boucle, puisque "$variable" est compris comme du texte pur, donc SPIP ne peut rien faire à ce moment-là.

Répondre
> > filtre id_rubrique avec variable php, paco, 18 septembre 2001

Si on en peut pas passer une variable, peut-on au moins utiliser une constante ? C’est-à-dire entrer directement le nom de la rubrique, genre BOUCLE Rubrique id_rubrique=7 ?
Passer par une variable environnement (?id_rubrique) ne convient pas si on veut sur la même page deux colonnes traitant de deux rubriques différentes, par exemple.

Répondre