# Formulierbouwer voor PrestaShop 8 en 9: documentatie

> DataFirefly Form Builder voegt aan PrestaShop 8 en 9 een formulierbouwer met drag & drop toe. Elk formulier verschijnt op themaposities, op een CMS-pagina, in een pop-upvenster of op een…

- Pagina: <https://www.datafirefly.com/nl/documentation/prestashop-form-builder/>
- Taal: nl
- Bijgewerkt op: 2026-09-30
- Andere talen: [fr](https://www.datafirefly.com/documentation/prestashop-form-builder/index.md), [en](https://www.datafirefly.com/en/documentation/prestashop-form-builder/index.md), [es](https://www.datafirefly.com/es/documentation/prestashop-form-builder/index.md), [de](https://www.datafirefly.com/de/documentation/prestashop-form-builder/index.md), [it](https://www.datafirefly.com/it/documentation/prestashop-form-builder/index.md), [pl](https://www.datafirefly.com/pl/documentation/prestashop-form-builder/index.md), [pt](https://www.datafirefly.com/pt/documentation/prestashop-form-builder/index.md)
- Index: <https://www.datafirefly.com/nl/documentation/llms.txt>

DataFirefly Form Builder voegt aan PrestaShop 8 en 9 een formulierbouwer met drag & drop toe. Elk formulier verschijnt op themaposities, op een CMS-pagina, in een pop-upvenster of op een eigen pagina. Inzendingen worden in de back-office bewaard, per e-mail verstuurd en zijn als CSV te exporteren.

## Installatie

1. Klik in **Modules > Modulebeheer** op **Een module uploaden** en sleep het bestand `dfformbuilder.zip` erin.
2. Onder **Klantenservice** verschijnen twee menu's: **Formulieren** en **Formulierinzendingen**.
3. De knop **Configureren** van de module opent de algemene instellingen (zie verderop) en toont het aantal formulieren en ongelezen inzendingen.

Vereisten: PrestaShop 8.0.0 tot 9.x, PHP 7.2 of hoger. Bestanden die bezoekers versturen, staan in `/upload/dfformbuilder/`, dat beschrijfbaar moet zijn. De module gebruikt geen override.

Bijwerken: installeer het nieuwe ZIP-bestand over het oude. Formulieren en inzendingen blijven bewaard, de updatescripts voegen nieuwe tabellen toe.

## Een formulier maken

Klik in **Klantenservice > Formulieren** op **Nieuw formulier** en kies een startpunt:

- **Contactformulier**: naam, e-mail, onderwerp en bericht. Het veld Bestelreferentie verschijnt alleen als het onderwerp over een bestelling gaat.
- **Offerteaanvraag**: particulier of bedrijf (de velden Bedrijf en btw-nummer verschijnen alleen voor een bedrijf), aantal, budget, termijn, bijlagen. Op een productpagina wordt de productnaam automatisch ingevuld.
- **Sollicitatie**: drie stappen (contactgegevens, functie, documenten), verplicht cv dat bij de e-mail wordt gevoegd.
- **Leeg formulier**.

De lijst met formulieren biedt ook **Dupliceren**, **Exporteren** (JSON-bestand) en in de werkbalk **Importeren**. Een geïmporteerd formulier wordt uitgeschakeld en zonder weergavepositie aangemaakt.

## De bouwer

De bovenste balk bevat de interne naam van het formulier, het vakje **Ingeschakeld**, de **bewerkingstaal**, de knoppen Ongedaan maken en Opnieuw, **Voorbeeld** en **Opslaan**. Daaronder staan vier tabbladen: Velden, Instellingen, E-mails, Weergave en integratie.

### Tabblad Velden

- **Linkerkolom**: de veldtypes. Een klik voegt het veld toe onder het geselecteerde, slepen zet het waar u wilt.
- **Midden**: het formulier zoals het wordt getoond, met de echte breedtes. Velden verplaatst u met drag & drop of met de pijlen op elke kaart, en u kunt ze dupliceren of verwijderen.
- **Rechterkolom**: de instellingen van het geselecteerde veld.

Sneltoetsen: Enter selecteert een veld, Alt + pijltjes verplaatst het, Delete verwijdert het, Ctrl+Z maakt ongedaan, Ctrl+Y doet opnieuw, Ctrl+S slaat op. De browser waarschuwt als u de pagina verlaat met niet-opgeslagen wijzigingen.

### Talen

Alle teksten (labels, helpteksten, opties, meldingen, e-mails, URL) vult u in voor de taal die bovenaan is gekozen. Een lege tekst neemt die van de standaardtaal van de winkel over, grijs weergegeven in het veld. Loop voor het publiceren elke taal na.

### Veldsleutel

Elk invoerveld heeft een technische sleutel die uit het label wordt afgeleid (bijvoorbeeld `email`, `order_reference`). Het is de kolomnaam in de CSV-export en een variabele in e-mails: `{email}`. Hij moet uniek zijn binnen het formulier.

## Veldtypes

- **Tekst, E-mail, Telefoon, Website**: voorbeeldtekst, maximale lengte, vooraf invullen. Een webadres zonder `https://` wordt automatisch aangevuld.
- **Getal**: minimum, maximum en stap.
- **Lange tekst**: hoogte in regels, maximale lengte met tekenteller voor de bezoeker.
- **Datum**: vroegste en laatste datum, als JJJJ-MM-DD of met het woord `today`.
- **Keuzelijst, Keuzerondjes, Selectievakjes**: opties met een label per taal en een waarde. De waarde wordt opgeslagen en door de logica gebruikt; leeg neemt ze het label over. De link **Meerdere opties tegelijk toevoegen** accepteert één optie per regel, zo nodig als `label|waarde`.
- **Toestemming**: een selectievakje met een tekst waarin links mogen (privacybeleid).
- **Sterrenbeoordeling**: 3 tot 10 sterren, opgeslagen als 4/5.
- **Bestandsupload**: toegestane extensies, maximale grootte per bestand (begrensd door de algemene instelling), meerdere bestanden tot 10.
- **Verborgen veld**: vaste of vooraf ingevulde waarde, onzichtbaar voor de bezoeker.
- **Kop, Tekstblok, Scheidingslijn**: alleen opmaak, er wordt niets opgeslagen.
- **Nieuwe stap**: deelt het formulier op in stappen (zie verderop).

Elk veld heeft een **breedte**: volledig, twee derde, half of een derde. Smallere velden staan op grote schermen naast elkaar en op mobiel onder elkaar.

### Vooraf invullen

Tekst-, e-mail-, telefoon- en verborgen velden kunnen worden ingevuld met het e-mailadres, de voornaam, de achternaam, de volledige naam of het bedrijf van de ingelogde klant, de productnaam of -referentie (op een productpagina), de pagina-URL of een **URL-parameter**. Voorbeeld: een verborgen veld met de parameter `utm_source` en een link naar `/contact?utm_source=nieuwsbrief` bewaren `nieuwsbrief` bij de inzending.

### Antwoordadres

Vink **Gebruiken als antwoordadres** aan bij een e-mailveld: een antwoord op de meldingsmail gaat dan rechtstreeks naar de bezoeker.

## Voorwaardelijke logica

Vink in het paneel van een veld **Dit veld tonen of verbergen afhankelijk van andere antwoorden** aan en kies:

- Dit veld tonen of verbergen;
- als alle of minstens één van de voorwaarden kloppen;
- elke voorwaarde: een veld, een operator (is, is niet, bevat, bevat niet, is leeg, is ingevuld, is groter dan, is kleiner dan) en een waarde.

Bij een keuzelijst, keuzerondjes of selectievakjes kiest u de waarde uit de opties. Een verborgen veld wordt niet gecontroleerd, opgeslagen of verzonden. Dezelfde logica wordt bij verzending opnieuw op de server berekend.

## Formulieren in meerdere stappen

Voeg een element **Nieuwe stap** (groep Opmaak) toe waar een stap moet beginnen en geef het een titel. Velden vóór de eerste markering vormen de eerste stap. Voor de bezoeker:

- verschijnen een voortgangsbalk en de titels van de stappen (uit te schakelen in Instellingen > Formulier in meerdere stappen);
- hebben de knoppen Volgende en Vorige een tekst per taal;
- wordt elke stap gecontroleerd voordat hij verder kan;
- wordt een stap overgeslagen als de logica al zijn velden verbergt.

## Tabblad Instellingen

- **Titel en inleiding**: titel voor bezoekers en inleidende tekst.
- **Verzenden**: tekst van de verzendknop, bevestigingsmelding of doorverwijzing naar een URL na verzending.
- **Toegang**: formulier alleen voor ingelogde klanten (anderen zien een link naar de inlogpagina), CSS-klasse.
- **Beschikbaarheid en limieten**: openings- en sluitingsdatum (tijdzone van de winkel), maximaal aantal inzendingen, één inzending per persoon (gecontroleerd op klantaccount en ingevuld e-mailadres), sluitingsmelding.
- **Concept**: bewaart de antwoorden 30 dagen in de browser van de bezoeker tot de verzending. Vóór verzending gaat er niets naar de winkel en bestanden worden niet bewaard.

## Tabblad E-mails

### Melding aan de winkel

Wordt verstuurd in de standaardtaal van de winkel. Ontvangers gescheiden door komma's; bij een leeg veld gelden de standaardontvangers uit de moduleconfiguratie en daarna het e-mailadres van de winkel. Het onderwerp accepteert de variabelen `{form_name}` en `{veldsleutel}`, die u met een klik kopieert. De optie **De geüploade bestanden bijvoegen** voegt bestanden toe tot in totaal 15 MB.

### Voorwaardelijke ontvangers

Elke regel koppelt een voorwaarde aan adressen: bijvoorbeeld als _Onderwerp_ _Offerte_ is, versturen naar `verkoop@uw-winkel.nl`. De instelling **Als een voorwaarde klopt** voegt deze adressen toe aan de ontvangers of vervangt ze.

### Bevestiging aan de bezoeker

Vereist een e-mailveld in het formulier. De e-mail gaat in de taal die de bezoeker gebruikte, met het onderwerp en bericht van uw keuze (variabelen toegestaan) en optioneel een samenvatting van de antwoorden.

### Webhook

Vul een URL in (Zapier, Make, n8n, CRM) om elke inzending als JSON via een POST-verzoek te ontvangen. Voorbeeldinhoud:

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

Met een **ondertekeningsgeheim** bevat de header `X-DFFB-Signature` de waarde `sha256=` gevolgd door de HMAC-SHA256 van de inhoud. Controle in PHP:

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

De aanroep wacht maximaal 5 seconden. Het resultaat (afgeleverd, geweigerd met HTTP-code, geen antwoord) staat op de pagina van elke inzending.

## Tabblad Weergave en integratie

### Weergavemodus

**Direct op de pagina** of **achter een knop, in een pop-upvenster**, met de knoptekst per taal. Deze modus geldt voor de posities, de shortcode en de widget.

### Automatische posities

Vink de themaposities aan: startpagina (`displayHome`), contactpagina (`displayContactContent`, `displayContactRightColumn`), productpagina (`displayProductAdditionalInfo`, `displayFooterProduct`), vertrouwensblok (`displayReassurance`), winkelwagen (`displayShoppingCartFooter`), CMS-pagina's (`displayCMSDisputeInformation`), kolommen (`displayLeftColumn`, `displayRightColumn`), boven de footer (`displayFooterBefore`), einde van de inhoud (`displayWrapperBottom`). Een positie toont niets als het thema haar niet aanroept.

### Eigen pagina

Elk formulier kan een eigen pagina hebben, bijvoorbeeld `/forms/3-offerteaanvraag`, met een vriendelijke URL per taal. De link **Voorbeeld** werkt ook als het formulier uitgeschakeld is; inzendingen worden daar geweigerd tot het is ingeschakeld.

### Integratiecodes

- Shortcode voor een CMS-pagina: `[dfform id=3]`
- Smarty-widget in een template: `{widget name='dfformbuilder' id_form=3}`
- Eigen hook: `{hook h='displayDfForm' id_form=3}`

### Statistieken

Over 30 dagen: weergaven (formulier getoond of pop-up geopend), gestart (klik in een veld), inzendingen, conversie- en uitvalpercentage. Bezoekers zonder JavaScript en de meeste bots worden niet geteld. Weergaven en conversie staan ook in de lijst met formulieren.

## Inzendingen beheren

**Klantenservice > Formulierinzendingen** toont de inzendingen met formulier, samenvatting, status en datum, allemaal filterbaar. Bulkacties: markeren als gelezen of afgehandeld, archiveren, exporteren naar CSV, verwijderen (de bestanden worden ook verwijderd).

Bij het openen krijgt een inzending de status Gelezen. De pagina toont:

- alle antwoorden en de bestanden om te downloaden;
- de status en een interne notitie;
- de klant (als hij was ingelogd), het product, de pagina van verzending, de taal, het IP-adres, het resultaat van e-mail en webhook;
- de knoppen Afdrukken, Antwoorden per e-mail, vorige en volgende inzending.

### De bezoeker antwoorden

Het paneel **De bezoeker antwoorden** stuurt uw bericht naar het adres uit het e-mailveld (bij voorkeur het veld dat als antwoordadres is gemarkeerd), in de taal van de bezoeker en in de e-mailopmaak van de winkel. Het antwoord blijft in de geschiedenis en de inzending kan tegelijk op Afgehandeld worden gezet.

### CSV-export

Het paneel onder de lijst exporteert per formulier, status en periode. Met een gekozen formulier krijgt u één kolom per veld. Het bestand is UTF-8 met puntkomma als scheidingsteken en opent direct in Excel, LibreOffice en Google Sheets.

## Algemene module-instellingen

- **Standaardontvangers**: gebruikt als een formulier geen eigen ontvangers heeft.
- **Maximale bestandsgrootte** (standaard 10 MB): algemene limiet per bestand. Kan niet hoger zijn dan `upload_max_filesize` en `post_max_size` van PHP.
- **Inzendingen bewaren gedurende** (dagen): daarna worden inzendingen en hun bestanden automatisch verwijderd. 0 bewaart ze onbeperkt.
- **IP-adres opslaan**: uitgeschakeld wordt alleen een hash bewaard voor de inzendingslimiet.
- **Minimale invultijd** (3 seconden) en **inzendingen per uur per bezoeker** (10): bescherming tegen bots.
- **reCAPTCHA v3**: sitesleutel, geheime sleutel en minimale score (0,5 aanbevolen). Het script van Google laadt pas als de bezoeker begint met invullen.

## Beveiliging en AVG

- Elk formulier bevat een onzichtbaar lokveld en een handtekening met tijdstempel; een te snelle of te frequente inzending wordt geweigerd.
- Scripts, HTML-pagina's en uitvoerbare bestanden worden altijd geweigerd en de inhoud van bestanden wordt gecontroleerd. Bestanden krijgen een willekeurige naam in een beveiligde map en zijn alleen via de back-office te downloaden.
- Met de officiële module **psgdpr** zitten de inzendingen van een klant (account of ingevuld e-mailadres) in de export van zijn gegevens en worden ze met zijn account verwijderd.

## Vertalingen

De interface van de module is beschikbaar in het Frans en het Engels; andere talen van de back-office tonen haar in het Engels. De e-mailsjablonen van de module bestaan in het Engels, Frans, Duits, Spaans, Italiaans, Nederlands, Pools en Portugees. De teksten van de formulieren zelf vult u in alle winkeltalen in.

## Problemen oplossen

### Het formulier verschijnt niet

Controleer of het formulier is ingeschakeld, of uw thema de gekozen positie aanroept en of de openingsdata het niet sluiten. Test bij twijfel de shortcode op een CMS-pagina of de eigen pagina.

### E-mails komen niet aan

De inzendingspagina toont of de melding is verstuurd. Controleer **Geavanceerde instellingen > E-mail** en stuur een test-e-mail vanuit PrestaShop.

### Een bestand wordt geweigerd

Controleer de toegestane extensies van het veld, de maximale grootte van het veld en van de module, en de PHP-limieten `upload_max_filesize` en `post_max_size`.

### De antispambeveiliging blokkeert het formulier

Een pagina die al enkele weken openstaat, heeft een verlopen handtekening: de bezoeker moet de pagina opnieuw laden. Gebruikt u reCAPTCHA, controleer dan of het domein in de Google-console staat en verlaag de minimale score als echte klanten worden geblokkeerd.
