Verificación de Edad PrestaShop – Modal Bloqueante para CBD, Alcohol, Vapeo y Profesionales Sanitarios
Documentación completa del módulo dfagegate: instalación, configuración de modos (estándar CBD/alcohol/vapeo/armería y médico), personalización multilingüe, cumplimiento RGPD y diagnóstico.
El módulo dfagegate añade una modal de verificación de edad bloqueante a su tienda PrestaShop 8 o 9. Cubre dos mercados distintos: el modo estándar para productos regulados por edad (CBD, alcohol, vapeo, armería, mecheros, productos 18+), y el modo médico para dispositivos médicos reservados a profesionales sanitarios (en Francia, en el sentido del artículo L5122-9 del Código de Salud Pública).
Compatibilidad — PrestaShop 1.7.7+, 8.x y 9.0. PHP 7.4 mínimo, 8.1+ recomendado. Multitienda y multilingüe (FR/EN/ES/DE precargados en la instalación).
Instalación
La instalación sigue el flujo estándar de PrestaShop. Tras la compra en DataFirefly, recibirá un archivo ZIP dfagegate-X.Y.Z.zip.
Desde el back-office (recomendado)
- Inicie sesión en su back-office PrestaShop
- Vaya a Módulos → Catálogo de módulos
- Haga clic en Subir un módulo arriba a la derecha
- Seleccione el ZIP
dfagegate-X.Y.Z.zip - Una vez subido, haga clic en Instalar
Vía FTP
- Descomprima el archivo localmente
- Suba la carpeta
dfagegate/al directoriomodules/de su PrestaShop - Vaya a Módulos → Catálogo de módulos
- Busque «DataFirefly Age Gate» y haga clic en Instalar
Importante — Tras la instalación, el módulo está desactivado por defecto. Es intencional: le permite configurar los textos y el modo antes de bloquear su tienda. Vaya a la configuración del módulo y active el interruptor en la pestaña General una vez todo esté configurado.
Configuración inicial
Acceda a la configuración: Módulos → Módulos instalados → DataFirefly Age Gate → Configurar.
La configuración se organiza en 6 pestañas:
- General — activación, modo, tipo de verificación, edad mínima
- Contenido — textos multilingües (título, mensaje, botones, avisos legales)
- Apariencia — logo, colores, desenfoque de fondo
- Comportamiento — cookie, redirección, reglas de bypass
- Modo médico — profesiones y número de colegiado (solo aplica en modo médico)
- Registros y RGPD — registro y diagnóstico
Pestaña General
- Activar el módulo — interruptor Sí/No, controla la visualización global de la modal
- Modo — Estándar (CBD, alcohol, vapeo, armería) o Médico (profesionales sanitarios)
- Tipo de verificación — Botón sí/no, Fecha de nacimiento, o Declaración de profesión
- Edad mínima — 18 por defecto, 21 en algunos mercados
¿Qué tipo de verificación elegir? El botón sí/no es adecuado para la mayoría de los casos (CBD, alcohol general, vapeo): rápido, baja fricción, disuasión suficiente para una inspección regulatoria. La fecha de nacimiento es más estricta y se recomienda para armerías o líquidos con nicotina. La declaración de profesión está reservada al modo médico.
Pestaña Contenido
Cada idioma activado en su PrestaShop dispone de su propio bloque de textos. Los valores por defecto vienen precargados en FR, EN, ES y DE. Para cada idioma puede configurar:
- Título — se muestra en grande en la parte superior de la modal (por defecto: «Verificación de edad»)
- Mensaje — texto explicativo principal, los saltos de línea se conservan
- Botón confirmar — etiqueta del botón positivo (por defecto: «Tengo 18 años o más»)
- Botón rechazar — etiqueta del botón negativo
- Aviso legal — texto al pie de la modal (p. ej. «El consumo abusivo de alcohol es peligroso para la salud.»)
- Mensaje de rechazo — pantalla mostrada cuando el usuario rechaza, antes de la redirección
HTML — El contenido se sanea al guardar (solo texto plano). Los saltos de línea se convierten en etiquetas de salto al renderizar mediante un filtro nl2br automático.
Pestaña Apariencia
- Logo — PNG, JPG, SVG o WEBP, 2 MB máx., mostrado en la parte superior de la modal
- Color de fondo — color de la tarjeta principal (blanco por defecto)
- Color primario — título y botón principal (negro #111111 por defecto)
- Color del texto — cuerpo del mensaje
- Color del overlay — velo detrás de la modal, acepta formatos CSS
rgba()y hex (por defecto:rgba(15,15,20,0.85)) - Desenfoque de fondo — efecto moderno, funciona en todos los navegadores actuales
Pestaña Comportamiento
- Duración de la cookie — en días (90 por defecto). Ponga
0para una cookie de sesión (eliminada al cerrar el navegador) - URL de redirección al rechazar — deje vacío para mostrar solo el mensaje de rechazo, o indique una URL externa
- Bypass de IPs — lista de IPs (una por línea) para las que la modal nunca se muestra. Ideal para usted y su equipo durante las pruebas
- Bypass de URLs — rutas parciales excluidas. Precargado con
/legal,/contacty otras páginas legales - Bypass de clientes conectados — si se activa, los clientes ya autenticados nunca ven la modal
Pestaña Modo médico
Esta pestaña solo aplica cuando el modo es Médico y el tipo de verificación es Declaración de profesión.
- Lista de profesiones — una por línea. Por defecto: Médico, Farmacéutico, Enfermero/a, Fisioterapeuta, Dentista, Veterinario, Otro profesional sanitario. Totalmente personalizable
- Número de colegiado obligatorio — si se activa, aparece un campo en la modal. Validación por regex que acepta de 9 a 11 dígitos. El número no se almacena, solo se valida en el servidor
Cumplimiento legal — El modo médico materializa una declaración jurada en el espíritu del artículo francés L5122-9 del Código de Salud Pública, que reserva la publicidad de ciertos dispositivos médicos a los profesionales sanitarios autorizados. Este módulo no sustituye una revisión jurídica de su catálogo por un abogado especializado. Consulte a su asesor para validar su configuración y verificar las normas equivalentes en su jurisdicción.
Pestaña Registros y RGPD
- Registrar los rechazos — guarda cada rechazo en la tabla
ps_dfagegate_logcon IP hasheada SHA-256 (nunca en claro), fecha, motivo
Esta pestaña también muestra un resumen RGPD:
- Cookie depositada —
dfagegate_ok - Categoría — estrictamente necesaria (cumplimiento legal de acceso)
- Datos — valor «1», duración configurable, SameSite=Lax, Secure en HTTPS
Configurar según su mercado
Tienda CBD general
- Modo: Estándar
- Tipo de verificación: Botón sí/no
- Edad mínima: 18
- Duración de la cookie: 90 días
- URL de redirección: vacía (solo mensaje de rechazo)
Tienda de licores / alcohol premium
- Modo: Estándar
- Tipo de verificación: Fecha de nacimiento (control más estricto)
- Edad mínima: 18 (o 21 en mercados US)
- URL de redirección: cualquier página de información oficial
Tienda de vapeo / e-líquidos con nicotina
- Modo: Estándar
- Tipo de verificación: Fecha de nacimiento (muy recomendado para nicotina)
- Edad mínima: 18
- Registrar rechazos: Sí (útil en caso de inspección)
Armería
- Modo: Estándar
- Tipo de verificación: Fecha de nacimiento (obligatorio)
- Edad mínima: 18
- Bypass de URLs: añadir
/normativa,/licencia-de-caza - Registrar rechazos: Sí
Tienda de material médico (dispositivos profesionales)
- Modo: Médico
- Tipo de verificación: Declaración de profesión
- Lista de profesiones: Médico, Farmacéutico, Fisioterapeuta, Osteópata (adaptar a su catálogo)
- Número de colegiado obligatorio: Sí
- Bypass de clientes conectados: Sí (si ya valida la profesión al registrarse)
Cómo funciona la verificación por fecha de nacimiento
A diferencia de un simple botón, la verificación por fecha de nacimiento realiza el cálculo en el servidor, no en el navegador:
- El visitante introduce día, mes y año en la modal
- JavaScript envía estos valores al controlador AJAX
DfagegateAjaxModuleFrontController - PHP valida la fecha con
checkdate()y calcula la edad medianteDateTimeImmutable::diff() - Si la edad es inferior al umbral configurado, el servidor devuelve una respuesta JSON con
success=false, denied=truey el mensaje de error - La modal muestra el mensaje de rechazo y redirige tras 2 segundos
- Si la edad alcanza el umbral, se deposita la cookie
dfagegate_oky la modal se cierra
¿Por qué en el servidor? Un control puramente JavaScript puede eludirse mediante DevTools en menos de 10 segundos. El cálculo en servidor garantiza que un usuario menor de edad no pueda acceder al sitio, incluso con conocimientos técnicos. Es esencial para superar una inspección regulatoria.
Tenga en cuenta que la fecha de nacimiento nunca se almacena — se usa para un solo cálculo y luego se olvida. Solo se retiene la validación binaria (aceptado / rechazado) a través de la cookie.
Cómo funciona el modo médico
- La modal muestra un desplegable de profesiones (configurable) y opcionalmente un campo de número de colegiado
- Hay una casilla obligatoria de declaración jurada
- El controlador AJAX valida que se ha seleccionado una profesión
- Si el número de colegiado es obligatorio, el servidor valida el formato mediante una expresión regular que acepta de 9 a 11 dígitos consecutivos
- Sin almacenamiento: ni la profesión ni el número se conservan en la base de datos — la cookie
dfagegate_oksolo materializa el paso exitoso
Elección de diseño — La regulación exige materializar la declaración, no necesariamente una verificación en tiempo real contra un registro nacional. Nuestro enfoque es cumplimiento mínimo viable: pedimos la declaración, la validamos formalmente, registramos el rechazo si está activado, pero no recopilamos datos personales innecesarios.
Multitienda
El módulo es 100% compatible con multitienda. Todas las configuraciones (modo, tipo de verificación, textos multilingües, colores, reglas de bypass) se almacenan por contexto de tienda mediante id_shop_group e id_shop. Esto significa que un mismo PrestaShop puede alojar:
- Una tienda CBD FR en modo estándar a 18 años con textos en francés
- Una tienda vapeo UK en modo estándar a 18 años con textos en inglés
- Una tienda material médico DE en modo médico con número de colegiado obligatorio y textos en alemán
Para configurar una subtienda específica:
- En el selector de contexto en la parte superior del back-office, elija la subtienda objetivo
- Abra la configuración del módulo
- Modifique los valores — se persistirán solo para esa tienda
Los hooks se registran en todas las tiendas en el momento de la instalación mediante Shop::getCompleteListOfShopsID(), evitando el problema clásico del módulo que solo funciona en la tienda actual.
Compatibilidad con temas personalizados
El módulo utiliza el hook estándar displayBeforeBodyClosingTag para inyectar la modal justo antes del cierre de la etiqueta body. Este hook debería ser universal en PrestaShop 1.7.5+.
Desafortunadamente, algunos temas personalizados no llaman a este hook en su layout. Para este caso, dfagegate incluye un fallback de inyección JavaScript:
- PHP pre-renderiza el HTML completo de la modal y lo pasa al JS mediante
Media::addJsDef - En el
DOMContentLoaded, el script comprueba si el elemento con IDdfagegate-modalexiste en el DOM - Si existe, todo bien — el hook funcionó
- Si no, el script inyecta la modal por sí mismo mediante
insertAdjacentHTML('beforeend', ...) - Un mensaje
console.infoconfirma la activación del fallback
Resultado práctico — El módulo funciona en cualquier tema PrestaShop 1.7.5+, incluidos los temas personalizados incompletos, sin tocar el layout. Puede desplegarlo sin coordinarse con su agencia de temas.
Diagnóstico y depuración
Una vez activado, dfagegate añade un comentario HTML en la etiqueta head de cada página del front, con la forma «dfagegate v1.0.3 enabled=1 should_display=1».
Este comentario es su primer punto de diagnóstico. Consulte el código fuente de una página (Ctrl+U o Cmd+U) y busque «dfagegate».
| Comentario | Interpretación |
|---|---|
| Sin comentario | El hook displayHeader no está registrado — verifique que el módulo esté instalado y activo |
enabled=0 |
El interruptor «Activar el módulo» está en No en la pestaña General |
enabled=1 should_display=0 |
Un bypass está activo: su IP está en la lista blanca, la URL actual coincide con una ruta excluida, o es un cliente conectado con el bypass activado |
enabled=1 should_display=1 |
Todo correcto en el servidor. Si la modal no aparece, revise la consola del navegador |
¿La modal sigue sin aparecer?
- ¿Está presente el comentario de diagnóstico con
should_display=1? Si no, corrija la configuración - Abra la tienda en navegación privada. La cookie
dfagegate_okpuede haberse depositado en una sesión anterior - Verifique su IP en los bypass de la pestaña Comportamiento
- Abra la consola del navegador (F12). Busque mensajes
[dfagegate] - Consulte los registros de PrestaShop en Parámetros avanzados → Registros, filtre por «dfagegate»
- Vacíe la caché de PrestaShop tras cada cambio de configuración: Parámetros avanzados → Rendimiento → Vaciar la caché
Restablecer la cookie en su navegador
- Abra las DevTools (F12)
- Pestaña Application (Chrome) o Storage (Firefox)
- Sección Cookies → su dominio
- Elimine la fila
dfagegate_ok - Recargue la página
Cumplimiento RGPD
La cookie dfagegate_ok
- Tipo — estrictamente necesaria para cumplir una obligación legal de acceso
- Base legal — exenta de consentimiento previo (existen exenciones similares en el marco ePrivacy europeo)
- Valor — binario (
1= confirmado) - Duración — configurable (90 días por defecto), o sesión si se pone 0
- Atributos —
SameSite=Lax,Secureautomático en HTTPS,Path=/
En la práctica — No necesita añadir esta cookie a su banner de consentimiento. Entra en la misma categoría que la cookie de sesión de PrestaShop o la cookie CSRF: necesaria para el funcionamiento legal del sitio, por tanto exenta.
Los registros de rechazo
Si activa Registrar los rechazos, cada rechazo se guarda en la tabla ps_dfagegate_log con:
id_shop— subtienda afectadareason— motivo del rechazo (user_refusedodob_under_age)age— edad declarada si aplicaprofession— profesión declarada si aplicaip_hash— SHA-256 de la IP, nunca la IP en clarodate_add— marca de tiempo
El hash SHA-256 hace la IP no reversible a la vez que permite deduplicar los intentos (una misma IP siempre produce el mismo hash). Es el compromiso recomendado por las autoridades de protección de datos para las estadísticas de acceso.
Los datos de verificación
- La fecha de nacimiento transita por AJAX para el cálculo pero nunca se almacena
- El número de colegiado se valida en el servidor y luego se olvida, nunca se almacena
- Solo se conserva la validación binaria, a través de la cookie
Estructura técnica e integración
Hooks utilizados
displayHeader— inyecta el comentario de diagnósticoactionFrontControllerSetMedia— registra CSS y JS, pasa la configuración y el HTML pre-renderizado de la modal al JSdisplayBeforeBodyClosingTag— renderiza la modal en el servidor (fallback JS si el tema no lo incluye)
Puntos de entrada AJAX
El controlador AJAX responde en /module/dfagegate/ajax y acepta dos acciones:
action=confirm— con parámetros según el tipo de verificación (nada para sí/no, día/mes/año para fecha de nacimiento, profesión/número para médico)action=refuse— registra el rechazo y devuelve la URL de redirección
Las respuestas son JSON. Una confirmación devuelve success=true. Un rechazo por edad insuficiente devuelve success=false, denied=true y el mensaje de error correspondiente. Un error de validación devuelve success=false con el mensaje. Un rechazo del usuario devuelve success=true y redirect_url con la URL de redirección configurada.
Esquema de base de datos
Se crea una sola tabla: ps_dfagegate_log. Contiene las columnas id_log (clave primaria autoincremental), id_shop, reason (varchar 64), age (nullable), profession (varchar 128 nullable), ip_hash (char 64 para el SHA-256) y date_add (datetime). Dos índices secundarios optimizan las consultas de informes: idx_shop_date sobre (id_shop, date_add) e idx_reason sobre reason.
Desinstalación
Desactivar sin eliminar
Módulos → Módulos instalados → DataFirefly Age Gate → Desactivar. La configuración y la tabla de registros se conservan. Puede reactivarlo en cualquier momento sin reconfigurar.
Desinstalación completa
Módulos → Módulos instalados → DataFirefly Age Gate → Desinstalar. Esta acción:
- Elimina la tabla
ps_dfagegate_log - Elimina todas las entradas de configuración (18 claves escalares + 6 claves multilingües)
- Desregistra los hooks
- Retira el módulo del sistema
Atención — La desinstalación es irreversible. Si desea conservar el historial de registros de rechazo (por ejemplo para una auditoría de protección de datos), exporte la tabla antes.
Soporte y actualizaciones
Cada licencia incluye:
- 12 meses de actualizaciones — compatibilidad PrestaShop, correcciones, mejoras
- Soporte técnico por email — respuesta en 24h laborables, FR/EN
- Reembolso de 30 días sin preguntas
- Código fuente sin cifrar — libre de adaptar el módulo a sus necesidades específicas
Para cualquier consulta técnica o informe de error, contáctenos desde su cuenta DataFirefly. Indique su versión de PrestaShop, versión de PHP, versión del módulo (visible en la parte superior de la pantalla de configuración) y, si es posible, el comentario de diagnóstico presente en la etiqueta head de su tienda.