Drupal Webform: Install, Source and Security | FunnelSlayer

Drupal Webform

Published by thomasroger76 in drupal-skills

No known issues3 installs

What this skill does

Use when building forms with Drupal Webform module - configuring form elements (text, select, checkboxes, date, file upload, address, composite), implementing conditional logic with #states, creating multi-step wizard forms, configuring email notification handlers, saving submissions to database, accessing Webform submissions programmatically (WebformSubmission entity), implementing Remote POST handlers for CRM/webhook integration, creating custom WebformHandler plugins, exporting submissions as

Add Drupal Webform to your agent

Review the source and files first. When you are ready, copy the prompt instruction or use the CLI command supported by your environment.

Install with a prompt

Paste this into a compatible coding agent:

add this skill "drupal-webform" from https://github.com/thomasroger76/drupal-skills

Install with the CLI

Run this command in a controlled environment after reviewing the repository:

npx skills add https://github.com/thomasroger76/drupal-skills --skill drupal-webform

Skill instructions

Drupal Webform — Référence Complète

Overview

Référentiel complet du module Webform Drupal 8-11+ : éléments de formulaire (50+ types), logique conditionnelle, formulaires multi-étapes, handlers (email, remote post, action), soumissions programmatiques, API REST, et handlers custom. Webform est le module de formulaires de référence pour Drupal.

🎯 La Règle Fondamentale

Webform avant Forms API. Si un formulaire est destiné aux éditeurs ou peut évoluer, utiliser Webform (configurable via UI). Réserver la Forms API pour les formulaires d'administration liés au code du module.


Convention Drush. Toutes les commandes drush de ce skill s'exécutent en Docker natif : docker compose exec php drush ... (jamais ddev). Les blocs drush php:eval multiligne sont écrits sans préfixe pour la lisibilité — les préfixer en pratique.

Quick Decision Table

BesoinOutilRéférence
Formulaire de contact simpleWebform UI — ajouter les élémentswebform-elements.md
Champ texte, email, téléphoneElements : textfield, email, telwebform-elements.md
Liste déroulante, radio, checkboxesElements : select, radios, checkboxeswebform-elements.md
Upload de fichier dans un formulaireElement : managed_file + configwebform-elements.md
Champ adresse complète (structure)Element : address (contrib) ou compositewebform-elements.md
Champ conditionnel (visible si X = Y)#states dans la config de l'élémentwebform-elements.md
Formulaire en plusieurs étapes (wizard)Webform → wizard → pageswebform-elements.md
Email de confirmation à l'utilisateurHandler Email → "To: [webform_submission:values:email]"webform-handlers.md
Email de notification à l'adminHandler Email → To: admin@site.comwebform-handlers.md
Envoyer les données à un CRM (POST)Handler Remote POST → JSONwebform-handlers.md
Webhook sur soumissionHandler Remote POSTwebform-handlers.md
Handler custom (logique métier)WebformHandlerBase pluginwebform-handlers.md
Enregistrer les soumissions en DBSettings → Store submissions : ✅webform-submissions.md
Lire une soumission depuis PHPWebformSubmission::load()webform-submissions.md
Créer une soumission programmatiquementWebformSubmission::create()webform-submissions.md
Exporter les soumissions en CSVResults → Download → CSVwebform-submissions.md
Afficher les résultats en tableResults → Results tablewebform-submissions.md
Accès au formulaire par rôleAccess → Create submissionswebform-access.md
Afficher le formulaire uniquement aux connectésAccess → Authenticated users onlywebform-access.md
Limiter une soumission par utilisateurSettings → Limit → 1 par utilisateurwebform-access.md
Consentement RGPD (checkbox obligatoire)Element : checkbox + requiredwebform-elements.md
Pré-remplir depuis l'URL (?name=Jean)Default value → token ou querywebform-elements.md
Endpoint REST pour soumettre via APIWebform REST → POST endpointwebform-api.md
Tester les emails sans les envoyerWebform → Settings → Test modewebform-handlers.md
Visualiser les formulaires soumisResults → Submissionswebform-submissions.md
Anti-spam : Honeypot (invisible)Module honeypot + Webform settings → Spam protectionwebform-access.md
Anti-spam : CAPTCHA invisibleModule recaptcha (v2 invisible ou v3) + Webform elementwebform-access.md
Anti-spam : taux de soumission (rate limiting)Module webform_spam_control ou flood corewebform-access.md
Élément calculé (valeur dépend d'autres champs)Webform element computed_twig — {{ data.prenom }} {{ data.nom }}webform-elements.md
Afficher les soumissions Webform dans une Viewdrupal/webform_views — expose les soumissions comme source Viewswebform-submissions.md
Modifier le comportement du formulaire selon l'URL[current-page:query:source] token + default value conditionnelwebform-elements.md
Envoyer un PDF de confirmationHandler Email + pièce jointe générée avec drupal/webform_entity_printwebform-handlers.md
Formulaire attaché à un nœud (1 form par article)Webform field sur le Content Type → une instance par nœudwebform-api.md
Handler conditionnel (envoyer email seulement si type=X)Webform Handler → Conditions tab → data[type] = 'pro'webform-handlers.md
Déboguer une validation échouéedrush webform:submission:export WEBFORM_ID --format=table + vérifier les errorswebform-submissions.md
Webform accessible (WCAG 2.1 AA)Labels explicites, aria-describedby sur les descriptions, gestion du focus en multi-stepwebform-elements.md

Anti-Patterns Critiques

❌ À ne jamais faire✅ Bonne pratiqueImpact
Formulaire de contact codé en Forms APIWebform module — configurable sans déploiementLes éditeurs ne peuvent pas modifier un formulaire codé
Stocker des données sensibles sans chiffrementChamp Webform avec #access: false pour les admins + chiffrement DBData breach
Email handler sans test préalableWebform → Settings → Test mode → envoyer un testEmails de confirmation cassés en production
Remote POST sans vérification de la réponseVérifier le status code HTTP dans le handlerSoumissions perdues silencieusement
Validation custom en JavaScript uniquementToujours valider côté serveur (validator element)Bypassable
Webform avec store: false pour des données critiquesToujours stocker + configurer la rétentionPas de récupération en cas de crash email
Pré-remplissage depuis $_GET sans sanitisationUtiliser les tokens Webform sécurisésXSS via URL query
CAPTCHA absent sur un formulaire publicModule webform_spam_control ou HoneypotSpam massif

Évolution par Version Majeure

FeatureD8D9D10D11
Webform modulecontribcontribcontribcontrib
Wizard (multi-step)✅✅✅✅
Remote POST handler✅✅✅✅
Webform REST API✅✅✅✅
YAML import/export✅✅✅✅
Computed elements✅✅✅✅
Custom handlers✅✅✅✅
Plugins via attribut PHP #[WebformHandler] / #[WebformElement]❌❌6.2+✅
Annotation @WebformHandler (Doctrine)✅✅dépréciéedépréciée

Auto-Amélioration

See Also

  • drupal-core — Forms API (quand Webform ne suffit pas), services DI
  • drupal-security — Validation XSS, fichiers uploadés, CSRF protection
  • drupal-migration — Migrer des soumissions Webform
  • drupal-api — REST endpoint Webform pour les applications headless
  • drupal-content-modeling — Webform attaché à un Content Type (node)
  • drupal-config — Export/import config Webform (YAML)

Files included

  • CHANGELOG.md
  • lessons.md
  • SKILL.md
  • webform-access.md
  • webform-api.md
  • webform-elements.md
  • webform-handlers.md
  • webform-submissions.md

More skills