Aller au contenu principal

Répéter les paragraphes - Guide de la boucle foreach

Les documents contiennent fréquemment des structures de contenu répétitives telles que des listes d'éléments, plusieurs enregistrements ou des sections répétées avec une mise en forme similaire. PDF4meLe moteur de modèles de offre de puissantes capacités d'itération pour générer dynamiquement plusieurs paragraphes et sections à partir de collections de données.


Comprendre les boucles foreach

Le foreach La boucle est le principal mécanisme permettant de parcourir les collections de données et de générer du contenu répétitif. Chaque itération traite un élément de la collection et génère la sortie correspondante.

Syntaxe de base de foreach

<<foreach [item in collection]>>
Content with <<[item.property]>>
<</foreach>>

Composants :

  • item - Variable représentant l'élément courant dans l'itération
  • collection - Le tableau ou la collection de données à parcourir
  • Bloc de contenu - Contenu du modèle répété pour chaque élément

Paragraphes répétitifs

Générez plusieurs paragraphes en parcourant une collection de données et en créant un texte formaté pour chaque élément.

Exemple : Évaluations des applications

Syntaxe du modèle :

<<foreach [app in applications]>><<[app.listAppName]>> in <<[app.listAppType]>> platform is a <<[app.category]>> app and has a <<[app.AppRating]>> rating.
<</foreach>>

Source de données (JSON):

{
"surveyName": "Top-rated Apps",
"applications": [
{
"listAppName": "Instagram",
"listAppType": "iOS",
"category": "Social Media",
"AppRating": "4.9"
},
{
"listAppName": "Whatsapp",
"listAppType": "iOS",
"category": "Chat",
"AppRating": "4.8"
},
{
"listAppName": "Player UG",
"listAppType": "Android",
"category": "Gaming",
"AppRating": "4.75"
}
]
}

Résultat généré :

Instagram in iOS platform is a Social Media app and has a 4.9 rating.
Whatsapp in iOS platform is a Chat app and has a 4.8 rating.
Player UG in Android platform is a Gaming app and has a 4.75 rating.

Gestion des collections vides

Lorsqu'une collection est susceptible d'être vide, utilisez la Any() Méthode permettant de vérifier la présence de données avant l'itération. Cela évite les exceptions de valeur nulle et permet d'afficher un contenu alternatif.

Vérification nulle de base

Modèle avec vérification Any() :

<<if [applications.Any()]>>
<<foreach [app in applications]>><<[app.listAppName]>> in <<[app.listAppType]>> platform is a <<[app.category]>> app and has a <<[app.AppRating]>> rating.
<</foreach>>
<<else>>No applications listed
<</if>>

Cette approche :

  1. Vérifie si la collection contient des éléments
  2. Parcourt les éléments s'ils sont disponibles
  3. Affiche un message d'erreur si la collection est vide.

Boucles foreach imbriquées

Créez des structures hiérarchiques en imbriquant des boucles foreach. Ceci est utile pour afficher les relations parent-enfant ou les structures de données à plusieurs niveaux.

Exemple : Département et employés

Modèle:

<<foreach [dept in departments]>>
Department: <<[dept.name]>>
<<foreach [emp in dept.employees]>>
- <<[emp.name]>> (<<[emp.position]>>)
<</foreach>>
<</foreach>>

Données:

{
"departments": [
{
"name": "Engineering",
"employees": [
{ "name": "John Smith", "position": "Senior Developer" },
{ "name": "Jane Doe", "position": "Tech Lead" }
]
},
{
"name": "Marketing",
"employees": [
{ "name": "Mike Johnson", "position": "Marketing Manager" }
]
}
]
}

Répétition de sections complexes

Les boucles foreach peuvent répéter des sections entières de contenu, y compris plusieurs paragraphes, la mise en forme et les structures imbriquées.

Répétition de plusieurs paragraphes

Modèle:

<<foreach [product in products]>>
Product Name: <<[product.name]>>
Description: <<[product.description]>>
Price: $<<[product.price]>>
Available: <<[product.inStock]>>

<</foreach>>

Ce modèle génère un bloc de description complet pour chaque produit, en conservant la mise en forme et les sauts de paragraphe.


Itération conditionnelle

Combinez les boucles foreach avec des instructions conditionnelles pour une génération de contenu sélective.

Exemple : Affichage conditionnel

Modèle:

<<foreach [employee in employees]>>
<<if [employee.age > 50]>>
Senior Employee: <<[employee.name]>> - Age: <<[employee.age]>>
<</if>>
<</foreach>>

Vous pouvez également utiliser des méthodes d'énumération :

Modèle:

<<foreach [employee in employees.Where(e => e.age > 50)]>>
Senior Employee: <<[employee.name]>> - Age: <<[employee.age]>>
<</foreach>>

Mise en forme à l'intérieur des boucles

Appliquez une mise en forme aux champs à l'intérieur des boucles foreach pour obtenir un style de sortie cohérent.

Modèle:

<<foreach [customer in customers]>>
Customer: <<[customer.name]:caps>>
Last Visit: <<[customer.lastVisit]:"MMMM dd, yyyy">>
Status: <<[customer.status]:upper>>

<</foreach>>

Variables de boucle et indexation

Accédez aux informations de position de la boucle à l'aide de variables implicites (si votre version du moteur de modèles le prend en charge).

Variables de boucle communes

  • Index de l'élément actuel (à partir de 0 ou à partir de 1 selon l'implémentation)
  • nombre d'itérations de la boucle
  • Indicateurs de premier/dernier élément

Exemple d'utilisation (si pris en charge) :

<<foreach [item in items]>>
<<[$index + 1]>>. <<[item.name]>>
<</foreach>>

Considérations relatives aux performances

Meilleures pratiques pour les boucles

  1. Limiter la taille de la collection - Filtrer les grandes collections avant le traitement des modèles
  2. Évitez les nids profonds - Limitez les boucles imbriquées à 2 ou 3 niveaux pour de meilleures performances.
  3. Données prétraitées - Effectuer des calculs complexes avant de transmettre les données aux modèles
  4. Utilisez des requêtes efficaces - Filtrer et trier les données au niveau de la source de données

Exemple : Données préfiltrées

Au lieu de:

<<foreach [emp in employees.Where(e => e.age > 30).OrderBy(e => e.name)]>>

Préfiltrez les données dans votre application et transmettez les données filtrées :

<<foreach [emp in filteredEmployees]>>

Modèles courants

Modèle 1 : Liste numérotée

<<foreach [item in items]>>
<<[$index]>>. <<[item.title]>>
<</foreach>>

Modèle 2 : Contenu groupé

<<foreach [category in categories]>>
## <<[category.name]>>

<<foreach [item in category.items]>>
- <<[item.name]>>
<</foreach>>
<</foreach>>

Modèle 3 : Section récapitulative

<<foreach [report in reports]>>
Report: <<[report.title]>>
Total Records: <<[report.records.Count()]>>
Average Value: <<[report.records.Average(r => r.value)]>>
<</foreach>>

Dépannage

Problèmes courants

Problème: Erreurs de référence nulle Solution: Utiliser Any() vérifier les collections avant l'itération

Problème: Sauts de ligne ou espacements indésirables Solution: Gérez soigneusement les espaces blancs dans votre modèle

Problème: Problèmes de performance avec les grandes collections Solution: Préfiltrer les données et limiter la taille de la collecte

Problème: Liaison de données incorrecte Solution: Vérifiez que les noms des propriétés correspondent exactement à votre structure de données.


Exemple pratique : Lignes de facture

Modèle complet :

Invoice #<<[invoiceNumber]>>
Date: <<[invoiceDate]:"dd.MM.yyyy">>

Items:
<<if [lineItems.Any()]>>
<<foreach [item in lineItems]>>
<<[item.name]:caps>> - Qty: <<[item.quantity]>> - Price: $<<[item.price]:"F2">> - Total: $<<[item.quantity * item.price]:"F2">>
<</foreach>>

Subtotal: $<<[lineItems.Sum(i => i.quantity * i.price)]:"F2">>
<<else>>
No items in this invoice.
<</if>>

Itérations complexes

Pour les scénarios d'itération complexes, envisagez de prétraiter vos données dans la logique de votre application avant de les transmettre au modèle. Cela améliore la lisibilité et les performances du modèle.