Vérification d’Âge PrestaShop – Modal Bloquante pour CBD, Alcool, Vape & Pro de Santé
Documentation complète du module dfagegate : installation, configuration des modes (standard CBD/alcool/vape/armurerie et médical), personnalisation multilingue, conformité RGPD et diagnostic.
Le module dfagegate ajoute une modale de vérification d’âge bloquante à votre boutique PrestaShop 8 ou 9. Il couvre deux marchés distincts : le mode standard pour les produits réglementés par âge (CBD, alcool, vape, armurerie, briquets, produits 18+), et le mode médical pour les dispositifs médicaux réservés aux professionnels de santé au sens de l’article L5122-9 du Code de la santé publique.
Compatibilité — PrestaShop 1.7.7+, 8.x et 9.0. PHP 7.4 minimum, 8.1+ recommandé. Multi-boutique et multilingue (FR/EN/ES/DE pré-remplis à l’installation).
Installation
L’installation suit le workflow PrestaShop standard. Après achat sur DataFirefly, vous recevez un fichier ZIP dfagegate-X.Y.Z.zip.
Via le back-office (recommandé)
- Connectez-vous à votre back-office PrestaShop
- Rendez-vous dans Modules → Catalogue de modules
- Cliquez sur Charger un module en haut à droite
- Sélectionnez le ZIP
dfagegate-X.Y.Z.zip - Une fois l’upload terminé, cliquez sur Installer
Via FTP
- Décompressez le ZIP localement
- Uploadez le dossier
dfagegate/dansmodules/de votre PrestaShop - Rendez-vous dans Modules → Catalogue de modules
- Recherchez « DataFirefly Age Gate » et cliquez sur Installer
Important — Après l’installation, le module est désactivé par défaut. C’est volontaire : cela vous permet de configurer les textes et le mode avant de bloquer votre boutique. Rendez-vous dans la configuration du module et activez le toggle dans l’onglet Général une fois tout paramétré.
Premier paramétrage
Accédez à la configuration : Modules → Modules installés → DataFirefly Age Gate → Configurer.
La configuration est organisée en 6 onglets :
- Général — activation, mode, type de vérification, âge minimum
- Contenu — textes multilingues (titre, message, boutons, mentions légales)
- Apparence — logo, couleurs, backdrop blur
- Comportement — cookie, redirection, bypass
- Mode médical — professions et RPPS/ADELI (n’apparaît qu’en mode médical)
- Logs & RGPD — journalisation et diagnostic
Onglet Général
C’est ici que vous configurez le comportement principal du module.
- Activer le module — toggle Oui/Non, contrôle l’affichage global de la modale
- Mode — Standard (CBD, alcool, vape, armurerie) ou Médical (professionnels de santé)
- Type de vérification — Bouton oui/non, Date de naissance, ou Déclaration profession
- Âge minimum — 18 par défaut, 21 pour certains marchés (Norvège pour l’alcool par exemple)
Quel type de vérification choisir ? Le bouton oui/non convient à la majorité des cas (CBD, alcool grand public, vape) : rapide, faible friction, effet dissuasif suffisant pour un contrôle DGCCRF. La date de naissance est plus stricte et recommandée pour l’armurerie ou les liquides nicotinés. La déclaration profession est réservée au mode médical.
Onglet Contenu
Chaque langue activée dans votre PrestaShop dispose de son propre bloc de textes. Les valeurs par défaut sont pré-remplies en FR, EN, ES et DE. Pour chaque langue vous pouvez configurer :
- Titre — apparaît en gros au sommet de la modale (par défaut : « Vérification d’âge »)
- Message — texte explicatif principal, les retours à la ligne sont préservés
- Bouton confirmer — libellé du bouton positif (par défaut : « J’ai 18 ans ou plus »)
- Bouton refuser — libellé du bouton négatif
- Mention légale — texte en bas de modale (par défaut : « L’abus d’alcool est dangereux pour la santé. À consommer avec modération. »)
- Message en cas de refus — écran affiché quand l’utilisateur refuse, avant redirection
HTML — Le contenu est sanitisé à l’enregistrement (texte brut uniquement). Les retours à la ligne sont convertis en balises <br> au rendu via un filtre nl2br automatique.
Onglet Apparence
Personnalisez le look de la modale pour qu’il colle à votre charte graphique :
- Logo — PNG, JPG, SVG ou WEBP, 2 Mo max, affiché en haut de la modale
- Couleur de fond — couleur de la carte principale (blanc par défaut)
- Couleur primaire — titre et bouton principal (noir #111111 par défaut)
- Couleur du texte — corps du message
- Couleur de l’overlay — voile derrière la modale, accepte les formats CSS
rgba()et hex (par défaut :rgba(15,15,20,0.85)) - Backdrop blur — flou en arrière-plan (effet moderne, marche sur tous les navigateurs actuels)
Onglet Comportement
Contrôle la persistance du choix et les cas d’exclusion.
- Durée du cookie — en jours (90 par défaut). Mettre
0pour un cookie de session (supprimé à la fermeture du navigateur) - URL de redirection en cas de refus — laissez vide pour n’afficher que le message de refus, ou renseignez une URL externe (Google, page fournisseur, etc.)
- Bypass IP — liste d’IPs (une par ligne) pour lesquelles la modale ne s’affiche pas. Idéal pour vous et votre équipe pendant les tests
- Bypass URLs — chemins partiels exclus. Pré-rempli avec
/legal,/contact,/cgv,/mentions-legales,/politique-confidentialite - Bypass clients connectés — si activé, les clients déjà logués ne voient pas la modale (utile si votre boutique est réservée aux comptes déjà validés)
Onglet Mode médical
Cet onglet ne s’applique que si le mode est réglé sur Médical et le type de vérification sur Déclaration profession.
- Liste des professions — une par ligne. Par défaut : Médecin, Pharmacien, Infirmier(ère), Kinésithérapeute, Dentiste, Vétérinaire, Autre professionnel de santé. Personnalisable selon votre cible
- Numéro RPPS / ADELI obligatoire — si activé, un champ apparaît dans la modale. Validation par regex acceptant 9 à 11 chiffres. Le numéro n’est pas stocké, il sert uniquement à la validation côté serveur
Conformité juridique — Le mode médical matérialise une déclaration sur l’honneur au sens de l’article L5122-9 du Code de la santé publique, qui réserve la publicité de certains dispositifs médicaux aux professionnels de santé habilités. Ce module ne dispense pas d’une revue juridique de votre catalogue par un avocat spécialisé. Consultez votre conseil pour valider votre configuration.
Onglet Logs & RGPD
Journalisation optionnelle et informations de conformité.
- Logger les refus — enregistre chaque refus dans la table
ps_dfagegate_logavec IP hashée SHA-256 (jamais en clair), date, raison
Cet onglet affiche également un pense-bête RGPD :
- Cookie déposé —
dfagegate_ok - Catégorie — strictement nécessaire (conformité légale d’accès)
- Données — valeur « 1 », durée configurable, SameSite=Lax, Secure si HTTPS
Configurer selon votre marché
Voici quelques configurations types pour vous inspirer.
Boutique CBD grand public
- Mode : Standard
- Type de vérification : Bouton oui/non
- Âge minimum : 18
- Durée du cookie : 90 jours (bon équilibre entre conformité et UX)
- URL de redirection : vide (juste le message de refus)
- Mention légale : « La consommation de cannabidiol peut interagir avec certains médicaments. Consultez votre médecin. »
Boutique de spiritueux / alcool premium
- Mode : Standard
- Type de vérification : Date de naissance (contrôle plus strict pour marchés premium)
- Âge minimum : 18 (ou 21 pour les marchés US/Norvège)
- URL de redirection :
https://www.eatandrink.gouv.fr/ou toute page d’information officielle - Mention légale : « L’abus d’alcool est dangereux pour la santé. À consommer avec modération. »
Boutique de vape / e-liquides nicotinés
- Mode : Standard
- Type de vérification : Date de naissance (fortement recommandé pour la nicotine)
- Âge minimum : 18
- Logger les refus : Oui (utile en cas de contrôle DGCCRF)
Boutique d’armurerie
- Mode : Standard
- Type de vérification : Date de naissance (obligatoire)
- Âge minimum : 18
- Bypass URLs : ajouter
/reglementation,/permis-de-chasse - Logger les refus : Oui
Boutique matériel médical (dispositifs pro)
- Mode : Médical
- Type de vérification : Déclaration profession
- Liste des professions : Médecin, Pharmacien, Kinésithérapeute, Ostéopathe (à adapter à votre catalogue)
- Numéro RPPS / ADELI obligatoire : Oui
- Bypass clients connectés : Oui (si vous validez déjà la profession à l’inscription)
Comment fonctionne la vérification par date de naissance
Contrairement à un simple bouton, la vérification par date de naissance fait un calcul côté serveur et non côté navigateur. Voici le déroulement complet :
- Le visiteur saisit jour, mois et année dans la modale
- Le JavaScript envoie ces valeurs au contrôleur AJAX
DfagegateAjaxModuleFrontController - PHP valide la date avec
checkdate()puis calcule l’âge viaDateTimeImmutable::diff() - Si l’âge est inférieur au seuil configuré, le serveur renvoie une réponse JSON
success=false, denied=trueavec le message d’erreur - La modale affiche le message de refus et redirige après 2 secondes
- Si l’âge est supérieur ou égal, le cookie
dfagegate_okest posé et la modale se ferme
Pourquoi côté serveur ? Un contrôle purement JavaScript peut être bypassé via DevTools en moins de 10 secondes. Le calcul serveur garantit qu’un utilisateur sous l’âge légal ne peut pas accéder au site, même avec des connaissances techniques. C’est essentiel pour tenir un contrôle DGCCRF.
Notez que la date de naissance n’est jamais stockée — elle est utilisée le temps d’un calcul puis oubliée. Seule la validation binaire (accepté / refusé) est retenue via le cookie.
Comment fonctionne le mode médical
Le mode médical suit une logique similaire mais avec des champs différents :
- La modale affiche une liste déroulante de professions (configurable) et éventuellement un champ RPPS/ADELI
- Une case à cocher de déclaration sur l’honneur est présente et obligatoire
- Le contrôleur AJAX valide que la profession est sélectionnée
- Si RPPS/ADELI obligatoire, le serveur valide le format via une expression régulière qui accepte de 9 à 11 chiffres consécutifs
- Aucun stockage : ni la profession ni le numéro ne sont conservés en base — le cookie
dfagegate_okmatérialise uniquement le passage réussi
Choix de conception — La régulation L5122-9 exige une matérialisation de la déclaration, pas nécessairement une vérification en temps réel auprès de l’annuaire national. Notre approche est compliance minimum viable : on demande la déclaration, on la valide formellement, on trace le refus si activé, mais on ne collecte pas de donnée personnelle inutile. Si vous avez besoin d’une vérification RPPS en temps réel contre l’annuaire ANS, c’est un développement custom à part.
Multi-boutique
Le module est 100% compatible multi-boutique. Toutes les configurations (mode, type de vérification, textes multilingues, couleurs, bypass) sont stockées par contexte boutique via id_shop_group et id_shop. Cela signifie que vous pouvez avoir dans un même PrestaShop :
- Une boutique CBD FR en mode standard 18 ans avec textes en français
- Une boutique vape UK en mode standard 18 ans avec textes en anglais
- Une boutique matériel médical DE en mode médical avec RPPS obligatoire et textes en allemand
Pour configurer une sous-boutique spécifique :
- Dans le sélecteur de contexte en haut du back-office, choisissez la sous-boutique cible
- Ouvrez la configuration du module
- Modifiez les valeurs — elles seront persistées pour cette boutique uniquement
Les hooks sont enregistrés sur toutes les boutiques au moment de l’installation via Shop::getCompleteListOfShopsID(), évitant le piège classique du module qui ne tourne que sur la boutique courante.
Compatibilité avec les thèmes personnalisés
Le module utilise le hook standard displayBeforeBodyClosingTag pour injecter la modale juste avant la fermeture de la balise body. Ce hook est censé être universel sur PrestaShop 1.7.5+.
Malheureusement, certains thèmes personnalisés n’appellent pas ce hook dans leur layout. Pour ce cas, dfagegate embarque un fallback JavaScript :
- Le PHP pré-rend le HTML complet de la modale et le passe au JS via
Media::addJsDef - Au
DOMContentLoaded, le script vérifie si l’élément avec l’IDdfagegate-modalexiste dans le DOM - Si oui, tout va bien — le hook a fonctionné
- Si non, le script injecte lui-même la modale via
insertAdjacentHTML('beforeend', ...) - Un message
console.infoconfirme l’activation du fallback : « [dfagegate] modal injected via JS fallback (theme does not trigger displayBeforeBodyClosingTag). »
Résultat pratique — Le module marche sur n’importe quel thème PrestaShop 1.7.5+, y compris les thèmes personnalisés incomplets, sans avoir à modifier le layout. Vous pouvez le déployer sans coordination avec votre agence thème.
Diagnostic et debug
Une fois activé, dfagegate ajoute un commentaire HTML dans la balise head de chaque page front, sous la forme « dfagegate v1.0.3 enabled=1 should_display=1 ».
Ce commentaire est votre premier point de diagnostic. Consultez le code source d’une page front (Ctrl+U ou Cmd+U) et cherchez « dfagegate ».
| Commentaire | Interprétation |
|---|---|
| Pas de commentaire du tout | Le hook displayHeader n’est pas enregistré — vérifiez que le module est bien installé et actif |
enabled=0 |
Le toggle « Activer le module » est sur Non dans l’onglet Général |
enabled=1 should_display=0 |
Un bypass est actif : votre IP est whitelistée, l’URL courante matche un chemin exclu, ou vous êtes client connecté avec bypass activé |
enabled=1 should_display=1 |
Tout va bien côté serveur. Si la modale n’apparaît pas, regardez la console navigateur pour un éventuel message de fallback JS ou d’erreur |
La modale n’apparaît toujours pas ?
Checklist rapide :
- Le commentaire diagnostic est-il présent avec
should_display=1? Sinon, corrigez la config - Ouvrez la boutique en navigation privée. Le cookie
dfagegate_okpeut être posé depuis une session précédente - Vérifiez votre IP dans les bypass de l’onglet Comportement
- Ouvrez la console navigateur (F12). Cherchez
[dfagegate]pour d’éventuels messages d’injection fallback ou d’erreur - Consultez les logs PrestaShop dans Paramètres avancés → Logs, filtrez sur « dfagegate »
- Videz le cache PrestaShop après chaque changement de configuration : Paramètres avancés → Performances → Vider le cache
Réinitialiser le cookie côté navigateur
Pour retester la modale sans changer d’IP :
- Ouvrez les DevTools (F12)
- Onglet Application (Chrome) ou Storage (Firefox)
- Section Cookies → votre domaine
- Supprimez la ligne
dfagegate_ok - Rechargez la page
Conformité RGPD
Le module est conçu pour être conforme RGPD par défaut.
Le cookie dfagegate_ok
- Type — strictement nécessaire au respect d’une obligation légale d’accès
- Base légale — exempté de consentement préalable au sens de l’article 82 de la loi Informatique et Libertés (recommandations CNIL)
- Valeur — binaire (
1= confirmé) - Durée — configurable (90 jours par défaut), ou session si vous mettez 0
- Attributs —
SameSite=Lax,Secureautomatique en HTTPS,Path=/
Concrètement — Vous n’avez pas besoin d’ajouter ce cookie à votre bannière de consentement. Il rentre dans la même catégorie que le cookie de session PrestaShop ou le cookie CSRF : nécessaire au fonctionnement légal du site, donc exempt.
Les logs de refus
Si vous activez l’option Logger les refus, chaque refus est enregistré dans la table ps_dfagegate_log avec :
id_shop— sous-boutique concernéereason— raison du refus (user_refusedoudob_under_age)age— âge déclaré si applicableprofession— profession déclarée si applicableip_hash— SHA-256 de l’IP, jamais l’IP en clairdate_add— horodatage
Le hachage SHA-256 rend l’IP non réversible tout en permettant de dédupliquer les tentatives (une même IP produira toujours le même hash). C’est le compromis recommandé par la CNIL pour la statistique d’accès.
Les données de vérification
- La date de naissance transite via AJAX pour le calcul mais n’est jamais stockée
- Le numéro RPPS/ADELI est validé côté serveur puis oublié, jamais stocké
- Seule la validation binaire est conservée, via le cookie
Structure technique et intégration
Pour les développeurs qui veulent aller plus loin ou intégrer le module dans un workflow personnalisé.
Hooks utilisés
displayHeader— injecte le commentaire diagnosticactionFrontControllerSetMedia— enregistre CSS et JS, passe la config et le HTML pré-rendu de la modale au JSdisplayBeforeBodyClosingTag— rend la modale côté serveur (fallback JS si absent du thème)
Points d’entrée AJAX
Le contrôleur AJAX répond à l’URL /module/dfagegate/ajax et accepte deux actions :
action=confirm— avec les paramètres selon le type de vérification (rien pour yes/no, day/month/year pour DOB, profession/rpps pour médical)action=refuse— enregistre le refus et retourne l’URL de redirection
Les réponses sont en JSON. Une confirmation renvoie success=true. Un refus par âge insuffisant renvoie success=false, denied=true et le message d’erreur adapté. Une erreur de validation renvoie success=false avec le message. Un refus utilisateur renvoie success=true et redirect_url contenant l’URL de redirection configurée.
Schéma de base de données
Une seule table est créée : ps_dfagegate_log. Elle contient les colonnes id_log (clé primaire auto-incrémentée), id_shop, reason (varchar 64), age (nullable), profession (varchar 128 nullable), ip_hash (char 64 pour le SHA-256) et date_add (datetime). Deux index secondaires optimisent les requêtes de reporting : idx_shop_date sur (id_shop, date_add) et idx_reason sur reason.
Désinstallation
Deux niveaux de désinstallation :
Désactiver sans supprimer
Modules → Modules installés → DataFirefly Age Gate → Désactiver. La configuration est conservée, la table de logs aussi. Vous pouvez réactiver à tout moment sans reconfigurer.
Désinstaller complètement
Modules → Modules installés → DataFirefly Age Gate → Désinstaller. Cette action :
- Supprime la table
ps_dfagegate_log - Supprime toutes les entrées de configuration (18 clés scalaires + 6 clés multilingues)
- Désenregistre les hooks
- Retire le module du système
Attention — La désinstallation est irréversible. Si vous voulez conserver l’historique des logs de refus (pour un audit CNIL par exemple), exportez la table avant.
Support et mises à jour
Chaque licence inclut :
- 12 mois de mises à jour — compatibilité PrestaShop, corrections, améliorations
- Support technique par email — réponse sous 24h ouvrées, FR/EN
- Remboursement 30 jours sans question
- Code source non chiffré — vous êtes libre d’adapter le module à vos besoins spécifiques
Pour toute question technique ou signalement de bug, contactez-nous depuis votre compte DataFirefly. Précisez la version de PrestaShop, la version de PHP, la version du module (visible en haut de l’écran de configuration), et si possible le commentaire diagnostic présent dans la balise head de votre boutique.