Zum Hauptinhalt springen
Diese Seite enthält ein vollständiges Beispiel für den Einwilligungs-Layer: den passenden Abschnitt in der shop.config, den HTML-Quellcode des Layers, einen Link zum erneuten Öffnen und das ergänzende CSS. Das Designbeispiel berücksichtigt das EuGH-Urteil vom 1. Oktober 2019, nach dem eine vorangekreuzte Checkbox keine wirksame Einwilligung ist. Layer und Konfiguration können Sie im Mustershop v8s-demoshop.websale.biz ausprobieren. Wegweiser: Einwilligung zur Datenverarbeitung (Cookies) · Referenz: shop.config, Abschnitt AgreementCookies

Die vier Bausteine

Der Layer besteht aus vier Teilen, die zusammengehören. Lassen Sie einen davon weg, funktioniert das Ganze nicht.
Das Beispiel setzt Bootstrap 4.1.3 und jQuery 3.4.1 voraus. Außerdem braucht es das WEBSALE-Modul ws-module-agreementcookies, das die beiden Funktionen ws_agreementcookies_set und ws_agreement_updatecheckboxes mitbringt. Dieses Modul setzt als einziges WS-Modul nur jQuery voraus, nicht die Basis-Komponente.Das Pfeil-Symbol am Aufklapper stammt aus Font Awesome. Verwenden Sie dort ein anderes Symbol, wenn Ihr Shop Font Awesome nicht einbindet.
Referenz: WEBSALE JavaScript-Bibliothek

Baustein 1: Der Abschnitt AgreementCookies

Das Beispiel definiert zehn Dienste und fasst sie in drei Gruppen zusammen: Komfortfunktionen, Shop-Optimierungen und Social Media mit Marketing. Alle zehn stehen auf OptIn mit der Vorbelegung unchecked, keine Checkbox ist also vorangekreuzt.
Zwei Dinge an diesem Beispiel sind leicht zu übersehen: Die beiden ersten Einträge tragen ein +WEBSALEService, die übrigen acht nicht. Mit +WEBSALEService sagen Sie dem Shop, dass hinter dem Eintrag eine eingebaute WEBSALE-Funktion steckt. Der Shop schaltet diese Funktion dann selbst ab, wenn der Besucher nicht zustimmt. Die acht Einträge ohne diese Zeile sind reine Erklärungen gegenüber dem Besucher, das Abschalten der fremden Dienste müssen Sie im Template selbst erledigen. Die Reihenfolge der Gruppen im Layer kommt aus der Reihenfolge der <+ConsentGroupInfo>-Blöcke, nicht aus der Reihenfolge der Dienste. Gruppen, für die kein <+ConsentGroupInfo> existiert, landen am Ende.

Baustein 2: Der HTML-Layer

Der Layer zeigt im eingeklappten Zustand nur die Erklärung, eine Checkbox für alles und die Speichern-Schaltfläche. Erst der Aufklapper “Details” blendet die Gruppen mit ihren einzelnen Diensten ein.

Wie der Layer aufgebaut ist

Die äußere Hülle entscheidet, ob der Layer überhaupt sichtbar ist:
Der Layer steht immer im Dokument. Nur wenn keine Einwilligung vorliegt oder ein neu hinzugekommener Dienst noch keine Entscheidung hat, fehlt das display: none und der Layer wird sichtbar. Deshalb genügt für den Link weiter unten ein einfaches show(). Die Gruppenschleife läuft nicht über ein eigenes Schleifen-Tag, sondern über die dynamische Schleife:
~AC-ConsentGroupList~ liefert alle Gruppenkennungen als kommagetrennte Liste in der Reihenfolge aus der shop.config. DC-DynamicLoop1 zerlegt diese Liste, und AC-ConsentGroup schaltet je Durchlauf auf die passende Gruppe um. Innerhalb davon läuft {@AC-Entry(…)} über die Dienste genau dieser Gruppe. Die drei Ebenen von Checkboxen sind gleich aufgebaut. Jede bekommt ihre Klassen aus einem _CheckboxClass-Tag und ihren Haken aus einem _CheckboxIsChecked-Tag, und jede ruft beim Klick ws_agreement_updatecheckboxes() auf. Diese Funktion hält die drei Ebenen synchron: Setzt der Besucher den Haken bei einer Gruppe, bekommen alle Dienste darin ebenfalls einen Haken.
Die Checkboxen tragen kein name und kein value. Gespeichert wird allein über die Klassen, die aus den _CheckboxClass-Tags kommen, und zwar erst beim Aufruf von ws_agreementcookies_set(). Entfernen Sie diese Klassen nicht und ergänzen Sie eigene nur zusätzlich.
Der Besucher muss seine Einwilligung jederzeit widerrufen können. Setzen Sie dafür beispielsweise auf der Datenschutzseite einen Link, der den Layer wieder einblendet.
Damit das funktioniert, muss der Layer aus Baustein 2 auf derselben Seite stehen. Binden Sie ihn deshalb über ein Include in alle Templates ein, nicht nur in die Startseite.

Baustein 4: Individuelles CSS

Diese Anweisungen kommen zusätzlich zu den Standard-Klassen von Bootstrap. Sie heften den Layer an den unteren Bildschirmrand und beschränken ihn ab der Bootstrap-Breakpoint-Breite auf 500 Pixel.
Die Klasse isFixed setzt der Aufklapper selbst. Sie sorgt dafür, dass der aufgeklappte Layer den ganzen Bildschirm nutzt und bei vielen Diensten scrollbar wird. #cookieDetailToggler.open > i.fa dreht den Pfeil am Aufklapper um.
Die Klasse cursorPointer aus dem HTML-Beispiel ist in diesem CSS nicht enthalten. Ergänzen Sie sie selbst, sonst sieht der Besucher am Aufklapper keinen Mauszeiger:
Der Layer bekommt z-index: 9999999. Prüfen Sie, dass kein anderes Element Ihres Shops darüber liegt, besonders klebende Kopfzeilen und Warenkorb-Vorschauen.

Was das Beispiel nicht zeigt

Das Beispiel nutzt nur einen Teil der Möglichkeiten des Abschnitts. Die ausführliche Beschreibung steht auf der Referenzseite zur shop.config.

Weitere Werte für Allow und Type

Bei beiden Opt-Out-Varianten gilt die Zustimmung als erteilt, solange der Besucher nichts entscheidet. Bei OptIn ist es umgekehrt.
Der Name des Cookies, in dem die Entscheidung steht, enthält den Wert von Type. Ändern Sie Type bei einem bestehenden Dienst, sucht der Shop ab dann ein anders benanntes Cookie, findet es nicht, und alle bisher erteilten Einwilligungen für diesen Dienst gelten als nicht vorhanden. Der Layer öffnet sich dann bei allen Besuchern erneut.Dasselbe gilt für eine Änderung an ID.

Weitere WEBSALE-Dienste

Neben CookieBasket und WelcomeCookie aus dem Beispiel kennt der Shop vier weitere eingebaute Dienste, die er bei fehlender Zustimmung selbst abschaltet. Ein Eintrag darf mehrere +WEBSALEService-Zeilen tragen, wenn eine Checkbox mehrere eingebaute Dienste abdecken soll.

Weitere Einträge je Dienst

Zwei häufige Fehler in der Konfiguration

Eine ConsentGroupID darf nur Buchstaben, Ziffern, Bindestrich und Unterstrich enthalten. Bei jedem anderen Zeichen und bei einer leeren Angabe protokolliert der Shop einen kritischen Fehler und steckt den Dienst in eine Ersatzgruppe. Diese Ersatzgruppe hat keinen Namen und keine Beschreibung und fällt im Layer sofort auf.Ein <+ConsentGroupInfo>-Block, dessen ConsentGroupID von keinem Dienst verwendet wird, wird übergangen und protokolliert. Prüfen Sie nach jeder Umbenennung beide Stellen.
Die Vorbelegung aus Preselection greift nur, solange für den Dienst noch keine Entscheidung vorliegt. Sobald der Besucher einmal gespeichert hat, zählt seine Entscheidung, und eine spätere Änderung an Preselection ändert daran nichts.