PS PrestaShop Débutant

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.

Mis à jour Version du module 1.0.3

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é)

  1. Connectez-vous à votre back-office PrestaShop
  2. Rendez-vous dans Modules → Catalogue de modules
  3. Cliquez sur Charger un module en haut à droite
  4. Sélectionnez le ZIP dfagegate-X.Y.Z.zip
  5. Une fois l’upload terminé, cliquez sur Installer

Via FTP

  1. Décompressez le ZIP localement
  2. Uploadez le dossier dfagegate/ dans modules/ de votre PrestaShop
  3. Rendez-vous dans Modules → Catalogue de modules
  4. 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
  • ModeStandard (CBD, alcool, vape, armurerie) ou Médical (professionnels de santé)
  • Type de vérificationBouton 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 0 pour 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_log avec 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 :

  1. Le visiteur saisit jour, mois et année dans la modale
  2. Le JavaScript envoie ces valeurs au contrôleur AJAX DfagegateAjaxModuleFrontController
  3. PHP valide la date avec checkdate() puis calcule l’âge via DateTimeImmutable::diff()
  4. Si l’âge est inférieur au seuil configuré, le serveur renvoie une réponse JSON success=false, denied=true avec le message d’erreur
  5. La modale affiche le message de refus et redirige après 2 secondes
  6. Si l’âge est supérieur ou égal, le cookie dfagegate_ok est 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 :

  1. La modale affiche une liste déroulante de professions (configurable) et éventuellement un champ RPPS/ADELI
  2. Une case à cocher de déclaration sur l’honneur est présente et obligatoire
  3. Le contrôleur AJAX valide que la profession est sélectionnée
  4. Si RPPS/ADELI obligatoire, le serveur valide le format via une expression régulière qui accepte de 9 à 11 chiffres consécutifs
  5. Aucun stockage : ni la profession ni le numéro ne sont conservés en base — le cookie dfagegate_ok maté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 :

  1. Dans le sélecteur de contexte en haut du back-office, choisissez la sous-boutique cible
  2. Ouvrez la configuration du module
  3. 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 :

  1. Le PHP pré-rend le HTML complet de la modale et le passe au JS via Media::addJsDef
  2. Au DOMContentLoaded, le script vérifie si l’élément avec l’ID dfagegate-modal existe dans le DOM
  3. Si oui, tout va bien — le hook a fonctionné
  4. Si non, le script injecte lui-même la modale via insertAdjacentHTML('beforeend', ...)
  5. Un message console.info confirme 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 :

  1. Le commentaire diagnostic est-il présent avec should_display=1 ? Sinon, corrigez la config
  2. Ouvrez la boutique en navigation privée. Le cookie dfagegate_ok peut être posé depuis une session précédente
  3. Vérifiez votre IP dans les bypass de l’onglet Comportement
  4. Ouvrez la console navigateur (F12). Cherchez [dfagegate] pour d’éventuels messages d’injection fallback ou d’erreur
  5. Consultez les logs PrestaShop dans Paramètres avancés → Logs, filtrez sur « dfagegate »
  6. Videz le cache PrestaShop après chaque changement de configuration : Paramètres avancés → Performances → Vider le cache

Pour retester la modale sans changer d’IP :

  1. Ouvrez les DevTools (F12)
  2. Onglet Application (Chrome) ou Storage (Firefox)
  3. Section Cookies → votre domaine
  4. Supprimez la ligne dfagegate_ok
  5. Rechargez la page

Conformité RGPD

Le module est conçu pour être conforme RGPD par défaut.

  • 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
  • AttributsSameSite=Lax, Secure automatique 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ée
  • reason — raison du refus (user_refused ou dob_under_age)
  • age — âge déclaré si applicable
  • profession — profession déclarée si applicable
  • ip_hashSHA-256 de l’IP, jamais l’IP en clair
  • date_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 diagnostic
  • actionFrontControllerSetMedia — enregistre CSS et JS, passe la config et le HTML pré-rendu de la modale au JS
  • displayBeforeBodyClosingTag — 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.

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

Toujours bloqué ? Contactez le support