> ## Documentation Index
> Fetch the complete documentation index at: https://dokumentation.websale.de/llms.txt
> Use this file to discover all available pages before exploring further.

# $wsConsent - Cookies & Services

> Cookie- und Service-Einwilligung des Kunden im Frontend auswerten, um Tracking, Drittanbieter-Skripte und eingebettete Inhalte rechtskonform zu steuern.

Mit dem `$wsConsent`-Modul lesen Sie die Einwilligung des Kunden zu Cookies und Services und steuern damit, welche Inhalte und externen Skripte geladen werden. Damit können Sie beispielsweise einen Tracking- oder Marketing-Service erst dann einbinden, wenn der Kunde ihm zugestimmt hat.

Auf dieser Seite geht es um das Lesen des Einwilligungsstatus. Das Setzen der Einwilligung (Zustimmen, Ablehnen, Auswahl speichern) erfolgt über Aktionen und ist separat unter [Aktionen → Consent](/frontend/referenz/aktionen/consent) dokumentiert. Die zugehörigen Cookies selbst behandelt das Modul [\$wsCookies](/frontend/referenz/module/ws-cookie-browser-cookie).

***

## Grundkonzept

Die Einwilligung ist zweistufig organisiert: Gruppen (z. B. „Statistik“, „Marketing“) bündeln einzelne Services (z. B. „Google Analytics“). Der Kunde kann entweder allen zustimmen („Alle erlauben") oder eine Auswahl pro Gruppe/Service treffen. Jeder Eintrag trägt ein „allowed“-Flag, das die Entscheidung widerspiegelt.

`$wsConsent` stellt diesen Status auf folgenden Wegen bereit:

* **Gesamtstatus** – [`alreadySet`](#wsconsent-alreadyset) (hat der Kunde überhaupt schon entschieden?) und [`allAllowed`](#wsconsent-allallowed) (hat er allem zugestimmt?). Damit steuern Sie, ob der Consent-Layer überhaupt angezeigt werden muss.
* **Strukturierte Liste** – [`groups`](#wsconsent-groups) mit ihren `services`, um einen Consent-Layer aufzubauen.
* **Gezielte Prüfung** – [`checkAllowed(serviceName)`](#wsconsent-checkallowed), um vor dem Laden eines bestimmten Skripts die Zustimmung zu prüfen. Das ist der empfohlene Weg zum Einbinden externer Skripte.

### Einwilligung entscheidet, ob das Skript überhaupt geladen wird

Template-Code läuft beim Seitenaufbau. Wenn Sie ein Skript mit `{{ if $wsConsent.checkAllowed(...) }}` umschließen, wird das Skript bei fehlender Zustimmung gar nicht erst in die Seite geschrieben, nicht nur ausgeblendet. So stellen Sie sicher, dass ein abgelehnter Service auch wirklich nicht lädt.

***

## Modulübersicht

**Beispiel / Ausschnitt über** `$wsConsent`

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{= $wsConsent | json }}
```

**JSON-Ausgabe**

```json theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{
  "alreadySet": false,
  "allAllowed": false,
  "groups": [
    {
      "name": "...",
      "label": "...",
      "description": "...",
      "allowed": false,
      "services": [
        { "name": "...", "label": "...", "description": "...", "allowed": false }
      ]
    }
  ],
  "services": [
    { "name": "...", "label": "...", "description": "...", "allowed": false }
  ],
  "checkAllowed": "ƒ()"
}
```

Anmerkung: `"ƒ()"` kennzeichnet eine Funktion.

**Variablen in der Übersicht**

| **Variable** | **Typ** | **Beschreibung**                                     |
| ------------ | ------- | ---------------------------------------------------- |
| `alreadySet` | bool    | Ob der Kunde bereits eine Einwilligung gesetzt hat.  |
| `allAllowed` | bool    | Ob der Kunde allen Cookies/Services zugestimmt hat.  |
| `groups`     | array   | Konfigurierte Gruppen, jeweils mit ihren `services`. |
| `services`   | array   | Flache Liste aller konfigurierten Services.          |

**Eigenschaften eines Eintrags** (gilt für `groups[]` wie für `services[]`)

| **Eigenschaft** | **Typ** | **Beschreibung**                               |
| --------------- | ------- | ---------------------------------------------- |
| `name`          | string  | Technischer Name (für `checkAllowed()`).       |
| `label`         | string  | Für den Kunden sichtbare Bezeichnung.          |
| `description`   | string  | Beschreibung.                                  |
| `allowed`       | bool    | Ob der Eintrag erlaubt (akzeptiert) ist.       |
| `services`      | array   | Nur bei `groups[]`: die zugeordneten Services. |

**Methoden in der Übersicht**

| **Methode**      | **Rückgabe-Typ** | **Beschreibung**                                   |
| ---------------- | ---------------- | -------------------------------------------------- |
| `checkAllowed()` | bool             | Prüft, ob ein bestimmter Service akzeptiert wurde. |

***

## Templates

Der Consent-Layer kann global aufgerufen werden und wird aus dem Template `consent.htm` geladen.

***

## Variablen

### \$wsConsent.alreadySet

Gibt aus, ob der Kunde bereits eine Cookie-/Service-Einwilligung gesetzt hat. Nutzen Sie es beispielsweise, um den Consent-Layer nur dann anzuzeigen, wenn noch keine Entscheidung vorliegt.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if not $wsConsent.alreadySet }}
  <!-- Consent-Layer anzeigen -->
{{ /if }}
```

### \$wsConsent.allAllowed

Gibt aus, ob der Kunde allen Services zugestimmt hat (Schaltfläche „Alle erlauben").

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsConsent.allAllowed }}
  <!-- Allen Services wurde zugestimmt -->
{{ /if }}
```

### \$wsConsent.groups

Gibt die konfigurierten Gruppen aus. Jede Gruppe trägt die [Eigenschaften eines Eintrags](#modulübersicht) und enthält unter `services` die zugeordneten Services. Nutzen Sie die Gruppen, um einen strukturierten Consent-Layer aufzubauen.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ foreach $group in $wsConsent.groups }}
  {{= $group.label }}
  {{ foreach $service in $group.services }}
    - {{= $service.label }}
  {{ /foreach }}
{{ /foreach }}
```

### \$wsConsent.services

Gibt alle konfigurierten Services als Liste aus, unabhängig von der Gruppenzuordnung. Die Einträge tragen die [Eigenschaften eines Eintrags](#modulübersicht).

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ foreach $service in $wsConsent.services }}
  {{= $service.label }}: {{= $service.allowed }}
{{ /foreach }}
```

***

## Methoden

### \$wsConsent.checkAllowed()

Prüft, ob ein bestimmter Service vom Kunden akzeptiert wurde. Dies ist der empfohlene Weg, um vor dem Laden eines externen Skripts die Zustimmung zu prüfen, da das Skript bei fehlender Zustimmung gar nicht erst gerendert wird.

**Signatur**\
`$wsConsent.checkAllowed(serviceName)`

**Rückgabe**\
`bool` – `true`, wenn der Service akzeptiert wurde, sonst `false`.

| **Name**      | **Typ** | **Pflicht** | **Beschreibung**                                                |
| ------------- | ------- | ----------- | --------------------------------------------------------------- |
| `serviceName` | string  | ja          | Technischer Name des Services (das `name`-Feld eines Eintrags). |

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsConsent.checkAllowed("googleAnalytics") }}
  <!-- Google-Analytics-Tracking-Code einbinden -->
{{ /if }}
```

***

## Aktionen

Aktionen zu diesem Modul (Einwilligung setzen, ändern, speichern) sind separat dokumentiert: [Aktionen → Consent](/frontend/referenz/aktionen/consent).

***

## Beispiele

### Externes Skript einwilligungsabhängig laden

Bindet ein Skript nur ein, wenn der zugehörige Service akzeptiert wurde. Bei fehlender Zustimmung wird das Skript nicht in die Seite geschrieben.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsConsent.checkAllowed("googleAnalytics") }}
  <script src="https://www.googletagmanager.com/gtag/js?id=..."></script>
{{ /if }}
```

**Ergebnis** \
Das Tracking-Skript erscheint nur im Quelltext, wenn der Kunde „Google Analytics" akzeptiert hat.

### Consent-Layer aus Gruppen und Services aufbauen

Durchläuft die Gruppen und je Gruppe ihre Services, was die typische Struktur eines Consent-Layers widerspiegelt.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ foreach $group in $wsConsent.groups }}
  <fieldset>
    <legend>{{= $group.label }}</legend>
    <p>{{= $group.description }}</p>
    {{ foreach $service in $group.services }}
      <label>
        <input type="checkbox" name="{{= $service.name }}"{{ if $service.allowed }} checked{{ /if }}>
        {{= $service.label }} – {{= $service.description }}
      </label>
    {{ /foreach }}
  </fieldset>
{{ /foreach }}
```

**Ergebnis** \
Pro Gruppe ein Block mit den enthaltenen Services; bereits akzeptierte Services sind angehakt.

### Inhalt nur bei Zustimmung anzeigen

Zeigt einen einwilligungspflichtigen Inhalt (z. B. ein eingebettetes Video) nur an, wenn der Service akzeptiert wurde, ansonsten einen Hinweis.

```html theme={"theme":{"light":"github-light","dark":"github-dark"},"languages":{"custom":["/languages/websale.json"]}}
{{ if $wsConsent.checkAllowed("youtube") }}
  <!-- z. B. eingebettetes YouTube-Video -->
{{ else }}
  Um diese Inhalte zu sehen, akzeptieren Sie bitte den Service „Youtube Videos".
{{ /if }}
```

**Ergebnis** \
Bei Zustimmung erscheint der Inhalt, sonst der Hinweis.

***

## Weiterführende Links

* [Aktionen → Consent](/frontend/referenz/aktionen/consent) – die Einwilligung setzen und speichern (dieses Modul liest sie nur).
* [\$wsCookies](/frontend/referenz/module/ws-cookie-browser-cookie) – die durch die Einwilligung gesteuerten Cookies.
