Leeftijdscontrole PrestaShop: Blokkerend Venster voor CBD, Alcohol, Vape & Zorgverleners: volledige gids
Volledige documentatie van de module dfagegate: installatie, configuratie van de modi (standaard CBD/alcohol/vape/wapenhandel en medisch), meertalige personalisatie, AVG-conformiteit en diagnose.
De module dfagegate voegt een blokkerend leeftijdsverificatievenster toe aan uw PrestaShop 8- of 9-winkel. Hij dekt twee aparte markten: de standaardmodus voor leeftijdsgereguleerde producten (CBD, alcohol, vape, wapenhandel, aanstekers, 18+-producten), en de medische modus voor medische hulpmiddelen die aan zorgverleners zijn voorbehouden, in de zin van artikel L5122-9 van de Franse Code de la santé publique.
Compatibiliteit — PrestaShop 1.7.7+, 8.x en 9.0. PHP 7.4 minimum, 8.1+ aanbevolen. Multistore en meertalig (FR/EN/ES/DE vooringevuld bij de installatie).
Installatie
De installatie volgt de standaard PrestaShop-workflow. Na aankoop op DataFirefly ontvangt u een ZIP-bestand dfagegate-X.Y.Z.zip.
Via de back-office (aanbevolen)
- Log in op uw PrestaShop back-office
- Ga naar Modules → Modulecatalogus
- Klik rechtsboven op Een module uploaden
- Selecteer de ZIP
dfagegate-X.Y.Z.zip - Klik na de upload op Installeren
Via FTP
- Pak de ZIP lokaal uit
- Upload de map
dfagegate/naarmodules/van uw PrestaShop - Ga naar Modules → Modulecatalogus
- Zoek “DataFirefly Age Gate” en klik op Installeren
Belangrijk — Na de installatie is de module standaard uitgeschakeld. Dat is opzettelijk: zo kunt u de teksten en de modus configureren voordat u uw winkel blokkeert. Ga naar de configuratie van de module en activeer de schakelaar in het tabblad Algemeen zodra alles is ingesteld.
Eerste configuratie
Open de configuratie: Modules → Geïnstalleerde modules → DataFirefly Age Gate → Configureren.
De configuratie is georganiseerd in 6 tabbladen:
- Algemeen — activering, modus, verificatietype, minimumleeftijd
- Inhoud — meertalige teksten (titel, bericht, knoppen, wettelijke vermeldingen)
- Uiterlijk — logo, kleuren, backdrop blur
- Gedrag — cookie, redirect, bypass
- Medische modus — beroepen en RPPS/ADELI (verschijnt alleen in de medische modus)
- Logs & AVG — logging en diagnose
Tabblad Algemeen
Hier configureert u het hoofdgedrag van de module.
- Module inschakelen — Ja/Nee-schakelaar, bepaalt de globale weergave van het venster
- Modus — Standaard (CBD, alcohol, vape, wapenhandel) of Medisch (zorgverleners)
- Verificatietype — Ja/nee-knop, Geboortedatum, of Beroepsverklaring
- Minimumleeftijd — standaard 18, 21 voor bepaalde markten (bijvoorbeeld Noorwegen voor alcohol)
Welk verificatietype kiezen? De ja/nee-knop past bij de meeste gevallen (CBD, alcohol voor het brede publiek, vape): snel, weinig frictie, voldoende afschrikkend voor een controle van de toezichthouder. De geboortedatum is strikter en aanbevolen voor wapenhandel of nicotinehoudende vloeistoffen. De beroepsverklaring is voorbehouden aan de medische modus.
Tabblad Inhoud
Elke in uw PrestaShop geactiveerde taal heeft haar eigen tekstblok. De standaardwaarden zijn vooringevuld in FR, EN, ES en DE. Per taal kunt u configureren:
- Titel — verschijnt groot bovenaan het venster (standaard: “Leeftijdsverificatie”)
- Bericht — verklarende hoofdtekst, regeleinden blijven behouden
- Bevestigknop — label van de positieve knop (standaard: “Ik ben 18 jaar of ouder”)
- Weigerknop — label van de negatieve knop
- Wettelijke vermelding — tekst onderaan het venster (bijvoorbeeld: “Alcoholmisbruik is gevaarlijk voor de gezondheid. Geniet, maar drink met mate.”)
- Bericht bij weigering — scherm dat wordt getoond wanneer de gebruiker weigert, vóór de redirect
HTML — De inhoud wordt bij het opslaan gesaneerd (alleen platte tekst). De regeleinden worden bij de weergave omgezet in <br>-tags via een automatisch nl2br-filter.
Tabblad Uiterlijk
Personaliseer de look van het venster zodat hij bij uw huisstijl past:
- Logo — PNG, JPG, SVG of WEBP, max. 2 MB, getoond bovenaan het venster
- Achtergrondkleur — kleur van de hoofdkaart (standaard wit)
- Primaire kleur — titel en hoofdknop (standaard zwart #111111)
- Tekstkleur — de berichttekst
- Overlaykleur — laag achter het venster, accepteert de CSS-formaten
rgba()en hex (standaard:rgba(15,15,20,0.85)) - Backdrop blur — vervaging op de achtergrond (modern effect, werkt in alle actuele browsers)
Tabblad Gedrag
Bepaalt de persistentie van de keuze en de uitsluitingsgevallen.
- Cookieduur — in dagen (standaard 90). Zet
0voor een sessiecookie (verwijderd bij het sluiten van de browser) - Redirect-URL bij weigering — laat leeg om alleen het weigeringsbericht te tonen, of vul een externe URL in (Google, leverancierspagina, enzovoort)
- IP-bypass — lijst met IP’s (één per regel) waarvoor het venster niet verschijnt. Ideaal voor u en uw team tijdens de tests
- URL-bypass — uitgesloten gedeeltelijke paden. Vooringevuld met
/legal,/contact,/cgv,/mentions-legales,/politique-confidentialite - Bypass voor ingelogde klanten — ingeschakeld zien al ingelogde klanten het venster niet (nuttig als uw winkel is voorbehouden aan al gevalideerde accounts)
Tabblad Medische modus
Dit tabblad geldt alleen als de modus op Medisch staat en het verificatietype op Beroepsverklaring.
- Beroepenlijst — één per regel. Standaard: Arts, Apotheker, Verpleegkundige, Kinesitherapeut, Tandarts, Dierenarts, Andere zorgverlener. Aanpasbaar aan uw doelgroep
- RPPS-/ADELI-nummer verplicht — ingeschakeld verschijnt een veld in het venster. Validatie via regex die 9 tot 11 cijfers accepteert. Het nummer wordt niet opgeslagen, het dient uitsluitend voor de server-side validatie
Juridische conformiteit — De medische modus materialiseert een verklaring op erewoord in de zin van artikel L5122-9 van de Franse Code de la santé publique, dat de reclame voor bepaalde medische hulpmiddelen voorbehoudt aan bevoegde zorgverleners. Deze module vervangt geen juridische review van uw catalogus door een gespecialiseerde advocaat. Raadpleeg uw adviseur om uw configuratie te valideren.
Tabblad Logs & AVG
Optionele logging en conformiteitsinformatie.
- Weigeringen loggen — registreert elke weigering in de tabel
ps_dfagegate_logmet SHA-256-gehasht IP (nooit in klare tekst), datum, reden
Dit tabblad toont ook een AVG-geheugensteun:
- Geplaatste cookie —
dfagegate_ok - Categorie — strikt noodzakelijk (wettelijke toegangsconformiteit)
- Gegevens — waarde “1”, configureerbare duur, SameSite=Lax, Secure bij HTTPS
Configureren volgens uw markt
Enkele typeconfiguraties ter inspiratie.
CBD-winkel voor het brede publiek
- Modus: Standaard
- Verificatietype: Ja/nee-knop
- Minimumleeftijd: 18
- Cookieduur: 90 dagen (goede balans tussen conformiteit en UX)
- Redirect-URL: leeg (alleen het weigeringsbericht)
- Wettelijke vermelding: “Het gebruik van cannabidiol kan een wisselwerking hebben met bepaalde geneesmiddelen. Raadpleeg uw arts.”
Winkel voor gedistilleerd / premium alcohol
- Modus: Standaard
- Verificatietype: Geboortedatum (striktere controle voor premium markten)
- Minimumleeftijd: 18 (of 21 voor de Amerikaanse/Noorse markten)
- Redirect-URL: een officiële informatiepagina over verantwoord alcoholgebruik
- Wettelijke vermelding: “Alcoholmisbruik is gevaarlijk voor de gezondheid. Geniet, maar drink met mate.”
Vape- / nicotinehoudende e-liquidwinkel
- Modus: Standaard
- Verificatietype: Geboortedatum (sterk aanbevolen voor nicotine)
- Minimumleeftijd: 18
- Weigeringen loggen: Ja (nuttig bij een controle van de toezichthouder)
Wapenwinkel
- Modus: Standaard
- Verificatietype: Geboortedatum (verplicht)
- Minimumleeftijd: 18
- URL-bypass: voeg
/reglementation,/permis-de-chassetoe - Weigeringen loggen: Ja
Winkel voor medisch materiaal (professionele hulpmiddelen)
- Modus: Medisch
- Verificatietype: Beroepsverklaring
- Beroepenlijst: Arts, Apotheker, Kinesitherapeut, Osteopaat (aan te passen aan uw catalogus)
- RPPS-/ADELI-nummer verplicht: Ja
- Bypass voor ingelogde klanten: Ja (als u het beroep al bij de registratie valideert)
Hoe de verificatie op geboortedatum werkt
In tegenstelling tot een simpele knop voert de verificatie op geboortedatum een berekening server-side uit, niet in de browser. Het volledige verloop:
- De bezoeker voert dag, maand en jaar in het venster in
- Het JavaScript verstuurt deze waarden naar de AJAX-controller
DfagegateAjaxModuleFrontController - PHP valideert de datum met
checkdate()en berekent daarna de leeftijd viaDateTimeImmutable::diff() - Is de leeftijd lager dan de geconfigureerde drempel, dan geeft de server een JSON-antwoord
success=false, denied=trueterug met de foutmelding - Het venster toont het weigeringsbericht en redirect na 2 seconden
- Is de leeftijd hoger dan of gelijk aan de drempel, dan wordt de cookie
dfagegate_okgeplaatst en sluit het venster
Waarom server-side? Een puur JavaScript-controle kan via DevTools in minder dan 10 seconden worden omzeild. De serverberekening garandeert dat een gebruiker onder de wettelijke leeftijd geen toegang tot de site krijgt, zelfs met technische kennis. Dat is essentieel om een controle van de toezichthouder te doorstaan.
Merk op dat de geboortedatum nooit wordt opgeslagen — ze wordt gebruikt voor de duur van een berekening en daarna vergeten. Alleen de binaire validatie (geaccepteerd / geweigerd) wordt via de cookie onthouden.
Hoe de medische modus werkt
De medische modus volgt een vergelijkbare logica maar met andere velden:
- Het venster toont een keuzelijst met beroepen (configureerbaar) en eventueel een RPPS-/ADELI-veld
- Een selectievakje voor de verklaring op erewoord is aanwezig en verplicht
- De AJAX-controller valideert dat een beroep is geselecteerd
- Is RPPS/ADELI verplicht, dan valideert de server het formaat via een reguliere expressie die 9 tot 11 opeenvolgende cijfers accepteert
- Geen enkele opslag: noch het beroep noch het nummer wordt in de database bewaard — de cookie
dfagegate_okmaterialiseert alleen de geslaagde passage
Ontwerpkeuze — De regelgeving L5122-9 vereist een materialisatie van de verklaring, niet noodzakelijk een realtimeverificatie in het nationale register. Onze aanpak is compliance minimum viable: we vragen de verklaring, valideren haar formeel, traceren de weigering indien ingeschakeld, maar verzamelen geen onnodig persoonsgegeven. Hebt u een realtime-RPPS-verificatie tegen het ANS-register nodig, dan is dat een aparte maatwerkontwikkeling.
Multistore
De module is 100% multistore-compatibel. Alle configuraties (modus, verificatietype, meertalige teksten, kleuren, bypass) worden per winkelcontext opgeslagen via id_shop_group en id_shop. Dat betekent dat u in eenzelfde PrestaShop kunt hebben:
- Een winkel CBD FR in standaardmodus 18 jaar met Franse teksten
- Een winkel vape UK in standaardmodus 18 jaar met Engelse teksten
- Een winkel medisch materiaal DE in medische modus met verplichte RPPS en Duitse teksten
Om een specifieke subwinkel te configureren:
- Kies in de contextkiezer bovenaan de back-office de doelsubwinkel
- Open de configuratie van de module
- Wijzig de waarden — ze worden alleen voor deze winkel bewaard
De hooks worden bij de installatie op alle winkels geregistreerd via Shop::getCompleteListOfShopsID(), wat de klassieke valkuil vermijdt van de module die alleen op de huidige winkel draait.
Compatibiliteit met aangepaste thema’s
De module gebruikt de standaardhook displayBeforeBodyClosingTag om het venster vlak vóór het sluiten van de body-tag te injecteren. Deze hook hoort universeel te zijn op PrestaShop 1.7.5+.
Helaas roepen sommige aangepaste thema’s deze hook niet aan in hun layout. Voor dat geval bevat dfagegate een JavaScript-fallback:
- PHP pre-rendert de volledige HTML van het venster en geeft die aan het JS door via
Media::addJsDef - Bij
DOMContentLoadedcontroleert het script of het element met de IDdfagegate-modalin de DOM bestaat - Zo ja, alles is in orde — de hook heeft gewerkt
- Zo nee, dan injecteert het script het venster zelf via
insertAdjacentHTML('beforeend', ...) - Een bericht
console.infobevestigt de activering van de fallback: “[dfagegate] modal injected via JS fallback (theme does not trigger displayBeforeBodyClosingTag).”
Praktisch resultaat — De module werkt op elk PrestaShop 1.7.5+-thema, inclusief onvolledige aangepaste thema’s, zonder de layout te hoeven wijzigen. U kunt hem uitrollen zonder afstemming met uw thema-agentschap.
Diagnose en debug
Eenmaal geactiveerd voegt dfagegate een HTML-commentaar in de head-tag van elke frontpagina toe, in de vorm “dfagegate v1.0.3 enabled=1 should_display=1”.
Dit commentaar is uw eerste diagnosepunt. Bekijk de broncode van een frontpagina (Ctrl+U of Cmd+U) en zoek “dfagegate”.
| Commentaar | Interpretatie |
|---|---|
| Helemaal geen commentaar | De hook displayHeader is niet geregistreerd — controleer of de module daadwerkelijk is geïnstalleerd en actief |
enabled=0 |
De schakelaar “Module inschakelen” staat op Nee in het tabblad Algemeen |
enabled=1 should_display=0 |
Er is een bypass actief: uw IP staat op de whitelist, de huidige URL matcht een uitgesloten pad, of u bent een ingelogde klant met ingeschakelde bypass |
enabled=1 should_display=1 |
Alles is in orde aan serverzijde. Verschijnt het venster niet, kijk dan in de browserconsole naar een eventueel JS-fallback- of foutbericht |
Het venster verschijnt nog steeds niet?
Snelle checklist:
- Is het diagnosecommentaar aanwezig met
should_display=1? Zo nee, corrigeer de configuratie - Open de winkel in privénavigatie. De cookie
dfagegate_okkan uit een vorige sessie stammen - Controleer uw IP in de bypass van het tabblad Gedrag
- Open de browserconsole (F12). Zoek
[dfagegate]voor eventuele fallback-injectie- of foutberichten - Raadpleeg de PrestaShop-logs in Geavanceerde instellingen → Logs, filter op “dfagegate”
- Leeg de PrestaShop-cache na elke configuratiewijziging: Geavanceerde instellingen → Prestaties → Cache legen
De cookie in de browser resetten
Om het venster opnieuw te testen zonder van IP te wisselen:
- Open de DevTools (F12)
- Tabblad Application (Chrome) of Storage (Firefox)
- Sectie Cookies → uw domein
- Verwijder de regel
dfagegate_ok - Herlaad de pagina
AVG-conformiteit
De module is standaard ontworpen om AVG-conform te zijn.
De cookie dfagegate_ok
- Type — strikt noodzakelijk voor het naleven van een wettelijke toegangsverplichting
- Rechtsgrond — vrijgesteld van voorafgaande toestemming (categorie van de strikt noodzakelijke cookies volgens de aanbevelingen van de toezichthouders)
- Waarde — binair (
1= bevestigd) - Duur — configureerbaar (standaard 90 dagen), of sessie als u 0 invult
- Attributen —
SameSite=Lax, automatischSecurebij HTTPS,Path=/
Concreet — U hoeft deze cookie niet aan uw toestemmingsbanner toe te voegen. Hij valt in dezelfde categorie als de PrestaShop-sessiecookie of de CSRF-cookie: noodzakelijk voor de wettelijke werking van de site, dus vrijgesteld.
De weigeringslogs
Schakelt u de optie Weigeringen loggen in, dan wordt elke weigering geregistreerd in de tabel ps_dfagegate_log met:
id_shop— betrokken subwinkelreason— reden van de weigering (user_refusedofdob_under_age)age— opgegeven leeftijd indien van toepassingprofession— opgegeven beroep indien van toepassingip_hash— SHA-256 van het IP, nooit het IP in klare tekstdate_add— tijdstempel
De SHA-256-hashing maakt het IP onomkeerbaar en laat tegelijk toe pogingen te ontdubbelen (eenzelfde IP produceert altijd dezelfde hash). Dat is het aanbevolen compromis voor toegangsstatistieken.
De verificatiegegevens
- De geboortedatum passeert via AJAX voor de berekening maar wordt nooit opgeslagen
- Het RPPS-/ADELI-nummer wordt server-side gevalideerd en daarna vergeten, nooit opgeslagen
- Alleen de binaire validatie wordt bewaard, via de cookie
Technische structuur en integratie
Voor ontwikkelaars die verder willen gaan of de module in een aangepaste workflow willen integreren.
Gebruikte hooks
displayHeader— injecteert het diagnosecommentaaractionFrontControllerSetMedia— registreert CSS en JS, geeft de configuratie en de pre-gerenderde HTML van het venster door aan het JSdisplayBeforeBodyClosingTag— rendert het venster server-side (JS-fallback als hij in het thema ontbreekt)
AJAX-endpoints
De AJAX-controller antwoordt op de URL /module/dfagegate/ajax en accepteert twee acties:
action=confirm— met de parameters volgens het verificatietype (niets voor ja/nee, day/month/year voor geboortedatum, profession/rpps voor medisch)action=refuse— registreert de weigering en geeft de redirect-URL terug
De antwoorden zijn in JSON. Een bevestiging geeft success=true terug. Een weigering wegens onvoldoende leeftijd geeft success=false, denied=true en de aangepaste foutmelding terug. Een validatiefout geeft success=false met het bericht terug. Een gebruikersweigering geeft success=true en redirect_url met de geconfigureerde redirect-URL terug.
Databaseschema
Er wordt maar één tabel aangemaakt: ps_dfagegate_log. Ze bevat de kolommen id_log (auto-increment primaire sleutel), id_shop, reason (varchar 64), age (nullable), profession (varchar 128 nullable), ip_hash (char 64 voor de SHA-256) en date_add (datetime). Twee secundaire indexen optimaliseren de rapportagequery’s: idx_shop_date op (id_shop, date_add) en idx_reason op reason.
Deïnstallatie
Twee niveaus van deïnstallatie:
Uitschakelen zonder verwijderen
Modules → Geïnstalleerde modules → DataFirefly Age Gate → Uitschakelen. De configuratie blijft behouden, de logtabel ook. U kunt op elk moment opnieuw activeren zonder te herconfigureren.
Volledig deïnstalleren
Modules → Geïnstalleerde modules → DataFirefly Age Gate → Deïnstalleren. Deze actie:
- Verwijdert de tabel
ps_dfagegate_log - Verwijdert alle configuratie-items (18 scalaire sleutels + 6 meertalige sleutels)
- Deregistreert de hooks
- Verwijdert de module uit het systeem
Let op — De deïnstallatie is onomkeerbaar. Wilt u de geschiedenis van de weigeringslogs bewaren (bijvoorbeeld voor een audit), exporteer dan de tabel vooraf.
Support en updates
Elke licentie omvat:
- 12 maanden updates — PrestaShop-compatibiliteit, correcties, verbeteringen
- Technische support per e-mail — antwoord binnen 24 werkuren, FR/EN
- 30 dagen geld terug
- Niet-versleutelde broncode — u bent vrij de module aan uw specifieke behoeften aan te passen
Neem voor elke technische vraag of bugmelding contact met ons op vanuit uw DataFirefly-account. Vermeld de PrestaShop-versie, de PHP-versie, de moduleversie (zichtbaar bovenaan het configuratiescherm) en, indien mogelijk, het diagnosecommentaar in de head-tag van uw winkel.