PS PrestaShop Principiante

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.

Aggiornato Versione del modulo 1.0.3

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)

  1. Accedete al vostro back-office PrestaShop
  2. Andate su Moduli → Catalogo moduli
  3. Cliccate su Carica un modulo in alto a destra
  4. Selezionate lo ZIP dfagegate-X.Y.Z.zip
  5. Una volta caricato, cliccate su Installa

Via FTP

  1. Decomprimete l’archivio localmente
  2. Caricate la cartella dfagegate/ nella directory modules/ del vostro PrestaShop
  3. Andate su Moduli → Catalogo moduli
  4. 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 verificaPulsante 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 0 per 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, /contact e 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_log con IP hashato SHA-256 (mai in chiaro), data, motivo

Questa scheda mostra anche un riepilogo GDPR:

  • Cookie impostatodfagegate_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: (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:

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:
  • Bypass clienti connessi: (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:

  1. Il visitatore inserisce giorno, mese e anno nella modale
  2. JavaScript invia questi valori al controller AJAX DfagegateAjaxModuleFrontController
  3. PHP valida la data con checkdate() e calcola l’età tramite DateTimeImmutable::diff()
  4. Se l’età è inferiore alla soglia configurata, il server restituisce una risposta JSON con success=false, denied=true e il messaggio di errore
  5. La modale mostra il messaggio di rifiuto e reindirizza dopo 2 secondi
  6. Se l’età raggiunge la soglia, viene impostato il cookie dfagegate_ok e 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

  1. La modale mostra un menu a tendina di professioni (configurabile) e opzionalmente un campo per il numero di iscrizione all’albo
  2. È presente una casella obbligatoria di dichiarazione sull’onore
  3. Il controller AJAX valida che sia stata selezionata una professione
  4. Se il numero è obbligatorio, il server valida il formato tramite un’espressione regolare che accetta da 9 a 11 cifre consecutive
  5. Nessuna memorizzazione: né la professione né il numero vengono conservati nel database — il cookie dfagegate_ok materializza 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:

  1. Nel selettore di contesto in cima al back-office, scegliete il sotto-negozio di destinazione
  2. Aprite la configurazione del modulo
  3. 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:

  1. PHP pre-renderizza l’HTML completo della modale e lo passa al JS tramite Media::addJsDef
  2. Al DOMContentLoaded, lo script verifica se l’elemento con ID dfagegate-modal esiste nel DOM
  3. Se sì, tutto bene — l’hook ha funzionato
  4. Se no, lo script inietta la modale da solo tramite insertAdjacentHTML('beforeend', ...)
  5. Un messaggio console.info conferma 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?

  1. Il commento di diagnostica è presente con should_display=1? In caso contrario, correggete la configurazione
  2. Aprite il negozio in navigazione privata. Il cookie dfagegate_ok potrebbe essere stato impostato in una sessione precedente
  3. Verificate il vostro IP nei bypass della scheda Comportamento
  4. Aprite la console del browser (F12). Cercate messaggi [dfagegate]
  5. Consultate i log di PrestaShop in Parametri avanzati → Log, filtrate per «dfagegate»
  6. Svuotate la cache di PrestaShop dopo ogni modifica alla configurazione: Parametri avanzati → Prestazioni → Svuota la cache
  1. Aprite i DevTools (F12)
  2. Scheda Application (Chrome) o Storage (Firefox)
  3. Sezione Cookies → il vostro dominio
  4. Eliminate la riga dfagegate_ok
  5. Ricaricate la pagina

Conformità GDPR

  • 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
  • AttributiSameSite=Lax, Secure automatico su HTTPS, Path=/

In praticaNon è 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 interessato
  • reason — motivo del rifiuto (user_refused o dob_under_age)
  • age — età dichiarata se applicabile
  • profession — professione dichiarata se applicabile
  • ip_hashSHA-256 dell’IP, mai l’IP in chiaro
  • date_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 diagnostica
  • actionFrontControllerSetMedia — registra CSS e JS, passa la configurazione e l’HTML pre-renderizzato della modale al JS
  • displayBeforeBodyClosingTag — 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.

Questa pagina ti è stata utile?

Ancora bloccato? Contatta l'assistenza