Verifica dell’Età PrestaShop – Modale Bloccante per CBD, Alcol, Svapo e Professionisti Sanitari
Documentazione completa del modulo dfagegate: installazione, configurazione delle modalità (standard CBD/alcol/svapo/armeria e medicale), personalizzazione multilingue, conformità GDPR e diagnostica.
Il modulo dfagegate aggiunge una modale di verifica dell’età bloccante al vostro negozio PrestaShop 8 o 9. Copre due mercati distinti: la modalità standard per i prodotti regolamentati per età (CBD, alcol, svapo, armeria, accendini, prodotti 18+), e la modalità medicale per i dispositivi medici riservati ai professionisti sanitari (in Francia, ai sensi dell’articolo L5122-9 del Codice della sanità pubblica).
Compatibilità — PrestaShop 1.7.7+, 8.x e 9.0. PHP 7.4 minimo, 8.1+ consigliato. Multinegozio e multilingue (FR/EN/ES/DE precompilati all’installazione).
Installazione
L’installazione segue il flusso standard di PrestaShop. Dopo l’acquisto su DataFirefly, riceverete un file ZIP dfagegate-X.Y.Z.zip.
Dal back-office (consigliato)
- Accedete al vostro back-office PrestaShop
- Andate su Moduli → Catalogo moduli
- Cliccate su Carica un modulo in alto a destra
- Selezionate lo ZIP
dfagegate-X.Y.Z.zip - Una volta caricato, cliccate su Installa
Via FTP
- Decomprimete l’archivio localmente
- Caricate la cartella
dfagegate/nella directorymodules/del vostro PrestaShop - Andate su Moduli → Catalogo moduli
- Cercate «DataFirefly Age Gate» e cliccate su Installa
Importante — Dopo l’installazione, il modulo è disattivato per impostazione predefinita. È intenzionale: vi permette di configurare i testi e la modalità prima di bloccare il negozio. Andate nella configurazione del modulo e attivate l’interruttore nella scheda Generale una volta completata la configurazione.
Configurazione iniziale
Accedete alla configurazione: Moduli → Moduli installati → DataFirefly Age Gate → Configura.
La configurazione è organizzata in 6 schede:
- Generale — attivazione, modalità, tipo di verifica, età minima
- Contenuto — testi multilingue (titolo, messaggio, pulsanti, avvisi legali)
- Aspetto — logo, colori, sfocatura dello sfondo
- Comportamento — cookie, reindirizzamento, regole di bypass
- Modalità medicale — professioni e numero di iscrizione all’albo (si applica solo in modalità medicale)
- Log e GDPR — registrazione e diagnostica
Scheda Generale
- Attiva il modulo — interruttore Sì/No, controlla la visualizzazione globale della modale
- Modalità — Standard (CBD, alcol, svapo, armeria) o Medicale (professionisti sanitari)
- Tipo di verifica — Pulsante sì/no, Data di nascita o Dichiarazione di professione
- Età minima — 18 per impostazione predefinita, 21 per alcuni mercati
Quale tipo di verifica scegliere? Il pulsante sì/no è adatto alla maggior parte dei casi (CBD, alcol generico, svapo): rapido, poca frizione, deterrente sufficiente per un controllo delle autorità. La data di nascita è più rigorosa e consigliata per armerie o liquidi con nicotina. La dichiarazione di professione è riservata alla modalità medicale.
Scheda Contenuto
Ogni lingua attivata nel vostro PrestaShop dispone di un proprio blocco di testi. I valori predefiniti sono precompilati in FR, EN, ES e DE. Per ogni lingua potete configurare:
- Titolo — visualizzato in grande in cima alla modale (predefinito: «Verifica dell’età»)
- Messaggio — testo esplicativo principale, le interruzioni di riga sono conservate
- Pulsante conferma — etichetta del pulsante positivo (predefinito: «Ho 18 anni o più»)
- Pulsante rifiuta — etichetta del pulsante negativo
- Avviso legale — testo in fondo alla modale
- Messaggio di rifiuto — schermata mostrata quando l’utente rifiuta, prima del reindirizzamento
HTML — Il contenuto viene sanificato al salvataggio (solo testo semplice). Le interruzioni di riga vengono convertite in tag di interruzione al rendering tramite un filtro nl2br automatico.
Scheda Aspetto
- Logo — PNG, JPG, SVG o WEBP, max 2 MB, visualizzato in cima alla modale
- Colore di sfondo — colore della scheda principale (bianco per impostazione predefinita)
- Colore primario — titolo e pulsante principale (nero #111111 per impostazione predefinita)
- Colore del testo — corpo del messaggio
- Colore dell’overlay — velo dietro la modale, accetta i formati CSS
rgba()ed esadecimale (predefinito:rgba(15,15,20,0.85)) - Sfocatura dello sfondo — effetto moderno, funziona su tutti i browser attuali
Scheda Comportamento
- Durata del cookie — in giorni (90 per impostazione predefinita). Impostate
0per un cookie di sessione (eliminato alla chiusura del browser) - URL di reindirizzamento al rifiuto — lasciate vuoto per mostrare solo il messaggio di rifiuto, o indicate un URL esterno
- Bypass IP — elenco di IP (uno per riga) per i quali la modale non appare mai. Ideale per voi e il vostro team durante i test
- Bypass URL — percorsi parziali esclusi. Precompilato con
/legal,/contacte altre pagine legali - Bypass clienti connessi — se attivato, i clienti già autenticati non vedono mai la modale
Scheda Modalità medicale
Questa scheda si applica solo quando la modalità è Medicale e il tipo di verifica è Dichiarazione di professione.
- Elenco delle professioni — una per riga. Predefinito: Medico, Farmacista, Infermiere/a, Fisioterapista, Dentista, Veterinario, Altro professionista sanitario. Completamente personalizzabile
- Numero di iscrizione all’albo obbligatorio — se attivato, appare un campo nella modale. Validazione regex che accetta da 9 a 11 cifre. Il numero non viene memorizzato, viene solo validato lato server
Conformità legale — La modalità medicale materializza una dichiarazione sull’onore nello spirito dell’articolo francese L5122-9 del Codice della sanità pubblica, che riserva la pubblicità di alcuni dispositivi medici ai professionisti sanitari autorizzati. Questo modulo non sostituisce una revisione legale del vostro catalogo da parte di un avvocato specializzato. Consultate il vostro legale per validare la configurazione e verificare le norme equivalenti nella vostra giurisdizione.
Scheda Log e GDPR
- Registrare i rifiuti — salva ogni rifiuto nella tabella
ps_dfagegate_logcon IP hashato SHA-256 (mai in chiaro), data, motivo
Questa scheda mostra anche un riepilogo GDPR:
- Cookie impostato —
dfagegate_ok - Categoria — strettamente necessario (conformità legale di accesso)
- Dati — valore «1», durata configurabile, SameSite=Lax, Secure su HTTPS
Configurare in base al vostro mercato
Negozio CBD per il grande pubblico
- Modalità: Standard
- Tipo di verifica: Pulsante sì/no
- Età minima: 18
- Durata del cookie: 90 giorni
- URL di reindirizzamento: vuoto (solo messaggio di rifiuto)
Negozio di liquori / alcolici premium
- Modalità: Standard
- Tipo di verifica: Data di nascita (controllo più rigoroso)
- Età minima: 18 (o 21 per i mercati US)
- URL di reindirizzamento: qualsiasi pagina informativa ufficiale
Negozio di svapo / e-liquid con nicotina
- Modalità: Standard
- Tipo di verifica: Data di nascita (fortemente consigliato per la nicotina)
- Età minima: 18
- Registrare i rifiuti: Sì (utile in caso di controllo)
Armeria
- Modalità: Standard
- Tipo di verifica: Data di nascita (obbligatorio)
- Età minima: 18
- Bypass URL: aggiungere
/normativa,/licenza-di-caccia - Registrare i rifiuti: Sì
Negozio di materiale medico (dispositivi professionali)
- Modalità: Medicale
- Tipo di verifica: Dichiarazione di professione
- Elenco delle professioni: Medico, Farmacista, Fisioterapista, Osteopata (adattare al vostro catalogo)
- Numero di iscrizione all’albo obbligatorio: Sì
- Bypass clienti connessi: Sì (se validate già la professione alla registrazione)
Come funziona la verifica per data di nascita
A differenza di un semplice pulsante, la verifica per data di nascita esegue il calcolo lato server, non nel browser:
- Il visitatore inserisce giorno, mese e anno nella modale
- JavaScript invia questi valori al controller AJAX
DfagegateAjaxModuleFrontController - PHP valida la data con
checkdate()e calcola l’età tramiteDateTimeImmutable::diff() - Se l’età è inferiore alla soglia configurata, il server restituisce una risposta JSON con
success=false, denied=truee il messaggio di errore - La modale mostra il messaggio di rifiuto e reindirizza dopo 2 secondi
- Se l’età raggiunge la soglia, viene impostato il cookie
dfagegate_oke la modale si chiude
Perché lato server? Un controllo puramente JavaScript può essere aggirato tramite DevTools in meno di 10 secondi. Il calcolo lato server garantisce che un utente minorenne non possa accedere al sito, anche con conoscenze tecniche. È essenziale per superare un controllo delle autorità.
Notate che la data di nascita non viene mai memorizzata — viene usata per un solo calcolo e poi dimenticata. Solo la validazione binaria (accettato / rifiutato) viene conservata tramite il cookie.
Come funziona la modalità medicale
- La modale mostra un menu a tendina di professioni (configurabile) e opzionalmente un campo per il numero di iscrizione all’albo
- È presente una casella obbligatoria di dichiarazione sull’onore
- Il controller AJAX valida che sia stata selezionata una professione
- Se il numero è obbligatorio, il server valida il formato tramite un’espressione regolare che accetta da 9 a 11 cifre consecutive
- Nessuna memorizzazione: né la professione né il numero vengono conservati nel database — il cookie
dfagegate_okmaterializza solo il passaggio riuscito
Scelta progettuale — La regolamentazione richiede di materializzare la dichiarazione, non necessariamente una verifica in tempo reale contro un registro nazionale. Il nostro approccio è conformità minima vitale: chiediamo la dichiarazione, la validiamo formalmente, registriamo il rifiuto se attivato, ma non raccogliamo dati personali non necessari.
Multinegozio
Il modulo è 100% compatibile con il multinegozio. Tutte le impostazioni (modalità, tipo di verifica, testi multilingue, colori, regole di bypass) sono memorizzate per contesto negozio tramite id_shop_group e id_shop. Ciò significa che un unico PrestaShop può ospitare:
- Un negozio CBD FR in modalità standard a 18 anni con testi in francese
- Un negozio svapo UK in modalità standard a 18 anni con testi in inglese
- Un negozio materiale medico DE in modalità medicale con numero di iscrizione obbligatorio e testi in tedesco
Per configurare un sotto-negozio specifico:
- Nel selettore di contesto in cima al back-office, scegliete il sotto-negozio di destinazione
- Aprite la configurazione del modulo
- Modificate i valori — verranno salvati solo per quel negozio
Gli hook vengono registrati su tutti i negozi al momento dell’installazione tramite Shop::getCompleteListOfShopsID(), evitando la classica trappola del modulo che funziona solo sul negozio corrente.
Compatibilità con i temi personalizzati
Il modulo utilizza l’hook standard displayBeforeBodyClosingTag per iniettare la modale poco prima della chiusura del tag body. Questo hook dovrebbe essere universale su PrestaShop 1.7.5+.
Purtroppo, alcuni temi personalizzati non chiamano questo hook nel loro layout. Per questo caso, dfagegate include un fallback di iniezione JavaScript:
- PHP pre-renderizza l’HTML completo della modale e lo passa al JS tramite
Media::addJsDef - Al
DOMContentLoaded, lo script verifica se l’elemento con IDdfagegate-modalesiste nel DOM - Se sì, tutto bene — l’hook ha funzionato
- Se no, lo script inietta la modale da solo tramite
insertAdjacentHTML('beforeend', ...) - Un messaggio
console.infoconferma l’attivazione del fallback
Risultato pratico — Il modulo funziona su qualsiasi tema PrestaShop 1.7.5+, compresi i temi personalizzati incompleti, senza toccare il layout. Potete distribuirlo senza coordinarvi con la vostra agenzia di temi.
Diagnostica e debug
Una volta attivato, dfagegate aggiunge un commento HTML nel tag head di ogni pagina del front, nella forma «dfagegate v1.0.3 enabled=1 should_display=1».
Questo commento è il vostro primo punto di diagnostica. Consultate il codice sorgente di una pagina (Ctrl+U o Cmd+U) e cercate «dfagegate».
| Commento | Interpretazione |
|---|---|
| Nessun commento | L’hook displayHeader non è registrato — verificate che il modulo sia installato e attivo |
enabled=0 |
L’interruttore «Attiva il modulo» è su No nella scheda Generale |
enabled=1 should_display=0 |
Un bypass è attivo: il vostro IP è in whitelist, l’URL corrente corrisponde a un percorso escluso, o siete un cliente connesso con il bypass attivato |
enabled=1 should_display=1 |
Lato server è tutto ok. Se la modale non appare, controllate la console del browser |
La modale non appare ancora?
- Il commento di diagnostica è presente con
should_display=1? In caso contrario, correggete la configurazione - Aprite il negozio in navigazione privata. Il cookie
dfagegate_okpotrebbe essere stato impostato in una sessione precedente - Verificate il vostro IP nei bypass della scheda Comportamento
- Aprite la console del browser (F12). Cercate messaggi
[dfagegate] - Consultate i log di PrestaShop in Parametri avanzati → Log, filtrate per «dfagegate»
- Svuotate la cache di PrestaShop dopo ogni modifica alla configurazione: Parametri avanzati → Prestazioni → Svuota la cache
Reimpostare il cookie nel browser
- Aprite i DevTools (F12)
- Scheda Application (Chrome) o Storage (Firefox)
- Sezione Cookies → il vostro dominio
- Eliminate la riga
dfagegate_ok - Ricaricate la pagina
Conformità GDPR
Il cookie dfagegate_ok
- Tipo — strettamente necessario per adempiere a un obbligo legale di accesso
- Base giuridica — esente dal consenso preventivo (esistono esenzioni simili nel quadro ePrivacy europeo)
- Valore — binario (
1= confermato) - Durata — configurabile (90 giorni per impostazione predefinita), o sessione se impostata a 0
- Attributi —
SameSite=Lax,Secureautomatico su HTTPS,Path=/
In pratica — Non è necessario aggiungere questo cookie al vostro banner di consenso. Rientra nella stessa categoria del cookie di sessione di PrestaShop o del cookie CSRF: necessario per il funzionamento legale del sito, quindi esente.
I log di rifiuto
Se attivate Registrare i rifiuti, ogni rifiuto viene salvato nella tabella ps_dfagegate_log con:
id_shop— sotto-negozio interessatoreason— motivo del rifiuto (user_refusedodob_under_age)age— età dichiarata se applicabileprofession— professione dichiarata se applicabileip_hash— SHA-256 dell’IP, mai l’IP in chiarodate_add— marca temporale
L’hashing SHA-256 rende l’IP non reversibile permettendo al contempo la deduplicazione dei tentativi (lo stesso IP produce sempre lo stesso hash). È il compromesso raccomandato dalle autorità per la protezione dei dati per le statistiche di accesso.
I dati di verifica
- La data di nascita transita via AJAX per il calcolo ma non viene mai memorizzata
- Il numero di iscrizione all’albo viene validato lato server e poi dimenticato, mai memorizzato
- Solo la validazione binaria viene conservata, tramite il cookie
Struttura tecnica e integrazione
Hook utilizzati
displayHeader— inietta il commento di diagnosticaactionFrontControllerSetMedia— registra CSS e JS, passa la configurazione e l’HTML pre-renderizzato della modale al JSdisplayBeforeBodyClosingTag— renderizza la modale lato server (fallback JS se assente dal tema)
Endpoint AJAX
Il controller AJAX risponde a /module/dfagegate/ajax e accetta due azioni:
action=confirm— con parametri a seconda del tipo di verifica (nulla per sì/no, giorno/mese/anno per data di nascita, professione/numero per medicale)action=refuse— registra il rifiuto e restituisce l’URL di reindirizzamento
Le risposte sono in JSON. Una conferma restituisce success=true. Un rifiuto per età insufficiente restituisce success=false, denied=true e il messaggio di errore appropriato. Un errore di validazione restituisce success=false con il messaggio. Un rifiuto dell’utente restituisce success=true e redirect_url contenente l’URL di reindirizzamento configurato.
Schema del database
Viene creata una sola tabella: ps_dfagegate_log. Contiene le colonne id_log (chiave primaria auto-incrementale), id_shop, reason (varchar 64), age (nullable), profession (varchar 128 nullable), ip_hash (char 64 per lo SHA-256) e date_add (datetime). Due indici secondari ottimizzano le query di reporting: idx_shop_date su (id_shop, date_add) e idx_reason su reason.
Disinstallazione
Disattivare senza rimuovere
Moduli → Moduli installati → DataFirefly Age Gate → Disattiva. La configurazione e la tabella dei log vengono conservate. Potete riattivare in qualsiasi momento senza riconfigurare.
Disinstallazione completa
Moduli → Moduli installati → DataFirefly Age Gate → Disinstalla. Questa azione:
- Elimina la tabella
ps_dfagegate_log - Rimuove tutte le voci di configurazione (18 chiavi scalari + 6 chiavi multilingue)
- Deregistra gli hook
- Rimuove il modulo dal sistema
Attenzione — La disinstallazione è irreversibile. Se volete conservare la cronologia dei log di rifiuto (ad esempio per un audit sulla protezione dei dati), esportate prima la tabella.
Supporto e aggiornamenti
Ogni licenza include:
- 12 mesi di aggiornamenti — compatibilità PrestaShop, correzioni, miglioramenti
- Supporto tecnico via email — risposta entro 24 ore lavorative, FR/EN
- Rimborso di 30 giorni senza domande
- Codice sorgente non criptato — libertà di adattare il modulo alle vostre esigenze specifiche
Per qualsiasi domanda tecnica o segnalazione di bug, contattateci dal vostro account DataFirefly. Indicate la versione di PrestaShop, la versione di PHP, la versione del modulo (visibile in cima alla schermata di configurazione) e, se possibile, il commento di diagnostica presente nel tag head del vostro negozio.