AddOn
REDAXO ConsentKit
Beschreibung
Einwilligungsverwaltung für REDAXO: eine neutrale, barrierefreie Web Component im Frontend, ein kompaktes Backend und ein nachvollziehbares Protokoll.Was es kann
- Dienste einzeln wählbar, in Gruppen zusammengefasst; „Alle ablehnen“ und „Alle akzeptieren“ sind technisch immer gleichwertig gestaltet.
- 38 Vorlagen (Deutsch/Englisch) mit Scripts, Cookies, Storage-Einträgen, Laufzeiten und Quellenangabe – geprüft gegen die Dokumentation der Anbieter.
- Dienste × Domains als Matrix, Varianten je Domain oder Sprache (andere IDs, anderer Code).
- Google Consent Mode v2, Global Privacy Control, Anbieter-Aufrufe für Microsoft UET/Clarity, Meta und weitere.
- Conversions ohne Code: „Wenn Klick auf … dann melde Anfrage“ – der Aufruf je Anbieter kommt aus der Vorlage.
- 2-Klick-Platzhalter für Videos, Karten und Social-Media-Einbettungen;
<oembed>-Tags aus CKEditor 5 und TinyMCE werden automatisch gesperrt. - Protokoll ohne IP-Adresse und User-Agent, mit Schnappschuss dessen, was zur Auswahl stand.
- Design-Editor mit Live-Vorschau, Dark Mode und Kontrastprüfung; Gestaltung über CSS Custom Properties.
- Barrierefrei: natives
<dialog>, Fokusführung, Tastaturbedienung,prefers-reduced-motion,forced-colors.
github.com/KLXM/consent_kit
Umsetzung
Versionen
1.1.1
1.1.1
Behoben
-
open_mode: unbekannter Wert wirkte wieon_demand.suppressed()inassets/consent-kit.jsprüfte nur aufalwaysundneverund behandelte alles Übrige alson_demand– ein unbekannter Wert unterdrückte den Hinweis also, sobald kein gesperrter<consent-embed>auf der Seite stand. Jetzt greift die Unterdrückung ausschließlich bei den beiden bekannten Werten, alles andere fällt wie im Backend aufalwayszurück. Das Verhalten der drei gültigen Werte bleibt unverändert.Über das Backend war der Fall nicht erreichbar (
pages/settings.phplässt nur die drei Werte zu,lib/Cache.phpprüft erneut) – er betrifft eigene Integrationen, die die Konfiguration selbst erzeugen, einen veralteten Cache oder einen künftigen vierten Modus, den ein älteres Frontend noch nicht kennt. Danke an @skerbis (#13), aufgefallen beim Portieren nach KLXM Studio.
1.1.0
Neu: Einstellung „Hinweis beim Seitenaufruf“ (open_mode)
Bisher öffnete sich der Hinweis immer, sobald eine Entscheidung fehlte. Auf Websites, die nur externe Inhalte einbinden und sonst nichts laden, ist das unnötig: Dort entsteht der Bedarf erst beim Platzhalter. Die neue Einstellung hat drei Werte:
| Wert | Verhalten |
|---|---|
always (Standard) |
wie bisher – Hinweis beim ersten Aufruf, solange keine Entscheidung vorliegt |
on_demand |
Hinweis nur, wenn auf der Seite ein <consent-embed> steht, dessen Dienst noch nicht erlaubt ist |
never |
Hinweis ausschließlich auf Zuruf (Platzhalter, schwebende Schaltfläche, eigener Link) |
Umsetzung im Einzelnen (relevant für Portierungen):
pages/settings.php:open_modein der Whitelist$choices, Auswahl alsForm::choice()im Panel „Darstellung“ oberhalb der Schließen-Schaltfläche. Ohne gültigen Wert bleibt die Einstellung unangetastet.lib/Cache.php: Der Wert wandert alsopenModein die Frontend-Konfiguration; beim Lesen gegen die drei erlaubten Werte geprüft, sonstalways. Damit bleibt eine beschädigte Konfiguration auf der sicheren Seite.assets/consent-kit.js: Beim Start entscheidetsuppressed()inConsentKitElement, ob der Hinweis unterdrückt wird. Die Methode sitzt in der bestehenden Kette hinterwasDismissed(), damit GPC und „für diese Sitzung geschlossen“ unverändert Vorrang behalten. In der Vorschau (cfg.preview) greift sie nie.blockedEmbed()suchtconsent-embed[service]im Dokument und meldettrue, sobald ein Dienst dabei ist, der in der Konfiguration existiert und noch keine Einwilligung hat. Platzhalter unbekannter Dienste zählen nicht, weil sie ohnehin keinen Weg zur Einwilligung bieten.loadsOnConsent(service)(modulweite Funktion) prüfthead,body,jsAcceptundjsEventseines Dienstes. Trifft das auf einen optionalen Dienst zu, iston_demandwirkungslos und der Hinweis erscheint trotzdem – ein solcher Dienst würde sonst nie starten. Nurneverunterdrückt ausnahmslos.- Die Einstellungsseite warnt bei
on_demand/never, wenn aktive Dienste eigenen Code mitbringen, und nennt sie beim Namen (consent_kit_open_mode_warning). Geprüft werdenhtml_head,html_body,js_acceptund hinterlegte Ereignisse.
Die schwebende Schaltfläche bleibt wie bisher rein optional (trigger) – der Einstieg kann genauso über einen eigenen Link <a href="#consent-kit"> laufen.
Neu: Niederländisch und Italienisch
Frontend-Texte und Dienst-Vorlagen sprechen jetzt vier Sprachen. Das Backend bleibt bei Deutsch und Englisch.
resources/texts.php: Blöckenlunditmit allen 52 Schlüsseln. Die Auflösung läuft unverändert überTexts::defaultsFor(), das zuerst den vollen Code (nl_nl), dann die zweistellige Form (nl) und zuletztenversucht — es ist also keine Änderung am Code nötig, damit die Sprachen greifen.presets/*.json: Alle 189 mehrsprachigen Felder der 38 Vorlagen umnlunditergänzt — Dienstbeschreibungen, Hinweise, Parameter-Beschriftungen und die Zwecke der 125 Cookie- und Storage-Einträge. Übernommen wird das beim Anlegen eines Dienstes aus einer Vorlage; bereits angelegte Dienste bleiben unverändert.- Korrigiert: Die Standardtexte
introverwiesen in beiden Sprachen noch auf „Cookie-Einstellungen“ bzw. „Cookie settings“.
Geändert: Wording
Der Dialog verwaltet Dienste und jede Form von Speicher (Cookies, Local Storage, Session Storage, IndexedDB) – „Cookie-Einstellungen“ war dafür zu eng und sachlich falsch. Betroffen sind Frontend-Texte und Backend-Beschriftungen:
resources/texts.php:trigger„Cookie-Einstellungen“ → „Datenschutz-Einstellungen“ (en: „Cookie settings“ → „Privacy settings“),embed_settingsundembed_textentsprechend.lang/*.lang: Beschriftung der schwebenden Schaltfläche, Hilfetext mit dem Beispiel-Link, GPC-Hinweistext.docs/: Beispiel-Links und Beschreibung des Platzhalters.
Bestehende Übersetzungen in der Datenbank bleiben unangetastet – geändert wurden nur die Standardtexte. Wer die Texte im Backend überschrieben hat, behält seine Fassung.
Hinweis zum Update
Es sind keine Datenbankänderungen nötig. Die neue Einstellung greift ohne Eintrag auf always zurück — das Verhalten bleibt nach dem Update also unverändert, bis sie bewusst umgestellt wird. Die geänderten Standardtexte wirken nur dort, wo sie im Backend nicht überschrieben wurden; die ergänzten Sprachen der Vorlagen gelten für neu angelegte Dienste, bestehende bleiben wie sie sind.
1.0.1
Behoben
- YRewrite-Default-Domain: Die Seiten „Dienste“ und „Einstellungen“ brachen mit einem
TypeErrorab, wenn YRewrite eine Default-Domain ohne Host kennt (rex_yrewrite_domain::getHost()liefert dortnull). Diese Domain wird beim Abgleich jetzt übersprungen, bevor der Host normalisiert wird. (#11)
Intern
- Cache-Leerung bei Sprachänderungen (
CLANG_ADDED,CLANG_UPDATED,CLANG_DELETED) wird in einem Aufruf registriert. Danke an @christophboecker (#10).
1.0.0
Die erste stabile Version von Consent Kit: Einwilligungsverwaltung für REDAXO mit einer neutralen, barrierefreien Web Component im Frontend, einem kompakten Backend und einem nachvollziehbaren Protokoll. Ein Umstieg vom Consent Manager ist integriert. So ist ein Umstieg ohne Lücke möglich.
Frontend
- Web Components
<consent-kit>(Hinweis und Einstellungen) und<consent-embed>(2-Klick-Platzhalter) im Shadow DOM, ohne Abhängigkeiten. Die Einbindung erfolgt automatisch, alternativ überREX_CONSENT_KIT[]oderConsent::head(). - Vier Formen des Hinweises: Box, Leiste, Dialog und Off-Canvas. Wahlweise mit Gruppen-Schaltern direkt im Hinweis, bewusst ohne Vorauswahl.
- Gleichwertige Entscheidung: „Alle ablehnen“ und „Alle akzeptieren“ sind technisch immer gleich gestaltet. Es gibt keine Variable, die eine Schaltfläche hervorhebt.
- Einwilligung je Dienst mit Fassungsstand: Ändert sich ein Dienst, wird nur zu diesem neu gefragt. „Einwilligung widerrufen“ stoppt die Dienste, löscht den Cookie und protokolliert den Widerruf.
- 2-Klick-Platzhalter für Videos, Karten und Social Media mit den Aktionen „einmal laden“, „immer erlauben“ und „Einstellungen“.
<oembed>-Tags aus CKEditor 5 und TinyMCE werden automatisch gesperrt, iframes bekannter Dienste auf Wunsch ebenfalls. Im Text des Platzhalters sind Links zur Datenschutzerklärung möglich ({privacy},{imprint},{service_privacy}). Für Dienste, die fehlen oder inaktiv sind, lässt sich nichts laden. - Signale: Google Consent Mode v2 (Standardwerte früh im
<head>, automatisch aktiv, sobald ein Dienst Signale nutzt) und Global Privacy Control (ablehnen, nachfragen oder ignorieren). - Barrierefrei: natives
<dialog>, Fokusführung, vollständige Tastaturbedienung, Mindest-Trefferflächen,prefers-reduced-motionundforced-colors. - JavaScript-API:
ConsentKit.has(),accepted(),accept(),open(),withdraw(),reset()undonChange(), dazu die Ereignisseconsentkit:readyundconsentkit:change. Links mithref="#consent-kit"oder der alten Klasseconsent_manager-show-boxöffnen die Einstellungen.
Backend
- Dienste × Domains als kompakte Matrix, Domains kommen automatisch aus YRewrite. Varianten je Domain oder Sprache erlauben andere IDs und anderen Code.
- 38 geprüfte Vorlagen (Deutsch/Englisch) mit Scripts, Cookies, Storage-Einträgen, Laufzeiten und Quellenangabe. Eigene Vorlagen lassen sich update-sicher ablegen, importieren und exportieren.
- Conversions ohne Code: Anfrage, Registrierung, Terminbuchung oder Seitenaufruf werden per Klick, Seite oder Formular gemeldet. Den Aufruf je Anbieter (GA4, Google Ads, Meta, Matomo, OpenAI Pixel, Microsoft UET/Clarity …) liefert die Vorlage.
- Cookie-Scanner mit tatsächlicher Laufzeit aus dem Browser und optionaler Open Cookie Database.
- Design-Editor mit Live-Vorschau aller Formen, hellem und dunklem Farbschema und Kontrastprüfung. Gestaltet wird über rund 60 CSS Custom Properties (
--ck-*), dazu kommen--ck-remfür Seiten mit verkleinerter Grundschrift und ein eigenes Stylesheet im Shadow DOM. - Texte je Sprache überschreibbar, fehlende Übersetzungen per WriteAssist mit einem Klick.
- Protokoll ohne IP-Adresse und User-Agent, mit Schnappschuss dessen, was zur Auswahl stand. Bereinigung per Cronjob oder
consent_kit:log-purge. - Übernahme aus
consent_managerdirekt aus den Tabellen oder aus einem JSON-Export. Übernommene Dienste starten inaktiv, ein Bericht nennt, was zu prüfen ist.
Für Entwickler
- PHP-API
FriendsOfRedaxo\ConsentKit\Consent:has(),state(),embed(),oembed(),overview()(Dienste-Liste für die Datenschutzerklärung, auch alsREX_CONSENT_KIT[output=overview]) undhead(). - Extension Points
CONSENT_KIT_CONFIGundCONSENT_KIT_SAVED. - Dokumentation in elf Kapiteln direkt im Backend unter Hilfe.
Update von einer Beta
Eine neue update.php ergänzt beim Update über den Installer fehlende Tabellen und Spalten und leert den Konfigurations-Cache. Bestehende Dienste, Einstellungen und Einwilligungen bleiben erhalten. Neu gegenüber 1.0.0-beta4 ist nur dieser Update-Pfad, am Verhalten ändert sich nichts.
Voraussetzungen
REDAXO ≥ 5.18, PHP ≥ 8.2. Optional: YRewrite (Domains), Cronjob (Protokoll bereinigen), WriteAssist (Übersetzungen).
Danke
An Alex Wenz (@alexwenz) für die ersten Beiträge von außen: fünf sorgfältig begründete und gründlich geprüfte Pull Requests sowie zwei Issues aus dem Umstieg einer echten Kundenseite. Sie sind alle in diese Version eingeflossen. Und an alle, die die Betas ausprobiert und Rückmeldung gegeben haben.
Consent Kit ist ein Werkzeug und ersetzt keine Rechtsberatung. Entwickelt von KLXM Crossmedia für Friends Of REDAXO, MIT-Lizenz.
1.0.0-beta4
Vielen Dank an Alex Wenz (@alexwenz): Alle Änderungen dieser Version gehen auf seine Pull Requests und Issues zurück, entstanden beim Umstieg einer Kundenseite von consent_manager – sorgfältig begründet und gründlich geprüft.
- Platzhalter:
{privacy},{imprint}und{service_privacy}im Text werden zu Links auf die eigene Datenschutzerklärung, das Impressum bzw. die Datenschutzerklärung des Dienstes; der übrige Text bleibt maskiert (#7). - Platzhalter für Dienste, die nicht angelegt, inaktiv oder der Domain nicht zugeordnet sind: kein „Inhalt einmal laden“ mehr, sondern „Dieser Inhalt ist derzeit nicht verfügbar“. Der Name kommt aus der gleichnamigen Vorlage statt des rohen Schlüssels; angemeldete Redakteure sehen, welcher Dienst fehlt, die Konsole meldet es ebenfalls (#4).
ConsentKit.accept()für eigene 2-Klick-Lösungen (#2),--ck-remfür Seiten mit verkleinerter Grundschrift (#3), Cache-Buster für das eigene Stylesheet (#6).- Behoben: Vorlagensuche und Filter unter „Dienst hinzufügen“ blendeten nichts aus (#1); der Platzhalter wurde auf schmalen Schirmen abgeschnitten (#5).
1.0.0-beta3
- Eigene Vorlagen importieren und exportieren unter Werkzeuge → Eigene Vorlagen: angelegte Dienste als Vorlagen-Datei herunterladen (alle oder eine Auswahl, einzeln auch im Dienst-Formular) und fremde Vorlagen einspielen. Der Export enthält Code, Cookies und die auszufüllenden Felder, aber nie die eingetragenen IDs, Domains, Varianten oder den Status – die Platzhalter
{{…}}bleiben im Code stehen. Der Import prüft Schlüssel, Gruppe, Eintragsarten, Laufzeiten und Consent-Mode-Signale und benennt fehlerhafte Einträge einzeln. Vorhandene eigene Vorlagen lassen sich dort auch herunterladen und löschen. - Behoben: Nach einem REDAXO-Cache-Reset brach die nächste Aktion, die den Konfigurations-Cache leert, mit einer
UnexpectedValueExceptionab („Failed to open directory“) – der Ordnervar/cache/addons/consent_kit/existierte dann nicht mehr. Betroffen waren alle Speichervorgänge sowie die Sammelübersetzung. - Neues Kapitel Eigene Vorlagen in der Hilfe: wie Platzhalter (
params,{{measurement_id}},{{lang}},{{domain}}),placeholderundpatternzusammenspielen, was beim Export draußen bleibt und worauf beim Weitergeben zu achten ist.
1.0.0-beta2
- Neue Form des Hinweises: Off-Canvas – ein Panel über die volle Höhe am linken oder rechten Rand, wie bei Box und Leiste ohne Abdunklung, die Seite bleibt bedienbar. Breite über
--ck-offcanvas-width, auf schmalen Schirmen volle Breite; das Einfahren entfällt beiprefers-reduced-motion. - Option Gruppen im Hinweis zeigen (nur bei Dialog und Off-Canvas): Der Hinweis listet die Gruppen mit Schaltern, die mittlere Schaltfläche wird „Auswahl speichern“. Es ist bewusst nichts vorausgewählt – eine Vorbelegung wäre keine wirksame Einwilligung. Die einzelnen Dienste bleiben in den Einstellungen.
- Die Vorschau im Design-Editor hat einen Umschalter für die Form (Box, Leiste, Dialog, Off-Canvas). Damit lassen sich die Formen durchprobieren, ohne die gespeicherte Einstellung zu ändern.
- Behoben: Im Hinweis mit Gruppen liessen sich die Schalter nicht bedienen – der Zustand wurde aus den (dort nicht vorhandenen) Dienst-Schaltern abgeleitet und sofort wieder zurueckgesetzt.
- Die Einstellungen behalten die Off-Canvas-Form: Wer den Hinweis seitlich einfahren laesst, bekommt auch beim erneuten Aufruf ein Panel an derselben Seite statt eines mittigen Dialogs. Breite optional ueber
--ck-offcanvas-settings-width. - Behoben: Bei langem Inhalt konnte der Textbereich des Hinweises die Schaltflächen aus dem Dialog schieben, sodass „Akzeptieren“ unter dem sichtbaren Bereich lag. Jetzt scrollt der Inhalt, die Schaltflächen bleiben immer vollständig sichtbar.
- Gestaltung deutlich erweitert: Abstände, Zeilenhöhe, Überschriften- und Nebentextgröße, Innenabstand, Schriftstärke, Rahmenbreite, Schreibweise und Hover-Farben der Schaltflächen, Größe der Schalter, Eckenradius von Gruppen und Tabellen, Backdrop-Filter, Mindesthöhe des Platzhalters. Alle neuen Variablen behalten als Standard exakt den bisherigen Wert, die Darstellung ändert sich also nicht von selbst.
- Eigenes Stylesheet unter Design: Eine CSS-Datei (Projektpfad oder vollständige Adresse) wird zusätzlich im Shadow DOM geladen und erreicht damit auch Elemente ohne eigene Variable – projektübergreifend wiederverwendbar.
- Design-Editor nach Themen gegliedert (Farben hell/dunkel, Schrift, Abstände und Breiten, Form, Schaltflächen); die Kontrastprüfung berücksichtigt auch die Hover-Farben.
- Die Schaltflächen bleiben bewusst gemeinsam gestaltet: Es gibt weiterhin keine Variable, mit der sich „Akzeptieren“ gegenüber „Ablehnen“ hervorheben ließe.
1.0.0-beta1
Erste öffentliche Beta von Consent Kit – Einwilligungsverwaltung für REDAXO 5.18+ (PHP 8.2+).
Highlights
- Neutrale, barrierefreie Web Component (
<consent-kit>), Dark Mode, Gestaltung über CSS-Variablen und::part(); alle Schaltflächen gleichwertig - Dienste × Domains als Matrix (Domains aus YRewrite), Varianten je Domain oder Sprache
- 38 geprüfte Vorlagen (de/en) mit Cookies, Laufzeiten, Anbietern, Scripts, Consent-Mode-Signalen und Ereignis-Aufrufen
- Conversions ohne Code („Wenn Klick auf … dann melde Anfrage“) für OpenAI Pixel, Meta Pixel, Google Ads, GA4, Matomo
- Google Consent Mode v2, Global Privacy Control, Widerruf, Schließen ohne Entscheidung
- 2-Klick-Platzhalter, automatische Sperre von
<oembed>-Tags (CKEditor 5/TinyMCE) und iframes bekannter Dienste - Protokoll ohne IP/User-Agent mit Revisions-Schnappschuss, CSV-Export; Re-Consent nur bei echten Änderungen
- Design-Editor mit Live-Vorschau und Kontrastprüfung, Texte je Sprache, Cookie-Scanner mit gemessenen Laufzeiten, WriteAssist-Übersetzung
- Übernahme aus consent_manager (Werkzeuge)
Details und Umstiegshinweise in der Hilfe im Backend bzw. im README. Das AddOn ersetzt keine Rechtsberatung.