# CHAPITRE 24 — Les formulaires publics

InfraSStudio embarque un moteur de formulaires publics conçu pour transformer la moindre saisie web en lead qualifié dans Dolibarr. Un formulaire de contact rempli sur un site géré par le module ne déclenche pas un simple envoi d'email : il alimente automatiquement le CRM, ouvre un ticket, prévient les équipes commerciales et déclenche, au besoin, un rappel en agenda. Ce chapitre détaille la mécanique interne, la configuration côté administrateur et l'intégration dans un site Dolibarr Website.

### <span style="color: rgb(35, 111, 161);">Architecture du moteur</span>

L'architecture repose sur trois pièces : un descripteur JSON par formulaire, un point d'entrée unique côté serveur, et une chaîne d'adapters exécutés à chaque soumission. Aucun code PHP n'est nécessaire pour ajouter ou modifier un formulaire : il suffit d'éditer le descripteur depuis l'interface d'administration.

<table id="bkmrk-pi%C3%A8cer%C3%B4leendpoint-un" 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);">Pièce

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

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

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">`<span class="editor-theme-code">public/forms/submit.php</span>`<span style="white-space: pre-wrap;"> reçoit toutes les soumissions. Le formulaire est identifié par son nom inséré en champ caché </span>`<span class="editor-theme-code">form_name</span>`.

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

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);"><span style="white-space: pre-wrap;">Une ligne dans </span>`<span class="editor-theme-code">llx_infrasstudio_form_config</span>`<span style="white-space: pre-wrap;"> par formulaire. Décrit les champs, les règles de validation, les paramètres anti-spam et les adapters à exécuter.</span>

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

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Six étapes activables à la carte : validation, anti-spam, tiers, contact, ticket, notification, agenda.

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

##### **Le pipeline étape par étape**

Chaque soumission acceptée traverse la chaîne ci-dessous. Chaque étape s'active indépendamment dans le descripteur, ce qui permet de couvrir aussi bien un formulaire de newsletter minimaliste qu'une demande de démonstration commerciale complète.

<table id="bkmrk-adaptereffet-sur-la-" 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);">Adapter

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

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

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Honeypot, délai minimum de remplissage, rate-limit par adresse IP, captcha délégué au gestionnaire Dolibarr actif.

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

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);"><span style="white-space: pre-wrap;">Recherche ou création d'une société dans </span>`<span class="editor-theme-code">llx_societe</span>`. Application d'une catégorie et d'une origine.

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

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);"><span style="white-space: pre-wrap;">Recherche ou création d'un contact dans </span>`<span class="editor-theme-code">llx_socpeople</span>`, libre ou rattaché au tiers.

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

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Ouverture d'un ticket Dolibarr avec sujet, message, catégorie et sévérité.

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

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Envoi d'un email interne à l'équipe commerciale et d'un accusé de réception au visiteur.

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

</td><td style="padding: 0.5rem 1rem; border: 1px solid rgb(229, 231, 235);">Création d'un événement de rappel lié au tiers et au ticket.

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

### <span style="color: rgb(35, 111, 161);">Configurer un formulaire</span>

<span style="white-space: pre-wrap;">L'administration des formulaires se trouve dans </span>**Outils → InfraS → Formulaires**. La page liste les configurations existantes, affiche quelques statistiques de soumission et offre un bouton pour créer un nouveau formulaire.

##### **L'identité du formulaire**

À la création, trois informations sont demandées :

- <span style="white-space: pre-wrap;">un </span>**nom interne**<span style="white-space: pre-wrap;"> (utilisé dans le HTML, unique par entité) ;</span>
- <span style="white-space: pre-wrap;">un </span>**type**<span style="white-space: pre-wrap;"> (</span>**contact**<span style="white-space: pre-wrap;">, </span>**newsletter**<span style="white-space: pre-wrap;">, </span>**demo**<span style="white-space: pre-wrap;"> ou personnalisé) ;</span>
- <span style="white-space: pre-wrap;">un </span>**libellé d'affichage**<span style="white-space: pre-wrap;"> pour l'interface d'administration.</span>

Le nom interne sert d'identifiant tout au long du cycle de vie du formulaire : il est référencé dans le HTML, dans le viewer de soumissions et dans les logs.

##### **Le descripteur JSON**

Le cœur de la configuration est un descripteur JSON qui décrit le formulaire sous une forme structurée. L'éditeur d'administration valide la syntaxe à l'enregistrement et propose une référence dépliable de toutes les clés supportées pour éviter d'avoir à mémoriser la grammaire.

```
{
    "antispam": { "honeypot": true, "min_fill_seconds": 3, "rate_limit_per_hour": 5, "captcha": true },
    "consent":  { "required": true, "field_name": "consent", "text": "..." },
    "fields":   {
        "name":    { "required": true, "type": "text",  "maxlength": 100 },
        "email":   { "required": true, "type": "email", "maxlength": 200 },
        "message": { "required": true, "type": "text",  "maxlength": 5000 }
    },
    "tiers":        { "enabled": true,  "lookup_by_email": true, "category_label": "Lead web" },
    "ticket":       { "enabled": true,  "category_code":   "COMMERCIAL" },
    "notification": { "autoreply_enabled": true, "autoreply_template_label": "Accusé de réception" }
}
```

### <span style="color: rgb(35, 111, 161);">Connecter le formulaire à votre CRM</span>

L'intérêt principal du moteur réside dans la chaîne de traitement qu'il déclenche au moment de la soumission. Chaque adapter peut être activé indépendamment selon les besoins.

##### **Tiers et contact**

<span style="white-space: pre-wrap;">Lorsque l'adapter tiers est actif, le moteur recherche d'abord une société existante dont l'adresse email correspond à celle saisie ; à défaut, il regarde si l'email appartient à un contact rattaché à une société, puis tente une correspondance par nom d'entreprise. Si aucune correspondance n'est trouvée, un nouveau tiers est créé, catégorisé automatiquement et associé à un canal d'origine (extrafield </span>`<span class="editor-theme-code">origine</span>`<span style="white-space: pre-wrap;"> renseigné depuis le dictionnaire </span>`<span class="editor-theme-code">c_input_reason</span>`). La même logique existe pour les contacts, utile notamment pour les inscriptions à la newsletter qui ne nécessitent pas la création d'une société.

##### **Ouverture d'un ticket**

L'adapter ticket ouvre un ticket Dolibarr rattaché au tiers résolu. Le sujet et le message sont construits soit à partir des champs du formulaire, soit à partir de gabarits permettant d'injecter dynamiquement le nom du visiteur, sa demande, l'adresse IP d'origine ou tout autre élément du contexte. Catégorie et sévérité sont déterminées par les codes du dictionnaire Dolibarr (`<span class="editor-theme-code">llx_c_ticket_category</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">llx_c_ticket_severity</span>`).

##### **Notification et accusé de réception**

<span style="white-space: pre-wrap;">Deux emails peuvent être envoyés automatiquement à la suite d'une soumission : une notification interne adressée à l'équipe commerciale, et un accusé de réception destiné au visiteur. L'accusé de réception peut s'appuyer sur un modèle d'email Dolibarr standard stocké dans </span>`<span class="editor-theme-code">llx_c_email_templates</span>`, ce qui permet de centraliser la rédaction et d'utiliser la même charte pour tous les formulaires d'un site.

##### **Rappel automatique en agenda**

Pour les formulaires à fort enjeu commercial (typiquement une demande de démonstration), un événement de rappel peut être créé dans l'agenda. Le délai est configurable, les week-ends peuvent être évités automatiquement, et l'événement est lié au ticket et au tiers pour garantir la traçabilité.

### <span style="color: rgb(35, 111, 161);">Intégrer le formulaire dans un site</span>

Une fois la configuration en place, il reste à exposer le formulaire dans le site. Plusieurs approches sont possibles selon le degré de personnalisation souhaité.

##### **L'helper de rendu unifié**

La voie recommandée pour un nouveau site consiste à utiliser le helper de rendu : une seule ligne PHP suffit à afficher un formulaire entièrement opérationnel. L'helper charge la configuration, choisit automatiquement le template correspondant au type de formulaire et insère toutes les protections anti-spam.

```
dol_include_once('/infrasstudio/core/lib/infrasstudio.lib.php');
infrasstudio_render_public_form('keaticweb-contact', array(
    'fk_website' => $website->id,
    'fk_page'    => $object->id,
));
```

##### **Les templates livrés clé en main**

<span style="white-space: pre-wrap;">Trois templates HTML accessibles sont fournis dans </span>`<span class="editor-theme-code">templates/forms/</span>`<span style="white-space: pre-wrap;"> : </span>**contact**<span style="white-space: pre-wrap;">, </span>**newsletter**<span style="white-space: pre-wrap;"> et </span>**demande de démonstration**. Ils respectent les bonnes pratiques d'accessibilité (`<span class="editor-theme-code">autocomplete</span>`<span style="white-space: pre-wrap;">, </span>`<span class="editor-theme-code">aria-label</span>`, libellés visibles), intègrent le marquage anti-spam et affichent automatiquement le bandeau de succès ou d'erreur après une soumission.

##### **Conserver un design existant**

<span style="white-space: pre-wrap;">Lorsque le design du site impose une intégration sur mesure, vous pouvez conserver votre propre HTML et l'enrichir des champs cachés nécessaires (nom du formulaire, jeton anti-spam, captcha conditionnel) grâce au helper </span>`<span class="editor-theme-code">infrasstudio_render_form_security()</span>`. Cette approche est privilégiée sur les sites existants pour ne pas casser la charte graphique en place.

### <span style="color: rgb(35, 111, 161);">Suivre et auditer les soumissions</span>

<span style="white-space: pre-wrap;">Chaque soumission acceptée est persistée dans </span>`<span class="editor-theme-code">llx_infrasstudio_form_submission</span>`<span style="white-space: pre-wrap;"> avec son contenu sanitisé, l'adresse IP d'origine, l'agent utilisateur, la page de provenance et la trace du consentement RGPD. Le viewer d'administration (</span>**Outils → InfraS → Soumissions**) permet de filtrer par formulaire, statut ou plage de dates, d'ouvrir le détail complet d'une soumission et d'accéder en un clic au tiers, au contact, au ticket et à l'événement d'agenda qui en ont découlé. Cette traçabilité complète est précieuse à la fois pour le suivi commercial et pour répondre aux demandes RGPD des visiteurs.

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

<span style="white-space: pre-wrap;">Le moteur de formulaires d'InfraSStudio transforme un simple formulaire web en véritable point d'entrée du CRM. Configurable sans code, sécurisé par défaut et entièrement intégré à l'écosystème Dolibarr, il évite la fragmentation des outils tout en gardant la souplesse nécessaire à chaque projet. Pour aller plus loin, voir le Chapitre 28 (constantes), le Chapitre 31 (modèle SQL des trois tables </span>`<span class="editor-theme-code">llx_infrasstudio_form_*</span>`) et l'Annexe B (FAQ) pour les questions opérationnelles courantes.