Form theme du design-system¶
Référence du thème de formulaire Twig de Kirexo : le fichier templates/form/kirexo_theme.html.twig, son enregistrement global, et le mapping exact des blocs de widgets Symfony vers les composants du design system. Ce thème permet à tout form_widget() de rendre un markup stylé DS sans coller de classe à la main sur chaque champ.
Rôle et principe¶
Sans thème de formulaire, les form_widget() retombent sur le thème Symfony par défaut (form_div_layout.html.twig) et produisent des <input> / <select> / <textarea> bruts, sans les classes du DS — donc non stylés. Le thème Kirexo résout ce problème globalement : tout formulaire rendu via les fonctions Twig (form_row, form_widget, form_errors…) reçoit automatiquement les classes du design system.
Le thème suit deux principes :
- Fusion, pas réécriture. Chaque bloc surchargé fusionne une classe DS dans
attr.classpuis délègue àparent(). Le<input>/<select>complet n'est jamais réécrit, ce qui rend le thème robuste aux montées de version de Symfony. - Aucune couleur. Le thème n'introduit ni hexadécimal ni
style="". Les couleurs proviennent exclusivement des classes DS, conformément à la contrainte couleur du projet.
Enregistrement global¶
Le thème est enregistré pour tous les formulaires de l'application via la clé form_themes dans config/packages/twig.yaml :
twig:
default_path: '%kernel.project_dir%/templates'
file_name_pattern: '*.twig'
form_themes:
- 'form/kirexo_theme.html.twig'
Le chemin est relatif à default_path (templates/), d'où 'form/kirexo_theme.html.twig' sans préfixe @. Le thème custom étant listé en dernier, il a la priorité la plus haute ; le layout par défaut reste le fallback implicite pour tous les blocs non surchargés.
Vérification que la configuration est bien prise en compte :
La section form_themes doit lister form/kirexo_theme.html.twig.
Mapping widget Symfony → classe DS¶
Le fichier templates/form/kirexo_theme.html.twig étend le layout par défaut via {% use 'form_div_layout.html.twig' %} et surcharge exactement sept blocs. Les classes DS citées sont définies dans assets/styles/kirexo-ds.css.
| Bloc Symfony | Couvre | Classe DS appliquée |
|---|---|---|
form_row |
conteneur d'un champ | .field (+ .error si le champ porte des erreurs) |
form_widget_simple |
text, email, password, url, number, search, tel… |
.input |
textarea_widget |
zone de texte multiligne | .textarea |
choice_widget_collapsed |
<select> déroulant |
.select |
form_help |
texte d'aide | .hint |
form_errors |
erreurs de champ / de formulaire | .msg (champ) ou .notice warn (formulaire) |
button_widget |
SubmitType / ButtonType |
.btn (base seule) |
Détails par bloc¶
-
form_rowenveloppe le champ dans un<div class="field">, lui ajoute la classeerrorquanderrors|length > 0, puis rend dans l'ordreform_label→form_widget→form_help→form_errors. La classe.field.erroractive la bordure rouge sur le widget et la coloration du message d'erreur. -
form_widget_simpleajoute.input. Les champshiddenpassent par le bloc distincthidden_widget(non surchargé) et ne reçoivent donc pas.input— comportement voulu. -
form_errorsrend deux markups différents selon le niveau :- erreur de champ (
form is not rootform) → une<span class="msg">par message ; la couleur rouge vient de.field.error .msg, l'étaterrorétant posé parform_row; - erreur globale du formulaire (
form is rootform) → un encadré<div class="notice warn" role="alert">avec sa<span class="bar">etrole="alert"pour l'accessibilité.
- erreur de champ (
-
button_widgetgarantit uniquement la classe de base.btn. La variante (btn-primary,btn-secondary,btn-ghost) reste de la responsabilité de l'appelant : voir la convention ci-dessous.
Blocs volontairement non surchargés¶
Le thème ne touche pas aux blocs suivants, qui conservent leur rendu Symfony par défaut :
| Bloc non surchargé | Raison |
|---|---|
checkbox_widget, radio_widget, choice_widget_expanded |
Le DS n'a pas de classe générique pour ces contrôles. Le picker d'accent (templates/admin/settings.html.twig) et le remember-me de /login rendent leurs radios/checkboxes via un markup enveloppant custom ; les styliser ici casserait ces écrans. Leur stylage relève des feuilles d'écran (screens.css), traité dans d'autres lots. |
form_label |
Le DS cible le label par descendance (.field label) ; le <label> par défaut suffit, aucune classe à ajouter. |
submit_widget |
Dans form_div_layout.html.twig il délègue déjà à button_widget. Le surcharger appliquerait .btn deux fois. |
Convention : variante de bouton explicite¶
Le thème pose uniquement .btn. La variante visuelle est toujours passée explicitement, jamais déduite par le thème :
- via l'option
attrdu champ bouton —attr: {class: 'btn-primary'}; - ou via un
<button class="btn btn-primary">écrit directement dans le template (cas dominant du projet).
Ce choix garde le thème neutre : un même SubmitType peut être rendu en primaire, secondaire ou ghost selon le contexte d'appel, sans logique de variante cachée dans le thème.
Garde-fous d'accessibilité hérités¶
Les classes appliquées par le thème portent déjà les garanties RGAA du DS, à ne pas redéfinir :
.input,.textarea,.selectont unemin-heightde 44px et un anneau de focus visible ;.btna unemin-heightde 44px.
Voir Design system : tokens, thèmes et accent pour le détail des contraintes.
Voir aussi¶
- Design system : tokens, thèmes et accent — variables CSS, thème clair/sombre, accent d'instance, contraintes RGAA.