PS PrestaShop Débutant

Constructeur de formulaires pour PrestaShop 8 et 9 : documentation

Installer le module, construire un formulaire, régler la logique, les étapes, les emails et le webhook, puis gérer et exporter les réponses.

Mis à jour Version du module 1.2.2

DataFirefly Form Builder ajoute à PrestaShop 8 et 9 un constructeur de formulaires en glisser-déposer. Chaque formulaire s’affiche sur les emplacements du thème, dans une page CMS, dans une fenêtre modale ou sur sa propre page. Les réponses sont enregistrées en back-office, envoyées par email et exportables en CSV.

Installation

  1. Dans Modules > Gestionnaire de modules, cliquez sur Installer un module et déposez le fichier dfformbuilder.zip.
  2. Deux menus apparaissent sous Service client : Formulaires et Réponses aux formulaires.
  3. Le bouton Configurer du module ouvre les réglages généraux (voir plus bas) et affiche le nombre de formulaires et de réponses non lues.

Prérequis : PrestaShop 8.0.0 à 9.x, PHP 7.2 ou plus. Les fichiers envoyés par les visiteurs sont stockés dans /upload/dfformbuilder/, qui doit être accessible en écriture. Le module n’utilise aucun override.

Mise à jour : installez le nouveau ZIP par-dessus l’ancien. Les formulaires et les réponses sont conservés, et les scripts de mise à jour ajoutent les nouvelles tables.

Créer un formulaire

Dans Service client > Formulaires, cliquez sur Nouveau formulaire et choisissez un point de départ :

  • Formulaire de contact : nom, email, objet et message. Le champ Référence de commande n’apparaît que si l’objet concerne une commande.
  • Demande de devis : particulier ou entreprise (les champs Société et TVA n’apparaissent que pour une entreprise), quantité, budget, délai, pièces jointes. Sur une fiche produit, le nom du produit se remplit seul.
  • Candidature : trois étapes (coordonnées, poste, documents), CV obligatoire et joint à l’email.
  • Formulaire vierge.

La liste des formulaires propose aussi Dupliquer, Exporter (fichier JSON) et, dans la barre d’outils, Importer. Un formulaire importé est créé désactivé et sans emplacement d’affichage.

Le constructeur

La barre du haut contient le nom interne du formulaire, la case Activé, la langue d’édition, les boutons Annuler et Rétablir, Aperçu et Enregistrer. En dessous, quatre onglets : Champs, Paramètres, Emails, Affichage et intégration.

Onglet Champs

  • Colonne de gauche : les types de champs. Un clic ajoute le champ sous le champ sélectionné, un glisser le dépose à l’endroit voulu.
  • Centre : le formulaire tel qu’il sera affiché, avec les largeurs réelles. Les champs se déplacent par glisser-déposer ou avec les flèches de chaque carte, se dupliquent et se suppriment.
  • Colonne de droite : les réglages du champ sélectionné.

Raccourcis : Entrée sélectionne un champ, Alt + flèches le déplace, Suppr le supprime, Ctrl+Z annule, Ctrl+Y rétablit, Ctrl+S enregistre. Le navigateur prévient si vous quittez la page avec des modifications non enregistrées.

Langues

Tous les textes (libellés, aides, options, messages, emails, URL) se saisissent dans la langue choisie en haut. Un texte laissé vide reprend celui de la langue par défaut de la boutique, affiché en gris dans le champ. Pensez à passer sur chaque langue avant de publier.

Clé du champ

Chaque champ de saisie a une clé technique, générée depuis le libellé (par exemple email, order_reference). Elle sert de nom de colonne dans l’export CSV et de variable dans les emails : {email}. Elle doit être unique dans le formulaire.

Types de champs

  • Texte, Email, Téléphone, URL : texte indicatif, longueur maximale, préremplissage. Une adresse web saisie sans https:// est complétée automatiquement.
  • Nombre : minimum, maximum et pas.
  • Texte long : hauteur en lignes, longueur maximale avec compteur de caractères côté visiteur.
  • Date : date la plus tôt et la plus tard, au format AAAA-MM-JJ ou avec le mot today.
  • Liste déroulante, Boutons radio, Cases à cocher : options avec libellé par langue et valeur. La valeur est enregistrée et utilisée par la logique ; laissée vide, elle reprend le libellé. Le lien Ajouter plusieurs options d’un coup accepte une option par ligne, au format libellé|valeur si besoin.
  • Consentement : une case à cocher avec un texte qui accepte les liens (politique de confidentialité).
  • Note en étoiles : de 3 à 10 étoiles, enregistrée sous la forme 4/5.
  • Envoi de fichier : extensions autorisées, taille maximale par fichier (plafonnée par le réglage global), plusieurs fichiers jusqu’à 10.
  • Champ caché : valeur fixe ou préremplie, invisible pour le visiteur.
  • Titre, Bloc de texte, Séparateur : mise en page, rien n’est enregistré.
  • Nouvelle étape : coupe le formulaire en étapes (voir plus bas).

Chaque champ a une largeur : pleine, deux tiers, moitié ou un tiers. Les champs moins larges se placent côte à côte sur écran large et s’empilent sur mobile.

Préremplissage

Les champs Texte, Email, Téléphone et Caché peuvent se remplir avec l’email, le prénom, le nom, le nom complet ou la société du client connecté, le nom ou la référence du produit (sur une fiche produit), l’URL de la page, ou un paramètre d’URL. Exemple : un champ caché préremplit le paramètre utm_source, et un lien /contact?utm_source=newsletter enregistre newsletter avec la réponse.

Adresse de réponse

Cochez Utiliser comme adresse de réponse sur un champ Email : répondre à l’email de notification écrira directement au visiteur.

Logique conditionnelle

Dans le panneau d’un champ, cochez Afficher ou masquer ce champ selon d’autres réponses, puis choisissez :

  • Afficher ou Masquer ce champ ;
  • si toutes ou au moins une des conditions sont remplies ;
  • chaque condition : un champ, un opérateur (est, n’est pas, contient, ne contient pas, est vide, est rempli, est supérieur à, est inférieur à) et une valeur.

Pour une liste, des boutons radio ou des cases, la valeur se choisit parmi les options. Un champ masqué n’est ni contrôlé, ni enregistré, ni envoyé. La même logique est recalculée sur le serveur à l’envoi.

Formulaires en plusieurs étapes

Ajoutez un élément Nouvelle étape (groupe Mise en page) là où une étape doit commencer, et donnez-lui un titre. Les champs placés avant le premier repère forment la première étape. Côté visiteur :

  • une barre de progression et le titre des étapes s’affichent (désactivable dans Paramètres > Formulaire en plusieurs étapes) ;
  • les boutons Suivant et Précédent ont un texte réglable par langue ;
  • chaque étape est vérifiée avant de passer à la suivante ;
  • une étape dont tous les champs sont masqués par la logique est sautée.

Onglet Paramètres

  • Titre et introduction : titre affiché aux visiteurs et texte d’introduction.
  • Envoi : texte du bouton, message de confirmation, ou redirection vers une URL après l’envoi.
  • Accès : formulaire réservé aux clients connectés (les autres voient un lien vers la connexion), classe CSS.
  • Disponibilité et limites : date d’ouverture et de fermeture (fuseau horaire de la boutique), nombre maximum de réponses, une seule réponse par personne (contrôlée sur le compte client et sur l’email saisi), message de fermeture.
  • Brouillon : garde les réponses 30 jours dans le navigateur du visiteur jusqu’à l’envoi. Rien n’est transmis à la boutique avant l’envoi, et les fichiers ne sont pas conservés.

Onglet Emails

Notification à la boutique

Envoyée dans la langue par défaut de la boutique. Destinataires séparés par des virgules ; si le champ est vide, les destinataires par défaut de la configuration du module sont utilisés, puis l’email de la boutique. L’objet accepte les variables {form_name} et {clé_du_champ}, cliquables pour les copier. L’option Joindre les fichiers envoyés ajoute les fichiers jusqu’à 15 Mo au total.

Destinataires conditionnels

Chaque règle associe une condition à des adresses : par exemple, si Objet est Devis, envoyer à commercial@votre-boutique.com. Le réglage Quand une condition est remplie ajoute ces adresses aux destinataires ou les remplace.

Confirmation au visiteur

Nécessite un champ Email dans le formulaire. L’email part dans la langue utilisée par le visiteur, avec l’objet et le message de votre choix (variables acceptées) et, en option, le récapitulatif des réponses.

Webhook

Renseignez une URL (Zapier, Make, n8n, CRM) pour recevoir chaque réponse en JSON par une requête POST. Exemple de contenu :

{
  "event": "submission.created",
  "form": { "id": 3, "name": "Contact" },
  "submission": { "id": 128, "date": "2026-09-30T10:12:00+02:00", "language": "fr",
    "shop_id": 1, "customer_id": 0, "product_id": 0, "page_url": "https://..." },
  "fields": {
    "email": { "label": "Email", "type": "email", "value": "jean@exemple.fr", "display": "jean@exemple.fr" }
  }
}

Avec un secret de signature, l’en-tête X-DFFB-Signature contient sha256= suivi du HMAC-SHA256 du corps. Vérification en PHP :

$body = file_get_contents('php://input');
$expected = 'sha256=' . hash_hmac('sha256', $body, 'VOTRE_SECRET');
$valid = hash_equals($expected, $_SERVER['HTTP_X_DFFB_SIGNATURE'] ?? '');

L’appel attend 5 secondes au maximum. Son résultat (livré, refusé avec le code HTTP, pas de réponse) s’affiche sur la fiche de chaque réponse.

Onglet Affichage et intégration

Mode d’affichage

Directement dans la page ou derrière un bouton, dans une fenêtre modale, avec le texte du bouton par langue. Ce mode s’applique aux emplacements, au shortcode et au widget.

Emplacements automatiques

Cochez les emplacements du thème : page d’accueil (displayHome), page contact (displayContactContent, displayContactRightColumn), fiche produit (displayProductAdditionalInfo, displayFooterProduct), réassurance (displayReassurance), panier (displayShoppingCartFooter), pages CMS (displayCMSDisputeInformation), colonnes (displayLeftColumn, displayRightColumn), au-dessus du pied de page (displayFooterBefore), bas du contenu (displayWrapperBottom). Un emplacement n’affiche rien si le thème ne l’appelle pas.

Page dédiée

Chaque formulaire peut avoir sa page, par exemple /forms/3-demande-de-devis, avec une URL simplifiée par langue. Le lien Aperçu fonctionne même quand le formulaire est désactivé ; les envois y sont refusés tant qu’il n’est pas activé.

Codes d’intégration

  • Shortcode pour page CMS : [dfform id=3]
  • Widget Smarty dans un template : {widget name='dfformbuilder' id_form=3}
  • Hook personnalisé : {hook h='displayDfForm' id_form=3}

Statistiques

Sur 30 jours : vues (formulaire affiché ou fenêtre ouverte), débuts de saisie (clic dans un champ), réponses, taux de conversion et d’abandon. Les visiteurs sans JavaScript et la plupart des robots ne sont pas comptés. Les vues et le taux de conversion apparaissent aussi dans la liste des formulaires.

Gérer les réponses

Service client > Réponses aux formulaires liste les réponses avec le formulaire, un résumé, le statut et la date, filtrables. Actions groupées : marquer comme lu, traité, archiver, exporter en CSV, supprimer (les fichiers sont supprimés aussi).

La fiche d’une réponse l’ouvre en statut Lu et montre :

  • toutes les réponses et les fichiers à télécharger ;
  • le statut et une note interne ;
  • le client (s’il était connecté), le produit, la page d’envoi, la langue, l’adresse IP, le résultat de l’email et du webhook ;
  • les boutons Imprimer, Répondre par email, réponse précédente et suivante.

Répondre au visiteur

Le panneau Répondre au visiteur envoie votre message à l’adresse du champ Email (celui marqué comme adresse de réponse en priorité), dans la langue utilisée par le visiteur, avec la mise en page email de la boutique. La réponse est conservée dans l’historique et la réponse peut passer en Traité au même moment.

Export CSV

Le panneau sous la liste exporte par formulaire, statut et période. Choisir un formulaire donne une colonne par champ. Le fichier est en UTF-8 avec séparateur point-virgule, et s’ouvre directement dans Excel, LibreOffice et Google Sheets.

Réglages généraux du module

  • Destinataires par défaut : utilisés quand un formulaire n’a pas de destinataire.
  • Taille maximale des fichiers (10 Mo par défaut) : limite globale par fichier. Elle ne peut pas dépasser upload_max_filesize et post_max_size de PHP.
  • Conserver les réponses pendant (jours) : au-delà, les réponses et leurs fichiers sont supprimés automatiquement. 0 conserve sans limite.
  • Enregistrer l’adresse IP : si désactivé, seule une version hachée est gardée pour la limite d’envois.
  • Temps de saisie minimum (3 secondes) et envois par heure et par visiteur (10) : protections anti-robots.
  • reCAPTCHA v3 : clé de site, clé secrète et score minimum (0,5 recommandé). Le script Google ne se charge que lorsque le visiteur commence à remplir le formulaire.

Sécurité et RGPD

  • Chaque formulaire contient un champ piège invisible et une signature horodatée ; un envoi trop rapide ou répété au-delà de la limite est refusé.
  • Les scripts, pages HTML et exécutables sont toujours refusés et le contenu des fichiers est contrôlé. Les fichiers sont renommés aléatoirement dans un dossier protégé et ne se téléchargent que depuis le back-office.
  • Avec le module officiel psgdpr, les réponses d’un client (compte ou email saisi) sont incluses dans l’export de ses données et supprimées avec son compte.

Traductions

L’interface du module est disponible en français et en anglais ; les autres langues du back-office l’affichent en anglais. Les modèles d’email du module existent en anglais, français, allemand, espagnol, italien, néerlandais, polonais et portugais. Les textes des formulaires eux-mêmes se saisissent dans toutes les langues de la boutique.

Dépannage

Le formulaire n’apparaît pas

Vérifiez que le formulaire est activé, que l’emplacement choisi est appelé par votre thème, et que les dates d’ouverture ne le ferment pas. En cas de doute, testez le shortcode dans une page CMS ou la page dédiée.

Les emails n’arrivent pas

La fiche de la réponse indique si la notification est partie. Vérifiez Paramètres avancés > E-mail et envoyez un email de test depuis PrestaShop.

Un fichier est refusé

Contrôlez l’extension autorisée sur le champ, la taille maximale du champ et du module, et les limites PHP upload_max_filesize et post_max_size.

Le formulaire est bloqué par la protection anti-spam

Une page restée ouverte plusieurs semaines a une signature expirée : le visiteur doit recharger la page. Si vous utilisez reCAPTCHA, vérifiez que le domaine est déclaré dans la console Google et baissez le score minimum si des clients réels sont bloqués.

Cette page vous a-t-elle été utile ?

Toujours bloqué ? Contactez le support