Boucles et listes¶
Les boucles vous permettent de répéter un composant pour chaque élément d'une liste. Définissez l'état spécial __data sur une expression de liste, et Silex clone le composant une fois par élément, en le remplissant avec les données de chaque élément.
C'est ainsi que vous affichez une liste d'articles de blog, un catalogue de produits ou des cartes de membres d'équipe — un modèle de composant, répété pour chaque élément.
Comprendre l'état __data¶
L'état __data est spécial — il contrôle les boucles.
Lorsque vous définissez __data sur une expression de liste (par exemple, posts), Silex :
- Évalue l'expression pour obtenir une liste d'éléments
- Clone le composant une fois par élément
- Pour chaque clone, définit l'élément comme « courant »
- Les autres états du composant peuvent référencer l'élément courant
Exemple : posts s'évalue en une liste de 5 articles. Définissez __data sur posts, et le composant apparaît 5 fois sur le canevas, une fois pour chaque article.
Configurer une boucle¶
Étape 1 : Créer le composant — Ajoutez un composant à votre page (un div, une section carte ou tout conteneur). C'est votre modèle de boucle.
Étape 2 : Designer le modèle — Ajoutez des enfants à l'intérieur (texte pour le titre, image pour l'image mise en avant, lien, etc.). C'est ce qui se répète.
Étape 3 : Créer l'état __data
1. Sélectionnez le composant
2. Ouvrez le panneau Données
3. Cliquez sur Ajouter un état
4. Pour le nom de l'état, entrez __data (sensible à la casse, avec deux tirets bas)
5. Construisez une expression qui renvoie une liste : posts
6. Enregistrez
Le composant se répète désormais une fois par article. Sur le canevas, vous voyez plusieurs clones empilés verticalement (ou arrangés selon votre CSS).
Accéder à l'élément courant dans une boucle¶
À l'intérieur d'une boucle, « élément courant » désigne les données de ce clone spécifique.
Pour afficher le titre de chaque article dans la boucle :
- À l'intérieur de votre composant modèle, ajoutez un titre
- Créez un état
innerHTMLsur le titre - Construisez l'expression — mais comment référencer « l'élément courant » ?
L'élément courant est accessible via une référence d'état. Si votre composant parent (la boucle) a un état public, vous le référencez. Silex appelle cela l'état des éléments ou le contexte de boucle.
Approche simplifiée : Dans l'éditeur d'expressions, après avoir sélectionné votre premier jeton (posts), l'étape suivante vous donne automatiquement accès aux champs individuels des articles. Vous construisez : tout comme first post → title, vous pouvez construire current post → title.
En pratique, si votre boucle est définie sur posts, les composants enfants voient chaque article individuellement. Donc un état comme posts → title à l'intérieur d'une boucle fait automatiquement référence au titre de l'article courant en cours de rendu.
Exemple pratique : liste d'articles de blog¶
Scénario : vous souhaitez afficher une liste de 5 articles de blog avec titre, extrait et image mise en avant.
- Ajoutez un Div (le conteneur de boucle)
-
Stylisez-le avec Flexbox : Display Flex, Flex-wrap wrap, Column-gap 20px (optionnel — juste pour la mise en page visuelle)
-
À l'intérieur du Div, ajoutez un Div Carte (une carte d'article) avec :
- Un titre pour le titre de l'article
- Un paragraphe pour l'extrait
-
Une image pour l'image mise en avant
-
Sélectionnez le Div Carte et créez l'état
__data: - Expression :
posts -
La carte se répète désormais 5 fois sur le canevas
-
Pour le titre à l'intérieur de la carte, créez un état :
- Nom :
innerHTML - Expression :
posts → title -
Attention — à l'intérieur d'une boucle, cela fait automatiquement référence au titre de l'article courant
-
Pour le paragraphe (extrait) :
- Nom :
innerHTML -
Expression :
posts → excerpt -
Pour l'image :
- Nom :
src - Expression :
posts → featured_image → url - Nom :
alt -
Expression :
posts → featured_image → alt -
Activez l'aperçu — vous voyez désormais 5 cartes d'articles de blog sur le canevas, chacune remplie avec des données différentes.
Boucles imbriquées¶
Vous pouvez imbriquer des boucles dans des boucles. Par exemple, afficher chaque article avec une liste de commentaires à l'intérieur.
Configuration :
1. Composant extérieur (boucle 1) : __data = posts
2. À l'intérieur, ajoutez un composant pour les commentaires (boucle 2) : __data = current_post → comments
3. Chaque commentaire a accès à son article parent
L'imbrication fonctionne car la boucle interne définit son propre contexte.
Limiter les résultats de boucle avec des filtres¶
Au lieu de répéter tous les articles, vous pourriez ne vouloir que les 3 premiers, ou uniquement les articles d'une certaine catégorie.
Modifiez votre expression __data :
posts → slice → (0, 3)— uniquement les 3 premiers articlesposts → where (category = "news")— uniquement les articles de la catégorie actualitésposts → reverse— articles dans l'ordre inverse
Les filtres sont appliqués avant le rendu de la boucle, donc vous ne répétez que les éléments qui correspondent.
Index et position de boucle¶
À l'intérieur d'une boucle, vous pourriez vouloir afficher la position (1er, 2e, 3e article).
Silex fournit un état spécial __index sur chaque clone. Vous pouvez le référencer pour afficher ou styliser conditionnellement les éléments :
- Utilisez
__indexpour appliquer des styles différents au premier élément - Affichez
__index + 1pour montrer "1 sur 5" (car l'index commence à 0)
Comportement de l'aperçu dans les boucles¶
Lors de l'aperçu, Silex récupère les données en direct et affiche les clones sur le canevas. Vous pouvez voir :
- Comment la mise en page apparaît avec du vrai contenu
- Si le texte passe à la ligne ou déborde
- Si les images s'affichent correctement
Si vous avez 100 éléments dans la boucle, Silex peut n'afficher que les 10 premiers environ sur le canevas pour des raisons de performance. La liste complète est rendue lors de la publication.
Erreurs courantes¶
- Oublier de définir __data. Un composant régulier ne boucle pas sauf si vous définissez l'état spécial
__data. - Utiliser un scalaire au lieu d'une liste.
__datadoit être une expression de liste. Le définir surposts → first(un seul article) ne créera pas de boucle. - Essayer d'afficher l'objet entier. Si
__data=posts, et que vous essayez ensuite d'afficherpostsdans un enfant, cela affiche "[object Object]". Naviguez plutôt vers un champ scalaire :posts → title. - Oublier de designer le modèle. Ajoutez des enfants au composant de boucle avant de définir
__data. Si vous définissez__datasur un div vide, il répète un div vide.
En savoir plus¶
- Lier les données — créer des états en général
- Expressions — comprendre comment chaîner les jetons
- Conditions — masquer/afficher des éléments dans une boucle en fonction des données
- Filtres — transformer les listes (slice, where, reverse, sort, etc.)
Quiz¶
Q1 : Vous souhaitez répéter un composant pour chaque article de votre blog. Quel état spécial créez-vous ?
- A)
loop - B)
__data - C)
items
Réponse
B) __data — L'état spécial __data (avec deux tirets bas) contrôle les boucles. Lorsque vous le définissez sur une expression de liste, le composant se répète une fois par élément.
Q2 : À l'intérieur d'une boucle, vous souhaitez afficher le titre de chaque article. Quelle expression utilisez-vous ?
- A)
posts → title(le titre de chaque article) - B)
title(le titre de l'article courant, implicitement) - C)
current → title(l'élément courant)
Réponse
A) posts → title — Même à l'intérieur d'une boucle, vous construisez l'expression complète. À l'intérieur d'une boucle, cette expression est évaluée pour chaque élément, donc elle fait référence au titre de l'article courant.
Q3 : Votre boucle a __data = posts, mais elle ne se répète pas. Quel est le problème le plus probable ?
- A)
postsest vide (pas d'articles dans votre API) - B) Vous avez défini
__datasur un seul élément au lieu d'une liste - C) L'aperçu est désactivé
Réponse
A) posts est vide (pas d'articles dans votre API) — Si l'expression s'évalue en une liste avec des éléments, la boucle se répète. Vérifiez votre API pour confirmer que des articles existent. Si l'expression renvoie un seul élément (B), ce serait incorrect et causerait une erreur.
Q4 : Vous souhaitez que seuls les 3 premiers articles se répètent dans la boucle. Sur quoi définissez-vous __data ?
- A)
posts → first → slice(0,3) - B)
posts → slice(0,3) - C)
first posts → 3
Réponse
B) posts → slice(0,3) — Le filtre slice réduit une liste à une plage. Il prend un index de début et de fin (début à 0, fin à 3 = 3 premiers éléments).
Q5 : Vous avez une boucle d'articles de blog, et à l'intérieur de chaque article, vous souhaitez afficher les commentaires. Comment configurez-vous l'imbrication des boucles ?
- A) Créer un état
__datasur le composant d'article aveccomments - B) Créer un état
__datasur le composant d'article avecposts → comments - C) Vous ne pouvez pas imbriquer des boucles dans Silex
Réponse
A) Créer un état __data sur le composant d'article avec comments — La boucle interne accède au champ commentaires de l'article courant. Comme la boucle externe définit le contexte de l'article, la boucle interne peut directement référencer comments (les commentaires de l'article courant).