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érationcollection- 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 :
- Vérifie si la collection contient des éléments
- Parcourt les éléments s'ils sont disponibles
- 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
- Limiter la taille de la collection - Filtrer les grandes collections avant le traitement des modèles
- Évitez les nids profonds - Limitez les boucles imbriquées à 2 ou 3 niveaux pour de meilleures performances.
- Données prétraitées - Effectuer des calculs complexes avant de transmettre les données aux modèles
- 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>>
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.