Expand document generation guide with detailed examples for conditions, decision trees, and loops; update related images and cheatsheet.

This commit is contained in:
2026-09-22 11:08:48 +02:00
parent 30a023d6c8
commit 5a5bca1d45
2 changed files with 113 additions and 4 deletions
@@ -41,13 +41,13 @@
| Balise | Contenu |
| --- | --- |
| Balise ouvrante de la condition | `if test="v.mainPerson.age > 18` |
| Balise ouvrante de la condition | `if test="v.mainPerson.age > 18"` |
| Balise fermante | `/if` |
![Exemple de condition](/admin/img/generation-document/libre-office-renvoi-if.png)
### Arbre de décision
### Choisir parmi plusieurs cas: `choose`
| Balise | Contenu |
| --- | --- |
@@ -58,9 +58,9 @@
| Balise fermante de la deuxième condition | `/when` |
| Balise restante | `otherwise test=""` |
| Balise fermante de la troisième condition | `/otherwise` |
| Balise fermante | `</choose>` |
| Balise fermante | `/choose` |
![Arbre de décision](/admin/img/generation-document/libre-office-renvoi-if-match.png)
![Choisir parmi plusieurs cas](/admin/img/generation-document/libre-office-renvoi-if-match.png)
## Boucles
+109
View File
@@ -228,3 +228,112 @@ Les champs suivant sont disponibles:
* une variable `mainPerson` ([Person](#sec:entity-person)), la personne principale parmi les personnes participant au rendez-vous. Cette variable n'est présente que si l'administrateur fonctionnel l'a configurée.
* une variable `thirdParty` ([ThirdParty](#sec:entity-thirdparty)): un tiers participant au rendez-vous. Cette variable n'est présente que si l'administrateur fonctionnel l'a configurée.
## Conditions
Il est possible d'afficher une partie du document uniquement dans certaines situations. Pour cela, on insère un substituant qui "ouvre" la condition, et un autre qui la "ferme". Tout ce qui est écrit entre ces deux substituants n'apparaitra dans le document généré que si la condition est remplie.
### Afficher un contenu sous condition: `if`
| Balise | Contenu |
| --- | --- |
| Balise ouvrante de la condition | `if test="v.mainPerson.age > 18"` |
| Balise fermante | `/if` |
![Exemple de condition](/admin/img/generation-document/libre-office-renvoi-if.png)
Le contenu de `test` peut être n'importe quel code python: il s'agit d'une expression qui est évaluée, et dont le résultat doit être `vrai` ou `faux`. On peut donc y utiliser les opérateurs de comparaison (`==`, `!=`, `>`, `>=`, `<`, `<=`), les opérateurs logiques (`and`, `or`, `not`), l'appartenance à une liste (`in`), mais aussi les méthodes du langage python sur les textes.
Par exemple, pour n'afficher un paragraphe que lorsque le parcours est au statut "en file active", on écrira:
```
if test="v.course.step.lower() == 'en file active'"
```
Dans cet exemple:
* `v.course.step` est la variable contenant l'étape du parcours (un texte, traduit dans la langue de l'utilisateur);
* `.lower()` est une méthode python qui met ce texte en minuscules. Cela évite les mauvaises surprises liées aux majuscules (`En file active`, `EN FILE ACTIVE`, …);
* `==` compare le résultat avec le texte `'en file active'`, entouré de guillemets simples parce qu'il s'agit d'un texte.
::: {.note}
Les textes sont entourés de guillemets simples (`'…'`), car les guillemets doubles (`"…"`) sont déjà utilisés pour délimiter le contenu de `test`.
:::
Quelques autres exemples valides:
```
if test="v.mainPerson.age >= 18 and v.mainPerson.age < 65"
if test="v.person.birthdate.short != ''"
if test="not v.course.emergency"
if test="len(v.course.currentParticipations) > 1"
```
### Choisir parmi plusieurs cas: `choose`
Lorsque plusieurs cas s'excluent mutuellement, on peut les enchainer: les tests sont évalués dans l'ordre, le contenu du premier `when` dont le test est vrai est affiché, et, si aucun ne l'est, c'est le contenu de `otherwise` qui apparait. C'est l'équivalent d'une suite « si … sinon si … sinon ».
| Balise | Contenu |
| --- | --- |
| Balise ouvrante | `choose test=""` |
| Balise ouvrante de la première condition | `when test="v.person.age < 18"` |
| Balise fermante de la première condition | `/when` |
| Balise ouvrante de la deuxième condition | `when test="v.person.age >= 18 and v.person.age < 65"` |
| Balise fermante de la deuxième condition | `/when` |
| Balise restante | `otherwise test=""` |
| Balise fermante de la troisième condition | `/otherwise` |
| Balise fermante | `/choose` |
![Choisir parmi plusieurs cas](/admin/img/generation-document/libre-office-renvoi-if-match.png)
## Boucles
Les boucles s'appliquent sur les listes: elles permettent de répéter une partie du document pour chaque élément d'une liste. Les variables de type "liste" sont indiquées dans la [description des variables par contexte](#sec:gendoc-champs-documents) et dans la [description des objets](properties.md) (par exemple, "liste de [Activity](#sec:entity-activity)").
| Balise | Contenu |
| --- | --- |
| Balise ouvrante de la boucle | `for each="m in v.loop"` |
| Balise fermante de la boucle | `/for` |
Exemple:
![Exemple de boucle](/admin/img/generation-document/libre-office-renvoi-loop.png)
### Fonctionnement des projections dans une itération
Dans la balise ouvrante, l'expression s'écrit sous la forme `variable in liste`. Par exemple, avec `p in v.course.currentParticipations`:
* `v.course.currentParticipations` est la liste sur laquelle on itère (ici, les participations en cours du parcours);
* `p` est le nom de la variable que l'on choisit librement: c'est la "projection" de l'élément courant. À chaque itération, `p` est remplacée par un élément de la liste, l'un après l'autre.
À l'intérieur de la boucle, on n'utilise donc plus `v.` pour accéder aux éléments de la liste, mais le nom de la projection. Si les participations sont des objets de type `AccompanyingPeriodParticipation`, qui contiennent un champ `person`, on écrira, entre les balises ouvrante et fermante:
```
p.person.firstName
p.person.lastName
```
Le contenu placé entre `for each="p in v.course.currentParticipations"` et `/for` sera alors répété autant de fois qu'il y a de participations, avec, chaque fois, les données de la participation courante.
::: {.note}
À l'intérieur d'une boucle, les variables du contexte (`v.course`, `v.mainPerson`, …) restent accessibles: seule la projection (`p`, dans l'exemple) change à chaque itération.
:::
Les boucles et les conditions peuvent être combinées. Par exemple, pour n'afficher que les usagers majeurs:
```
for each="p in v.course.currentParticipations"
if test="p.person.age >= 18"
p.person.firstName p.person.lastName
/if
/for
```
Il est également possible d'imbriquer des boucles, en prenant soin de choisir un nom de projection différent pour chaque niveau (par exemple `p` pour les participations, et `a` pour les activités).