Centro de Notificaciones para Shopware 6 — Instalación, configuración y documentación técnica
Instalar, configurar y ampliar el Centro de Notificaciones: campana en la cabecera, notificaciones automáticas de productos y promociones, programación, segmentación y KPI para Shopware 6.5, 6.6 y 6.7.
Presentación
El Centro de Notificaciones DataFirefly añade una campana de notificaciones a la cabecera del storefront de Shopware 6, justo al lado del carrito. Una insignia roja indica el número de mensajes no leídos (se muestra «9+» a partir de nueve) y un panel desplegable presenta sus anuncios, nuevos productos y códigos promocionales.
El plugin gestiona tres tipos de notificaciones: anuncios redactados manualmente, notificaciones de producto creadas automáticamente con cada nuevo producto (imagen y enlace resueltos en tiempo real) y códigos promocionales con un botón «Copiar» de un solo clic. Cada notificación puede programarse, segmentarse por grupo de clientes y canal de ventas, priorizarse y medirse mediante KPI de vistas y clics.
Un solo plugin, un solo ZIP, compatible con Shopware 6.5, 6.6 y 6.7 — incluida la administración basada en Vite de la 6.7, entregada precompilada sin paso de compilación.
Requisitos
- Shopware 6.5, 6.6 o 6.7 (
shopware/core~6.5 || ~6.6 || ~6.7) - Acceso a la línea de comandos para vaciar la caché e instalar los assets
- Sin dependencias externas, sin servicios de terceros
Instalación
- En la administración, vaya a Extensiones → Mis extensiones → Subir extensión y seleccione el ZIP.
- Instale y luego active el plugin.
- Vacíe la caché e instale los assets:
bin/console plugin:refresh
bin/console plugin:install --activate DffNotificationCenter
bin/console assets:install
bin/console cache:clear
Tras instalar o actualizar, vacíe también la caché de su navegador (Ctrl+F5) en la página de administración para recargar el módulo.
Shopware 6.7 (administración Vite)
El módulo de administración se entrega precompilado con un archivo Vite entrypoints.json. Se carga tal cual en 6.5, 6.6 y 6.7 sin paso de compilación. Tras cada actualización, simplemente ejecute:
bin/console assets:install
bin/console cache:clear
Configuración
Vaya a Extensiones → Mis extensiones → Centro de Notificaciones → Configurar. Los ajustes se pueden definir por canal de ventas.
Campana de notificaciones
- Activar la campana (por defecto: sí): muestra u oculta la campana en el storefront.
- Número máximo de notificaciones mostradas (por defecto: 10): limitado entre 1 y 50 en el servidor.
- Intervalo de actualización en segundo plano (por defecto: 60 s): intervalo de sondeo,
0para desactivar. - Sonido (por defecto: no): reproduce un sonido al recibir una notificación.
- Animación (por defecto: sí): anima la campana cuando hay notificaciones no leídas.
Notificaciones automáticas de productos
- Crear una notificación por cada nuevo producto (por defecto: sí).
- Solo para productos activos (por defecto: sí).
- Caducidad automática (por defecto: 30 días,
0= nunca): a partir de ahí, la notificación de producto deja de mostrarse.
Notificaciones automáticas de promociones
- Crear una notificación al crear una promoción con código (por defecto: no, debe activarse explícitamente).
La notificación de promoción se crea en cuanto una promoción activa tiene un código global. Por diseño, los códigos individuales nunca se difunden.
Gestionar las notificaciones en la administración
El módulo de gestión se encuentra en Marketing → Centro de Notificaciones. Allí crea, programa, segmenta y prioriza sus anuncios, y consulta los KPI de vistas/clics.
Hay tres tipos disponibles:
- Anuncio (
manual): título, mensaje, etiqueta de botón y enlace libres. - Producto (
product): vinculada a un producto; la imagen de portada y el enlace a la ficha se resuelven en tiempo real en cada renderizado — nunca un enlace roto. - Código promocional (
promo): muestra un código con un botón «Copiar» del lado del cliente.
Programación, segmentación y prioridad
- Programación: fechas
validFrom/validUntil; una notificación fuera de su ventana no se difunde. - Segmentación por grupo de clientes: limita la difusión a un grupo de clientes dado (vacío = todos).
- Segmentación por canal de ventas: limita a un canal (vacío = todos), útil en configuraciones multitienda.
- Prioridad: entero; las prioridades más altas se muestran primero, luego se ordenan por fecha de creación descendente.
Comportamiento del lado del cliente
La campana se inserta en la cabecera mediante una extensión Twig (sw_extends). Si su tema personaliza mucho la cabecera, un fallback JavaScript inserta automáticamente la campana junto al carrito.
El panel recupera las notificaciones mediante una llamada AJAX. La insignia muestra el recuento de no leídas, con sonido y animación opcionales y una actualización en segundo plano configurable. La interfaz es accesible: atributos ARIA, navegación por teclado y disposición en bottom-sheet en móvil.
Estado de lectura: para los clientes conectados se almacena en el servidor (tabla dff_notification_read) y, por tanto, se sincroniza entre dispositivos. Para los invitados permanece en el localStorage del navegador — no se recopila ningún dato personal.
Arquitectura técnica
El plugin sigue las convenciones de Shopware: entidades declaradas mediante la Data Abstraction Layer (DAL), un controlador de storefront que devuelve JSON, subscribers de eventos y una migración SQL. Sin overrides — las plantillas se extienden mediante sw_extends y el código es 100 % nativo.
Entidades y Data Abstraction Layer
La entidad principal dff_notification (NotificationDefinition) lleva los campos: type, active, priority, validFrom, validUntil, customerGroupId, salesChannelId, productId (+ productVersionId), promotionId, promoCode, views y clicks. Los campos traducibles title, message, buttonLabel y linkUrl los lleva la entidad de traducción dff_notification_translation.
Asociaciones: ManyToOne hacia customer_group, sales_channel, product y promotion; OneToMany hacia dff_notification_read (estado de lectura por cliente). Las definiciones se registran con la etiqueta shopware.entity.definition y se exponen a la API (ApiAware).
Esquema de base de datos
La migración Migration1781049600NotificationCenter crea tres tablas:
dff_notification: la notificación, con índices enactivey en(product_id, product_version_id). Claves foráneas haciacustomer_groupysales_channel(ON DELETE SET NULL) y haciaproduct(ON DELETE CASCADE).dff_notification_translation: traducciones por idioma (title,message,button_label,link_url).dff_notification_read: pares notificación/cliente, con un índice único en(dff_notification_id, customer_id)para evitar lecturas duplicadas.
Rutas AJAX del storefront
Las rutas se declaran en XML (Resources/config/routes.xml) para mantener la compatibilidad de Shopware 6.5 a 6.7 (Symfony 6.x y 7.x). El controlador extiende AbstractController — no StorefrontController — porque solo devuelve JSON y setTwig() se eliminó en 6.7.
GET /dff-nc/list→list(): devuelve las notificaciones difundibles e incrementa sus vistas.POST /dff-nc/read→markRead(): marca como leído en el servidor (clientes conectados); para los invitados, la respuesta indica almacenamientoclient.POST /dff-nc/click/{id}→click(): incrementa el contador de clics.
Lógica de difusión (controlador list)
La consulta DAL filtra las notificaciones con active = true, dentro de su ventana de validez (validFrom ≤ ahora ≤ validUntil, límites nulos admitidos), que coinciden con el canal de ventas actual (o nulo) y el grupo de clientes actual (o nulo), ordenadas por prioridad y luego por fecha de creación descendente. Los productos vinculados se resuelven después dinámicamente (asociación cover.media): una notificación de producto cuyo producto se ha eliminado o no está disponible en el canal se oculta silenciosamente. Las vistas de las notificaciones realmente mostradas se incrementan en una sola consulta.
Notificaciones automáticas (subscribers)
ProductSubscriber escucha product.written. En cada insert de producto en la versión live (se omiten las variantes con parentId), y si la opción está activada, crea una notificación de tipo product — respetando el filtro «solo productos activos», la vida útil configurada (validUntil) y un control anti-duplicados por producto.
PromotionSubscriber escucha promotion.written. Como la administración crea primero la promoción y luego establece su código y su indicador de activación mediante actualizaciones sucesivas, reacciona tanto a inserts como a updates. Solo se crea una notificación promo si la promoción está activa y tiene un código global, arrastrando las fechas validFrom/validUntil de la promoción con un control anti-duplicados por promoción.
Internacionalización
Se entregan tres idiomas para storefront y administración: francés, inglés y alemán (snippets fr-FR, en-GB, de-DE). Los títulos y mensajes por defecto de las notificaciones de producto y promoción se generan mediante el servicio de traducción (claves dffNc.*).
Privacidad (RGPD)
El plugin no recopila ningún dato personal. El estado de lectura de los invitados permanece en su navegador (localStorage); el de los clientes conectados se almacena en el servidor y se vincula a su cuenta. Los contadores de vistas y clics se agregan a nivel de notificación, sin perfilado individual.
Desinstalación
Al desinstalar, las tablas dff_notification_read, dff_notification_translation y dff_notification se eliminan — salvo que la opción «conservar los datos del usuario» esté marcada, en cuyo caso se dejan intactas.
Resolución de problemas
- La campana no aparece: compruebe que la campana esté activada en la configuración, vuelva a ejecutar
assets:installycache:clear, y luego vacíe la caché del navegador. El fallback JS la inserta junto al carrito si el tema sobrescribe la cabecera. - No se crea ninguna notificación de producto: la opción debe estar activada, el producto debe ser un producto raíz (no una variante) y, si el filtro está activo, marcado como activo.
- No se crea ninguna notificación de promoción: la opción está desactivada por defecto; la promoción debe estar activa y tener un código global (los códigos individuales no se difunden).
- El módulo de administración no carga en 6.7: vuelva a ejecutar
assets:instally luegocache:cleary fuerce una recarga del navegador (Ctrl+F5).