No description
  • PHP 51%
  • JavaScript 25.8%
  • Twig 22.2%
  • SCSS 0.7%
  • CSS 0.3%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Christian Säum c6e46ad8ac
All checks were successful
CI / cs-check (push) Successful in 21s
CI / phpstan (push) Successful in 38s
CI / build-zip (push) Has been skipped
Merge pull request 'chore(license): GPL-3.0-or-later + Copyright-Hinweis' (#1) from chore/add-license into main
2026-09-02 19:46:56 +00:00
.forgejo/workflows ci: remove Codeberg mirror job 2026-08-29 10:42:53 +02:00
.idea chore(idea): PHPStorm Laravel-Idea-Konfiguration tracken 2026-06-12 22:00:06 +02:00
src fix(data): repair broken German strings in default-cookies.json (v1.2.8) 2026-08-29 12:12:58 +02:00
tests übernahme in GitLab 2026-05-02 21:38:31 +02:00
.gitattributes Tests hinzugefügt 2026-05-05 20:28:09 +02:00
.gitignore übernahme in GitLab 2026-05-02 21:38:31 +02:00
.php-cs-fixer.dist.php style(cs): PSR-12-Normalisierung + php-cs-fixer-Konfiguration 2026-06-13 00:39:35 +02:00
AGENTS.md docs: korrigiere Projektregeln-Pfade und Plugin-Metadaten 2026-06-12 20:04:33 +02:00
CICD-Actions.md docs: korrigiere Projektregeln-Pfade und Plugin-Metadaten 2026-06-12 20:04:33 +02:00
CLAUDE.md docs: korrigiere Projektregeln-Pfade und Plugin-Metadaten 2026-06-12 20:04:33 +02:00
composer.json fix(data): repair broken German strings in default-cookies.json (v1.2.8) 2026-08-29 12:12:58 +02:00
LICENSE chore(license): add GPL-3.0-or-later license and copyright notice 2026-09-02 21:13:41 +02:00
phpstan.neon chore(phpstan): Analyse auf Level 3 mit aufgeloestem Framework 2026-06-13 00:39:46 +02:00
phpunit.xml übernahme in GitLab 2026-05-02 21:38:31 +02:00
Projekt.md ci: Forgejo-CI/CD-Pipeline + festes Installationsverzeichnis 2026-06-13 00:39:58 +02:00
README-Orestbida-Update.md Doku überarbeitet 2026-06-13 01:30:09 +02:00
README.md chore(license): add GPL-3.0-or-later license and copyright notice 2026-09-02 21:13:41 +02:00
STATUS.md docs(status): v1.2.8 released, update open manual tasks 2026-08-29 12:16:36 +02:00

WSC Cookie Consent – Orest Bida Integration

Ein Shopware 6 Plugin für DSGVO-konforme Cookie-Verwaltung auf Basis der Orest Bida CookieConsent Library (v3).

Das Banner wird datengetrieben aus den im Admin gepflegten Kategorien und Cookies aufgebaut, ist vollständig mehrsprachig (de/en/fr) und CSP-konform (kein Inline-Script).


Features

  • Kategorien & Cookies über ein eigenes Admin-Modul verwalten
  • Service-Level-Consent: individuelle Zustimmung pro Cookie, nicht nur pro Kategorie
  • Cookie-Items (Sub-Cookies) je Cookie mit Name, Laufzeit und Beschreibung
  • Detail-Infos je Cookie: Anbieter, erhobene Daten, Verwendungszweck, Rechtsgrundlage (mit DSGVO-Artikel), Verarbeitungsort, Datenschutz-Link
  • Import/Export der kompletten Konfiguration als JSON

Mehrsprachigkeit (de / en / fr)

  • Banner-Texte kommen aus Shopware-Snippets der aktuellen Sprache – jeder Text ist im Admin unter Einstellungen → Snippets überschreibbar (Overrides überleben Plugin-Updates)
  • Kategorie- und Cookie-Inhalte sind pro Sprache über die Shopware-Übersetzungs­ebene pflegbar (Sprachumschalter im Admin)
  • Mitgelieferter Standard-Datensatz in de/en/fr

Darstellung

  • Position (unten zentriert/links/rechts, oben, Mitte-Modal), Layout (Box/Cloud/Bar)
  • Themes (Hell, Dunkel-Türkis, Hell-Funky, Elegant-Schwarz, Benutzerdefiniert)
  • Eigene Farben, Border-Radius, Buttons gleicher Breite / Reihenfolge umkehren
  • Schwebender Einstellungen-Button (Position + Icon konfigurierbar)
  • Datenschutz-/Impressum-Links im Banner werden automatisch aus der Shopware-Konfiguration aufgelöst (pro Verkaufskanal/Sprache)

Tracking-Integration

  • Google Consent Mode v2 mit korrektem Kategorie-Mapping (analytics → analytics_storage, marketing → ad_storage/ad_user_data/ad_personalization, comfort → functionality_storage/personalization_storage, socialmedia → personalization_storage, necessary → security_storage)
  • Korrekte Consent-Reihenfolge (Muster eines gekauften CMP):
    • Der gtag('consent','default', …) (alles denied außer security_storage) steht im frühesten Head-Block (layout_head_meta_tags) und damit garantiert vor gtm.js/gtag.js – unabhängig davon, welches Plugin GTM lädt.
    • Früher, synchroner consent update für wiederkehrende Besucher: der gespeicherte cc_cookie wird bereits im <head> ausgelesen und der gtag('consent','update', …) sofort gefeuert – also vor allen E-Commerce-Events (z. B. view_item). Erstbesucher erhalten den Update nach der Banner-Auswahl (Callback). So entsteht die Reihenfolge default → update → GTM-Container → view_item.
    • Das Kategorie-Mapping liegt zentral in window.wscApplyGoogleConsent() (eine Quelle) und dedupliziert sich selbst, sodass früher Replay und späterer onConsent-Callback keinen doppelten Consent-Befehl pushen.
  • Google Tag Manager DataLayer-Events und Matomo Tag Manager-Events bei Consent-Änderungen (inkl. Service-Level-Events)
  • Automatische Script-Blockierung anhand der je Cookie hinterlegten Script-URL

Technik

  • CSP-konform: Banner-Logik als externe Datei (Resources/public/cookieconsent/wsc-cookie-consent.js), kein Inline-Script
  • Debug-Modus als Schalter (Admin-Card „Debug") – Diagnose-Ausgaben in der Browser-Konsole nur bei Bedarf; echte Fehler sind immer sichtbar
  • Standard-Datensatz wird bei der Erstinstallation per Migration eingespielt (locale-basiert, nur auf leerem Datenbestand)

Standard-Kategorien

Kategorie Technischer Name Pflicht
Technisch notwendig necessary Ja
Komfort comfort Nein
Analyse / Statistiken analytics Nein
Anzeigen / Ads marketing Nein
Social Media socialmedia Nein

Die technischen Namen sind fix und sollten nicht umbenannt werden – das Google-Consent-Mode-Mapping und der Standard-Datensatz hängen daran.


Installation

Plugin-Verzeichnis: custom/plugins/wsc_swplugin_cookieorestbida/ (festgelegt über extra.installer-name in der composer.json).

bin/console plugin:refresh
bin/console plugin:install --activate WSCPluginSWCookieOrestBida
bin/console assets:install
bin/console cache:clear

Konfiguration

Plugin-Einstellungen

Erweiterungen → Meine Erweiterungen → WSC Cookie Consent → Konfiguration

  • Banner aktivieren/deaktivieren (deaktiviert automatisch den Shopware-Standard-Banner)
  • Banner-Darstellung (Position, Layout, Theme, Farben, Border-Radius, Buttons)
  • Einstellungen-Button (anzeigen, Position, Icon)
  • Tag-Manager-Integration (Google Consent Mode v2, GTM, Matomo)
  • Erweitert (automatische Script-Blockierung)
  • Debug (Konsolen-Diagnose ein-/ausschalten)

Einstellungen → Cookie Consent

Bereich Beschreibung
Cookie-Kategorien Kategorien anlegen/bearbeiten (inkl. Übersetzungen)
Cookies Cookies mit allen Details + Cookie-Items verwalten
Import/Export Konfiguration als JSON sichern/übertragen

Datenbank-Tabellen

  • sw_cookie_consent_category (+ _translation)
  • sw_cookie_consent_cookie (+ _translation)
  • sw_cookie_consent_cookie_item (+ _translation)

Deinstallation

Bei Deinstallation mit „Alle Daten löschen" werden alle Plugin-Tabellen, die system_config-Einträge und die Migrations-Datensätze vollständig entfernt. Ohne diese Option bleiben die Daten erhalten.


Anforderungen

  • Shopware 6.7+
  • PHP 8.4

Entwicklung / CI

  • Code-Style: PSR-12 (.php-cs-fixer.dist.php)
  • Statische Analyse: PHPStan Level 3 gegen das aufgelöste Shopware-Framework
  • CI/CD: Forgejo Actions (.forgejo/workflows/ci.yml) – cs-check + phpstan bei jedem Push; build-zip bei v*-Tags (baut die Plugin-ZIP und hängt sie ans Release)

Bibliotheks-Updates der CookieConsent-Library: siehe README-Orestbida-Update.md.


Lizenz

Copyright (C) 2026 Christian Säum – web-seo-consulting.eu

Dieses Projekt steht unter der GNU General Public License, Version 3 oder (nach deiner Wahl) einer späteren Version (GPL-3.0-or-later). Der vollständige Lizenztext steht in der Datei LICENSE.

Du darfst die Software nutzen, weitergeben und – auch kommerziell – verkaufen. Gibst du eine veränderte Fassung weiter, muss deren Quellcode ebenfalls unter der GPL-3.0-or-later verfügbar sein. Der Copyright-Hinweis und die Nennung des ursprünglichen Autors dürfen nicht entfernt werden.