Hola @raquel96, @ruben_online65 y @sergio94. Vuestro análisis es muy acertado. La implementación de la Ley de Cookies, si se quiere hacer correctamente bloqueando scripts de terceros hasta el consentimiento, va mucho más allá de un simple banner o de añadir un JS en un hook genérico.
El problema con la inyección directa o los overrides de FrontController es que son frágiles y no ofrecen un control granular sobre todos los scripts que otros módulos y el propio tema cargan. PrestaShop, por diseño, no tiene un sistema nativo para esto. La forma correcta de manejar esto a nivel de código implicaría:
- Identificar todos los scripts externos (analytics, píxeles, embeds).
- Modificar la forma en que se añaden al DOM (ya sea a través de los Assets de Symfony en el Back Office o en el frontend con Smarty).
- Un mecanismo JavaScript robusto para desactivar o retrasar la carga de estos scripts hasta que se dé el consentimiento.
Intentar esto manualmente con overrides o hooks puede generar conflictos con el CCC de PrestaShop, con el orden de carga de los assets, y es muy difícil de mantener con cada actualización.
Si bien se podría intentar un enfoque más avanzado modificando el Theme.php o inyectando un EventListener en Symfony (para PS 8.x) que reescriba el contenido HTML antes de enviarlo, es una tarea compleja y propensa a errores. Un snippet para un control más sofisticado, aunque aún parcial, podría ser interceptar el punto donde se añaden los assets, pero esto requiere una clase override o un módulo más complejo:
// En un módulo, usando hookActionFrontControllerSetMedia para intentar añadir lógica
public function hookActionFrontControllerSetMedia($params)
{
// Esto es solo un ejemplo de cómo podrías intentar controlar assets,
// pero no bloquea los scripts ya renderizados por otros módulos.
// Necesitarías JS avanzado para reescribir/bloquear el DOM.
if ($this->context->controller instanceof FrontController) {
$this->context->controller->registerJavascript(
'module-mycookiemodule-consent',
'modules/' . $this->name . '/views/js/cookie_consent_manager.js',
['position' => 'head', 'priority' => 10, 'inline' => false, 'attribute' => 'defer']
);
// El script cookie_consent_manager.js debería encargarse de escanear y bloquear
// otros scripts hasta el consentimiento.
}
}
Este enfoque, aunque más limpio para registrar el JS, todavía te deja con la tarea de escribir el cookie_consent_manager.js para que identifique y bloquee correctamente todos los scripts.
Para una solución verdaderamente robusta, mantenible y que cumpla con la normativa sin dolores de cabeza, mi recomendación es utilizar un módulo dedicado. Estos módulos están diseñados específicamente para gestionar el consentimiento de cookies, integrar con las principales herramientas de analítica y bloquear scripts de forma efectiva. Te ahorrarán muchas horas de desarrollo y problemas de compatibilidad futuros.
Puedes encontrar una solución para ley de cookies que gestiona todo esto de forma profesional y compatible con PrestaShop 8.2.6.