# CHAPITRE 19 — La grammaire des slots en détail

Référence exhaustive de tous les types de slot et de leurs attributs. Gardez ce chapitre à portée de main lors de l'annotation d'un template.

### <span style="color: rgb(35, 111, 161);">Format général</span>

```
{{slot:<name>|type=<type>|default=<value>|label=<text>|group=<section>|help=<text>|maxlength=<int>|options=<csv>}}
```

<span style="white-space: pre-wrap;">Tous les attributs, à l'exception de </span>`<span class="editor-theme-code">name</span>`<span style="white-space: pre-wrap;"> et </span>`<span class="editor-theme-code">type</span>`, sont facultatifs. L'ordre est libre. Le séparateur est le caractère pipe.

### <span style="color: rgb(35, 111, 161);">Règles syntaxiques</span>

<table id="bkmrk-r%C3%A8gled%C3%A9tailidentifia" style="width: 100%; border-collapse: collapse; margin: 1rem 0px; font-size: 0.95em;"><colgroup><col></col><col></col></colgroup><tbody><tr style="background: rgb(25, 5, 45); color: rgb(254, 252, 232);"><th class="align-left" style="padding: 0.6rem 1rem; text-align: left; border: 1px solid rgb(25, 5, 45);">Règle

</th><th class="align-left" style="padding: 0.6rem 1rem; text-align: left; border: 1px solid rgb(25, 5, 45);">Détail

</th></tr><tr><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">**Identifiant**

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">`<span class="editor-theme-code">[a-z0-9_]+</span>`

, 64 caractères maximum. Pas de tirets, pas de majuscules.

</td></tr><tr style="background: rgb(250, 245, 255);"><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">**Unicité**

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Unique par page. Deux slots avec le même nom sur la même page produisent un avertissement au scan.

</td></tr><tr><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">**Pas d'espaces**

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);"><span style="white-space: pre-wrap;">Aucun espace de part et d'autre du signe </span>

`<span class="editor-theme-code">=</span>`

. Aucun espace dans les noms d'attributs.

</td></tr><tr style="background: rgb(250, 245, 255);"><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">**Échappement**

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);"><span style="white-space: pre-wrap;">Le pipe à l'intérieur d'une valeur n'est pas pris en charge. Évitez-le dans les valeurs </span>

`<span class="editor-theme-code">default</span>`

.

</td></tr><tr><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">**Une seule ligne**

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Un token de slot tient sur une seule ligne. Aucun saut de ligne ne doit y être présent.

</td></tr></tbody></table>

### <span style="color: rgb(35, 111, 161);">Les dix types de slot</span>

##### **Type text — Texte court**

Champ d'une seule ligne, sans mise en forme.

```
<h1>{{slot:hero_title|type=text|default=Bienvenue|label=Titre principal|maxlength=80}}</h1>
```

- Interface : champ de saisie simple.
- Idéal pour : titres, libellés, boutons d'appel à l'action, copyright.
- <span style="white-space: pre-wrap;">Compteur de caractères affiché si </span>`<span class="editor-theme-code">maxlength</span>`<span style="white-space: pre-wrap;"> est défini.</span>

##### **Type textarea — Texte long brut**

Multi-lignes, sans mise en forme HTML.

```
<p class="lead">{{slot:hero_lead|type=textarea|default=Une accroche.|label=Accroche|maxlength=300}}</p>
```

- Interface : zone de texte multi-lignes.
- <span style="white-space: pre-wrap;">Les retours à la ligne sont automatiquement convertis en balises </span>`<span class="editor-theme-code"><br></span>`<span style="white-space: pre-wrap;"> au rendu.</span>
- Idéal pour : accroches, paragraphes simples.

##### **Type richtext — Texte riche WYSIWYG**

Mise en forme complète via CKEditor.

```
<div class="post-body">
    {{slot:post_body|type=richtext|default=<p>Contenu de l'article.</p>|label=Corps de l'article}}
</div>
```

- Interface : éditeur CKEditor (Format, gras, italique, listes, liens, couleurs, alignement, etc.).
- Idéal pour : corps d'articles, descriptions longues, conditions générales.
- La valeur stockée contient du HTML (`<span class="editor-theme-code"><p></span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code"><strong></span>`, etc.).

##### **Type image — Média image**

```
<img src="{{slot:hero_image|type=image|default=/medias/hero.jpg|label=Image hero}}" alt="...">
```

- Interface : champ texte, bouton de sélection dans la bibliothèque, bouton de suppression et vignette d'aperçu.
- <span style="white-space: pre-wrap;">Stocke soit une URL absolue, soit un shortcode </span>`<span class="editor-theme-code">{{media:ref=X.url}}</span>`.
- Non traduisible par défaut : la même image est servie dans toutes les langues.

##### **Type url — Lien**

```
<a href="{{slot:hero_cta_url|type=url|default=/contact|label=URL du bouton}}">...</a>
```

- Interface : champ texte avec validation URL légère.
- Idéal pour : URL de bouton, liens vers les réseaux sociaux, URL de partage.

##### **Type icon — Icône FontAwesome**

```
{{slot:feature_1_icon|type=icon|default=fa-solid fa-rocket|label=Icône feature 1}}
```

- Interface : champ classe, sélecteur de couleur, vingt icônes proposées en accès rapide, aperçu en direct.
- <span style="white-space: pre-wrap;">Stockage en JSON : </span>`<span class="editor-theme-code">{"class":"fa-solid fa-star","color":"#fbbf24"}</span>`.
- <span style="white-space: pre-wrap;">Rendu : </span>`<span class="editor-theme-code"><i class="fa-solid fa-star" style="color:#fbbf24"></i></span>`.
- Sécurisé : liste blanche sur la classe (a-zA-Z0-9\_-) et expression régulière hexadécimale sur la couleur.

##### **Type color — Couleur**

```
<section style="background-color:{{slot:section_bg|type=color|default=#19052d|label=Couleur de fond}}">
```

- Interface : sélecteur de couleur HTML5, champ hexadécimal, bouton de retour à la valeur par défaut.
- <span style="white-space: pre-wrap;">Format strict : </span>`<span class="editor-theme-code">#RRGGBB</span>`<span style="white-space: pre-wrap;"> ou </span>`<span class="editor-theme-code">#RRGGBBAA</span>`<span style="white-space: pre-wrap;"> (avec transparence).</span>
- Non traduisible.

##### **Type number — Nombre**

```
<span class="stat">{{slot:stats_clients|type=number|default=42|label=Nombre de clients}}</span>
```

##### **Type bool — Booléen**

```
<?php if ('{{slot:hero_show_badge|type=bool|default=1|label=Afficher le badge}}'): ?>
    <span class="badge">Nouveau</span>
<?php endif; ?>
```

- Interface : case à cocher.
- Valeur : 0 ou 1.

##### **Type select — Liste déroulante**

```
<section class="hero hero-{{slot:hero_layout|type=select|options=light,dark,gradient|default=light|label=Style du hero}}">
```

- Interface : menu déroulant.
- <span style="white-space: pre-wrap;">Les valeurs disponibles sont définies dans </span>`<span class="editor-theme-code">options</span>`<span style="white-space: pre-wrap;"> (CSV obligatoire).</span>

### <span style="color: rgb(35, 111, 161);">Valeurs par défaut spéciales</span>

##### **default=@lang:KEY — Résolution via les fichiers de langue**

<span style="white-space: pre-wrap;">Lorsque votre site utilise déjà des fichiers </span>`<span class="editor-theme-code">.lang</span>`<span style="white-space: pre-wrap;"> Dolibarr (cas typique pour les sites multilingues existants), vous pouvez réutiliser les clés au lieu de les dupliquer dans les slots :</span>

```
<h1>{{slot:hero_title|type=text|default=@lang:HeroTitle|label=Titre du hero}}</h1>
```

<span style="white-space: pre-wrap;">Au moment du rendu, le module résout via </span>`<span class="editor-theme-code">$langs->trans('HeroTitle')</span>`<span style="white-space: pre-wrap;"> selon la langue du visiteur. Les fichiers </span>`<span class="editor-theme-code">.lang</span>`<span style="white-space: pre-wrap;"> du site présents dans </span>`<span class="editor-theme-code">DOL_DATA_ROOT/<entity>/website/<ref>/langs/</span>`<span style="white-space: pre-wrap;"> sont chargés automatiquement.</span>

<p class="callout info">**Cas d'usage —**<span style="white-space: pre-wrap;"> Migration progressive d'un site existant : vous conservez vos fichiers </span>`<span class="editor-theme-code">.lang</span>`<span style="white-space: pre-wrap;"> en l'état, vous ajoutez les slots, et le client peut soit éditer dans le Studio (surcharge), soit conserver la traduction du </span>`<span class="editor-theme-code">.lang</span>`<span style="white-space: pre-wrap;"> (canonique).</span></p>

### <span style="color: rgb(35, 111, 161);">Récapitulatif des types et de leur traduisibilité</span>

<table id="bkmrk-typeinterfacetraduis" style="width: 100%; border-collapse: collapse; margin: 1rem 0px; font-size: 0.95em;"><colgroup><col></col><col></col><col></col></colgroup><tbody><tr style="background: rgb(25, 5, 45); color: rgb(254, 252, 232);"><th class="align-left" style="padding: 0.6rem 1rem; text-align: left; border: 1px solid rgb(25, 5, 45);">Type

</th><th class="align-left" style="padding: 0.6rem 1rem; text-align: left; border: 1px solid rgb(25, 5, 45);">Interface

</th><th class="align-left" style="padding: 0.6rem 1rem; text-align: left; border: 1px solid rgb(25, 5, 45);">Traduisible

</th></tr><tr><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">`<span class="editor-theme-code">text</span>`

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Champ de saisie

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Oui

</td></tr><tr style="background: rgb(250, 245, 255);"><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">`<span class="editor-theme-code">textarea</span>`

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Zone de texte

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Oui

</td></tr><tr><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">`<span class="editor-theme-code">richtext</span>`

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">CKEditor

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Oui

</td></tr><tr style="background: rgb(250, 245, 255);"><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">`<span class="editor-theme-code">image</span>`

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Sélecteur de média

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Non

</td></tr><tr><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">`<span class="editor-theme-code">url</span>`

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Champ de saisie

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Non

</td></tr><tr style="background: rgb(250, 245, 255);"><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">`<span class="editor-theme-code">icon</span>`

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Classe et sélecteur de couleur

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Non

</td></tr><tr><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">`<span class="editor-theme-code">color</span>`

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Sélecteur de couleur

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Non

</td></tr><tr style="background: rgb(250, 245, 255);"><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">`<span class="editor-theme-code">number</span>`

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Champ numérique

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Oui (rare)

</td></tr><tr><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">`<span class="editor-theme-code">bool</span>`

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Case à cocher

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Non

</td></tr><tr style="background: rgb(250, 245, 255);"><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">`<span class="editor-theme-code">select</span>`

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Menu déroulant

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Non

</td></tr></tbody></table>

### <span style="color: rgb(35, 111, 161);">Pièges fréquents</span>

**Slots dans des attributs JSON intégrés —**<span style="white-space: pre-wrap;"> Si vous avez du JSON intégré dans une balise (par exemple </span>`<span class="editor-theme-code">data-config="{...}"</span>`), n'y placez pas de slot. Les doubles accolades sont aussi un délimiteur Mustache et risquent de casser les bibliothèques JavaScript qui parseraient ce JSON.

**Identifiant trop long —**<span style="white-space: pre-wrap;"> La limite est de 64 caractères. Au-delà, le scanner rejette silencieusement, ce que met en évidence l'option </span>`<span class="editor-theme-code">--lint</span>`.

**Espaces autour des = —**<span style="white-space: pre-wrap;"> Le scanner rejette </span>`<span class="editor-theme-code">type = text</span>`<span style="white-space: pre-wrap;">. Utilisez toujours </span>`<span class="editor-theme-code">type=text</span>`.

**Caractère pipe dans une valeur —**<span style="white-space: pre-wrap;"> </span>`<span class="editor-theme-code">default=A|B</span>`<span style="white-space: pre-wrap;"> casse l'analyseur. Utilisez une autre séparation, ou laissez </span>`<span class="editor-theme-code">default</span>`<span style="white-space: pre-wrap;"> vide et saisissez la valeur via le Studio.</span>

### <span style="color: rgb(35, 111, 161);">Récapitulatif</span>

**Vous savez désormais :**

- La syntaxe complète d'un token de slot.
- Les dix types disponibles et leurs interfaces respectives.
- <span style="white-space: pre-wrap;">La résolution </span>`<span class="editor-theme-code">@lang:KEY</span>`<span style="white-space: pre-wrap;"> pour réutiliser les fichiers .lang Dolibarr.</span>
- Quels types sont traduisibles ou non.
- Les pièges syntaxiques fréquents.

Le chapitre suivant aborde les shortcodes, qui injectent des données Dolibarr dans le HTML.