Überblick

Das Problem

Ob eine Contao-Website barrierefrei ist, entscheidet sich nicht an einer Stelle, sondern in Hunderten kleiner. Der Alternativtext liegt in den Meta-Angaben der Datei, die Überschriftenebene im Inhaltselement, der Linktext im Fließtext, die Feldbeschriftung im Formular-Generator, die Seitensprache im Startpunkt, der Rest im gerenderten HTML. Jede dieser Stellen ist für sich harmlos. Zusammen ergeben sie einen Zustand, den niemand kennt, weil es keinen Bildschirm gibt, der ihn zeigt.

  • Niemand weiß, wo Sie stehen. Die Frage „Sind wir barrierefrei?“ lässt sich ohne ein Werkzeug nur mit „Wir haben uns Mühe gegeben“ beantworten – und das trägt weder gegenüber der Geschäftsführung noch gegenüber einer Behörde.
  • Alt-Texte fehlen genau dort, wo niemand hinsieht. Bilder in Galerien, Slidern und Theme-Elementen tauchen in keiner Inhaltsprüfung auf, weil sie nicht im Text stehen, sondern als Datei-Referenz.
  • Jeder Prüfdurchlauf beginnt bei null. Ein externer Test liefert eine PDF-Liste. Vier Wochen später ist unklar, welcher Punkt erledigt wurde, welcher bewusst akzeptiert und welcher neu dazugekommen ist.
  • Redaktionsarbeit macht Behobenes wieder kaputt. Ein neues Inhaltselement mit einer übersprungenen Überschriftenebene, ein „Hier klicken“, ein Formularfeld ohne Beschriftung – niemand merkt es beim Speichern.
  • PDFs fallen komplett durchs Raster. Verlinkte Dokumente ohne Titel, ohne Sprache, ohne Tags gehören zum Auftritt, werden aber von keiner Seitenprüfung erfasst.
  • Pflichtangaben und Meldekanal entstehen als Handarbeit. Erklärung zur Barrierefreiheit, Kontaktadresse, Rückmeldeformular: alles einzeln gebaut, alles einzeln zu pflegen, bei mehreren Domains mehrfach.

Am härtesten trifft es die Redaktion und die betreuende Agentur: Sie sollen einen Zustand verantworten, den sie nicht sehen, mit Werkzeugen, die außerhalb von Contao liegen und deren Ergebnisse sich nirgendwo festhalten lassen.

Die Lösung

Das Grundprinzip in einem Satz: AccessPlus prüft die Inhalte dort, wo sie liegen – in der Contao-Datenbank und auf der fertig gerenderten Seite – und trennt konsequent zwischen dem, was ein Werkzeug entscheiden darf, und dem, was ein Mensch entscheiden muss.

Aus einem einmaligen Test wird damit ein laufender Zustand: Befunde bekommen einen Fingerabdruck, überleben den nächsten Scan, behalten ihre Triage („bestätigt“, „ignoriert“) und verschwinden erst, wenn sie tatsächlich nicht mehr gefunden werden. Alles, was ein Werkzeug nur vorschlagen kann – ein Alt-Text, ein barrierefreier Name, ein Text in einfacher Sprache –, landet als Entwurf in einer Prüfschleife und wird nie automatisch veröffentlicht.

AufgabeOhne ZusatzwerkzeugMit AccessPlus
Zustand feststellenexterner Testlauf, Ergebnis als DokumentVoll-Scan im Backend: Datenbank-Checks plus axe-core auf den gerenderten Seiten
Befunde verwaltenTabelle in einer Datei, jedes Mal neuBericht mit Status je Befund; bestätigt/ignoriert bleibt über Scans hinweg erhalten
Alt-Texte nachziehenDatei für Datei in der DateiverwaltungKI-Vorschläge nur für Bilder ohne Alt-Text, einzeln freizugeben, geschrieben nach tl_files.meta
Namenlose Links und ButtonsTemplates suchen und anpassenARIA-Namen aus dem Scan, geprüft übernommen, zur Laufzeit gesetzt – nie überschreibend
PDF-Dokumentegar nicht geprüftPrüfung auf Titel, Sprache und Tags; Befunde im selben Bericht
PflichtangabenHandarbeit je DomainErklärung und Meldekanal als Backend-Formular plus zwei Frontend-Module
Rückfall verhindernZufallgedrosselter Re-Scan nach jedem Speichern und über den Contao-Cron
Änderungen zurücknehmennicht vorgesehenVerlauf mit „Vorher → Nachher“ und Rückgängig-Schaltfläche

Die Punkte aus dem Problemabschnitt bekommen damit jeweils ein Gegenstück:

  • Zustand unbekanntDashboard mit A11Y-Score, Kacheln und Lauf-Verlauf.
  • Fehlende Alt-Texte in Galerien und Modulen → der Check Bilder ohne Alternativtext arbeitet dateizentriert über tatsächlich verwendete Bilder, nicht über Fließtext.
  • Prüfung beginnt bei null → dedupliziertes Befund-Register mit klebendem Status.
  • Rückfall durch RedaktionsarbeitMonitoring nach dem Speichern.
  • PDFsPDF-Prüfung auf Titel, Sprache, Tags.
  • PflichtangabenErklärung & Meldekanal und der Posteingang.

Wann das Paket passt

SituationEinschätzung
Redaktionell gepflegte Contao-Website mit vielen Bildern, Formularen und PDFsPasst. Genau dieser Inhaltsbestand wird geprüft.
Eine Installation, mehrere Domains / StartpunktePasst. Lizenz, Overlay-Aktivierung, Erklärung und einfache Sprache werden je Startpunkt gesetzt; die Datenbank-Analyse arbeitet install-weit.
Sie brauchen ein belastbares Konformitäts-TestatNicht dieses Paket. Der Score ist im Produkt ausdrücklich als „Richtwert, keine Konformitätsaussage“ gekennzeichnet. Ein Testat kommt von einer Prüfstelle, nicht von einem Scanner.
Sie möchten Barrierefreiheit durch ein Overlay „herstellen“Nicht dieses Paket. Das Komfort-Overlay ist im Backend selbst als „Kein Ersatz für barrierefreie Inhalte“ ausgewiesen und nicht als Barrierefreiheits-Lösung zu vermarkten.
Sie brauchen zertifizierte Leichte SpracheNicht dieses Paket. Erzeugt werden KI-Entwürfe; das Modul weist ausdrücklich auf die nötige menschliche Prüfung hin.
Auf dem Server dürfen keine externen Aufrufe stattfindenPasst eingeschränkt. Datenbank-Checks, Frontend-Scan, PDF-Prüfung, Overlay, Erklärung, Meldekanal und Monitoring laufen vollständig lokal. Alle KI-Funktionen sind dann gesperrt. Die Lizenzprüfung selbst kontaktiert weiterhin ausschließlich den Lizenzserver des Herstellers.
Contao älter als 4.13 oder PHP älter als 8.1Nein. Siehe Voraussetzungen.

Teil 1 – Einrichtung

Der Weg von der leeren Installation bis zum ersten auswertbaren Scan:

  1. Voraussetzungen prüfen.
  2. Vor der Installation: Backup, Entscheidungen, Schreibrechte.
  3. Installation über den Contao Manager – der empfohlene Weg.
  4. Alternativ: Installation über Composer.
  5. Installation überprüfen.
  6. Lizenz je Startpunkt aktivieren – ohne diesen Schritt bleibt das Paket wirkungslos.
  7. Einstellungen setzen (KI-Anbieter, Datenschutz, WCAG-Ziel, Monitoring).
  8. Ersten Voll-Scan ausführen.

Voraussetzungen

AnforderungVersionBemerkung
PHP>=8.1
Contao^4.13 || ^5.3contao/core-bundle
Symfony-Komponenten^5.4 || ^6.4 || ^7.0Config, DependencyInjection, HttpClient, HttpFoundation, HttpKernel, Mime
defuse/php-encryption^2.3Verschlüsselung des API-Schlüssels; wird mitinstalliert
smalot/pdfparser^2.7PDF-Prüfung; wird mitinstalliert
ext-sodiumempfohlenWird für die Lizenzprüfung (Ed25519) benötigt. Ab PHP 8.1 praktisch überall vorhanden.
ext-intlempfohlenNormalisiert internationalisierte Domainnamen für die Domain-Bindung der Lizenz.

Ausgeschlossen sind contao/core (die alte Nicht-Composer-Installation) und contao/manager-bundle vor 4.13.

Hinweis

Fehlt ext-sodium, meldet die Lizenzprüfung: „Auf diesem Server fehlt die benötigte Krypto-Erweiterung (libsodium).“ Die Installation selbst gelingt trotzdem – nur aktivieren lässt sich nichts.

Vor der Installation

  1. Backup. Datenbank und Dateisystem. Das Paket legt eigene Tabellen additiv an und ändert keine Kerntabellen, aber contao:migrate ist immer ein Zeitpunkt für ein Backup.
  2. Domain am Startpunkt setzen. Die Lizenz wird exakt an den Hostnamen gebunden, der im Startpunkt unter Routing eingetragen ist. www.example.com und example.com sind dabei verschiedene Hosts. Ist dort nichts eingetragen, lässt sich keine Lizenz aktivieren.
  3. Entscheiden, ob externe Aufrufe erlaubt sind. Der Schalter Keine externen Aufrufe ist standardmäßig aktiv; alle KI-Funktionen sind damit gesperrt, bis ihn jemand bewusst deaktiviert.
  4. Testumgebung. Den ersten Voll-Scan möglichst auf einer Kopie ausführen: Er ruft jede veröffentlichte Seite einmal auf.

Schreibrechte. Das Paket legt seinen eigenen Zustand – Einstellungen, verschlüsselt gespeicherte Zugangsdaten und den Lizenzstand – unterhalb von var/accessplus/ ab. Das Verzeichnis wird beim ersten Schreibzugriff selbst angelegt; nötig ist lediglich, dass der PHP-Prozess unterhalb von var/ schreiben darf. Von Hand muss dort nie etwas bearbeitet werden.

Installation über den Contao Manager

  1. Contao Manager öffnen und anmelden.
  2. Bereich Entdecken öffnen. Neue Pakete werden immer dort gesucht und hinzugefügt; der Bereich Pakete daneben zeigt unter Installierte Pakete nur, was bereits vorhanden ist. Entdecken ist zugleich die Startansicht.
  3. Über Pakete suchen nach vtinnovations/accessplus suchen und beim Treffer Paket hinzufügen wählen.
  4. Änderungen anwenden. Der Contao Manager installiert das Paket und aktualisiert den Autoloader.
  5. Bereich SystemwartungDatenbank-Migrationen und -BackupsDatenbank prüfen; die angezeigten Datenbank-Änderungen bestätigen. Dabei entstehen die acht Tabellen tl_accessplus_*.
  6. Unter Systemwartung den Anwendungs-Cache leeren (in der Navigation auch als Cache erneuern).

Installation über Composer

composer require vtinnovations/accessplus
vendor/bin/contao-console contao:migrate
vendor/bin/contao-console cache:clear

Auf einer Managed Edition erledigt contao:setup das Anlegen der Verzeichnisse und das Veröffentlichen der Bundle-Assets in einem Schritt:

vendor/bin/contao-console contao:setup

Aktualisieren:

composer update vtinnovations/accessplus
vendor/bin/contao-console contao:migrate
vendor/bin/contao-console cache:clear
Achtung

Die Frontend-Bestandteile (Komfort-Overlay, Sprachumschalter, Scanner) werden aus public/bundles/vtinnovationsaccessplus/ ausgeliefert. Wird das Paket per ZIP über ein bestehendes Verzeichnis kopiert statt über Composer aktualisiert, bleiben diese Dateien auf dem alten Stand und passen dann nicht mehr zum PHP-Code. Immer über Composer bzw. den Contao Manager aktualisieren und anschließend contao:setup (Managed Edition) oder assets:install ausführen.

Installation überprüfen

Dass das Bundle registriert ist, zeigt am schnellsten die Befehlsliste – ohne Registrierung erscheint keiner der Befehle:

vendor/bin/contao-console list accessplus

Erwartet werden sechs Befehle: accessplus:scan, accessplus:monitor, accessplus:pdf:scan, accessplus:alt:generate, accessplus:simplify und accessplus:subtitles:generate.

Im Backend erscheint eine neue Navigationsgruppe Barrierefreiheit mit zwei Einträgen:

  • Barrierefreiheit – „Prüfen, erzeugen, absichern – alle Werkzeuge in Tabs“ (do=accessplus)
  • Meldungen – „Eingegangene Barriere-Meldungen“ (do=accessplus_feedback)

Nach contao:migrate existieren die Tabellen aus Datenbanktabellen.

Lizenz je Startpunkt aktivieren

AccessPlus wird nicht install-weit lizenziert, sondern je Startpunkt. Es gibt genau eine Oberfläche dafür, und sie liegt nicht im Modul selbst:

Seitenstruktur → Startpunkt bearbeiten → Abschnitt AccessPlus Licence management

Der Abschnitt wird direkt oberhalb des Zugriffsschutz-Abschnitts eingefügt und erscheint ausschließlich bei Startpunkten. Das Feld heißt Lizenz mit dem Hilfetext „Lizenz dieses Startpunkts. Sie wird exakt an die hier konfigurierte Domain gebunden.“

Was der Abschnitt anzeigt

AnzeigeBedeutung
Statusder aktuelle Lizenzzustand (siehe Tabelle unten)
Domain(s) dieses Startpunktsder Hostname, an den gebunden wird; ohne Eintrag „— (keine Domain konfiguriert)“
Schlüsselmaskiert – nur die ersten und letzten vier Zeichen
Paket, Gültig ab, Gültig bisaus dem signierten Lizenzstand; unbefristete Lizenzen zeigen „unbefristet“
Zuletzt geprüftZeitpunkt der letzten erfolgreichen Prüfung

Bedienelemente

Schaltfläche / FeldWirkung
LizenzschlüsselEingabefeld. Ist bereits ein Schlüssel hinterlegt, steht dahinter „(hinterlegt — Feld leer lassen, um ihn beizubehalten)“ und im Feld der Platzhalter „unverändert lassen“.
Lizenz prüfen und aktivierenPrüft den Schlüssel gegen den Lizenzserver und speichert den signierten Stand. Bestätigung: „Lizenz geprüft und aktiviert.“
Lizenz aktualisierenHolt den aktuellen Stand erneut, ohne den Schlüssel neu einzugeben.
Lizenz entfernen + Entfernen bestätigenEntfernt den Stand für diesen Startpunkt. Ohne gesetztes Häkchen: „Entfernen nicht bestätigt.“ Danach: „Lizenz entfernt. Für diesen Startpunkt gilt wieder das Contao-Standardverhalten.“

Zum Schlüsselfeld gehört der Hilfetext: „Der Schlüssel wird ausschließlich serverseitig verwendet und nie wieder vollständig angezeigt — oben im Status stehen seine ersten und letzten vier Zeichen, damit erkennbar bleibt, welche Lizenz hinterlegt ist. Die Prüfung kontaktiert ausschließlich den Lizenzserver des Herstellers.“

Zustände

ZustandAnzeigeAuswirkung
active„aktiv“alle Funktionen für diesen Startpunkt verfügbar
expired„abgelaufen — die Funktionen sind für diesen Startpunkt deaktiviert“Funktionen aus
revoked„widerrufen — die Funktionen sind für diesen Startpunkt deaktiviert“Funktionen aus
invalid„nicht gültig: <Grund>“Funktionen aus
unlicensed„keine Lizenz hinterlegt“Funktionen aus
Achtung

Ohne gültige Lizenz verhält sich Contao für diesen Startpunkt exakt so, als wäre das Paket nicht installiert. Das Modul zeigt dann: „Für diesen Startpunkt liegt keine gültige Lizenz vor. Die Funktionen dieses Bundles sind für ihn deaktiviert; Contao verhält sich unverändert.“ Es werden keine Skripte, kein Overlay und keine ARIA-Attribute ins Frontend eingefügt. Bereits eingegangene Barriere-Meldungen bleiben sichtbar – der Posteingang wird lediglich schreibgeschützt.

Ablehnungsgründe im Klartext

MeldungWas zu tun ist
„Bitte einen Lizenzschlüssel eingeben.“Feld war leer.
„Für diesen Startpunkt ist keine Domain hinterlegt.“Im Startpunkt unter Routing eine Domain eintragen.
„Die Lizenz gilt nicht für die Domain dieses Startpunkts.“Hostname prüfen – www. zählt.
„Dieses Lizenzpaket ist für dieses Produkt nicht zugelassen.“Der Schlüssel gehört zu einem anderen Produkt.
„Die Lizenz ist abgelaufen.“ / „Die Lizenz ist noch nicht gültig.“Gültigkeitszeitraum prüfen.
„Die Lizenz wurde für diesen Startpunkt entzogen.“Rücksprache mit dem Hersteller.
„Die hinterlegte Lizenz muss einmalig aktualisiert werden.“Lizenz aktualisieren drücken.
„Es liegt bereits ein neuerer Lizenzstand vor.“Ein älteres Paket wurde eingespielt; Aktualisierung anstoßen.
„Der Lizenzserver ist derzeit nicht erreichbar. Der bisherige Stand bleibt erhalten.“Später erneut versuchen; ausgehende HTTPS-Verbindungen prüfen.
„Der Lizenzserver hat die Anfrage abgelehnt. Bitte Schlüssel und Domain prüfen.“Schlüssel und Domain gegenprüfen.
„Auf diesem Server fehlt die benötigte Krypto-Erweiterung (libsodium).“ext-sodium aktivieren.
„Ungültiger Startpunkt.“Die bearbeitete Seite ist kein Startpunkt.
Hinweis

Der Schalter Keine externen Aufrufe betrifft die Lizenzprüfung nicht. Sie ist Voraussetzung des Produkts und kontaktiert ausschließlich den Lizenzserver des Herstellers – kein Inhalt, keine KI-Daten.

Einstellungen

Barrierefreiheit → Tab Einstellungen. Diese Einstellungen gelten install-weit für alle Startpunkte.

KI-Anbieter

FeldWerte / HilfetextStandard
AnbieterOpenAI oder OpenAI-kompatibel (eigene Basis-URL)OpenAI
Basis-URL (optional, Pflicht für „kompatibel“)nur http(s) mit Hostname; leer = Standard-Endpunkt https://api.openai.com/v1leer
Modell (optional, leer = Standard; für Alt-Texte ein Vision-Modell)freileer
API-Schlüssel (gesetzt|leer)„Wird verschlüsselt gespeichert und nie angezeigt. Feld leer lassen = unverändert.“leer
Schlüssel entfernenKontrollkästchen; löscht das gespeicherte Chiffrataus
Verbindung testenErfolg: „Verbindung ok (<Anbieter> / <Modell>, <ms> ms).“

Datenschutz

FeldBeschreibungStandard
Keine externen Aufrufe„— blockiert jeden KI-/Egress-Aufruf. Standardmäßig aktiv. Zum Nutzen der KI-Funktionen deaktivieren.“aktiv

Hilfetext: „Ist dies aktiv, verlassen keine Inhalts-/KI-Daten den Server. Der Verbindungstest unten ist dann gesperrt. Nicht betroffen ist die Lizenzprüfung (nur der Lizenzserver des Herstellers) — sie ist Voraussetzung des Produkts und wird je Startpunkt unter „AccessPlus Licence management“ verwaltet.“

Hinweis

Ein nicht angehaktes Kontrollkästchen wird beim Speichern als sicherer Zustand gewertet: Fehlt der Wert im Formular, gilt „Keine externen Aufrufe“ als aktiv. Das Paket fällt im Zweifel nie in Richtung mehr Egress zurück.

Barrierefreiheit

FeldWerteStandard
WCAG-ZielniveauA, AA (empfohlen), AAAAA
Aktive Sprachen (Komma-getrennt, z. B. „de, en“)Sprachcodes; steuert, für welche Sprachen fehlende Alt-Texte gemeldet werdende

Das Zielniveau bestimmt, welche axe-core-Regelgruppen der Frontend-Scan ausführt:

Zielniveauaxe-Tags
Awcag2a, wcag21a
AAwcag2a, wcag2aa, wcag21a, wcag21aa, wcag22aa
AAAwie AA, zusätzlich wcag2aaa, wcag21aaa

Monitoring

FeldBeschreibungStandard
Nach Speichern automatisch neu prüfen„— re-scannt die Datenbank-Checks nach Inhalts-Änderungen (gedrosselt). Kein externer Aufruf.“an
Drossel-Intervall (Sekunden, min. 30)„Verhindert Dauer-Scans bei vielen Speichervorgängen. Gilt auch für den Contao-Cron.“ Eingaben werden auf 30 … 86400 begrenzt.120

Erster Voll-Scan

Barrierefreiheit → Tab DashboardVoll-Scan starten. Der Lauf hat zwei Phasen:

  1. Datenbank-Analyse. Die fünf Inhalts-Checks laufen über tl_content, tl_page, tl_files und tl_form_field. Kein externer Aufruf, keine Änderung an Inhalten.
  2. Frontend-Analyse. Jede veröffentlichte, öffentliche Seite wird in einem unsichtbaren Iframe geladen und mit axe-core geprüft (Kontrast, DOM, Landmarks).

Das Hilfetextfeld beschreibt es so: „Prüft erst die Datenbank-Inhalte, dann die gerenderten Seiten (axe-core: Kontrast, DOM, Landmarks). Verändert nichts. Lass das Backend-Tab offen, bis „Fertig“ erscheint.“

Achtung

Die Frontend-Phase läuft im Browser des angemeldeten Backend-Benutzers. Das Backend-Tab muss geöffnet bleiben, bis der Lauf fertig ist – wird es geschlossen, bricht die Frontend-Phase ab. Geschützte Seiten werden übersprungen, weil im Iframe nur die Anmeldemaske erscheinen würde.

Wer nur die lokale Prüfung will, nimmt Nur Datenbank-Analyse (ohne Frontend). Diese Variante läuft vollständig serverseitig und schreibt immer einen Lauf mit, sodass der Score erscheint.

Teil 2 – Funktionen im Detail

Das Modul und seine Tabs

Das Paket belegt einen einzigen Navigationseintrag. Alle Werkzeuge liegen als Tabs darin (contao?do=accessplus&tab=…):

TabInhalt
DashboardVoll-Scan, Score, Kennzahlen, Lauf-Verlauf
BerichtBefundliste mit Triage
PDFPrüfung verlinkter PDF-Dokumente
KI-Alt-TexteAlt-Text-Vorschläge zur Freigabe
ARIA-Namenbarrierefreie Namen für namenlose Elemente
KI-UntertitelWebVTT-Entwürfe für Video und Audio
Einfache Sprachevereinfachte Textfassungen zur Freigabe
OverlayKomfort-Overlay konfigurieren
ErklärungBarrierefreiheitserklärung und Meldekanal
Verlaufangewendete Änderungen mit Rückgängig-Funktion
Einstellungensiehe Einstellungen
MeldungenLink auf das eigene Modul do=accessplus_feedback

Sind mehrere Startpunkte lizenziert, erscheint zusätzlich eine Leiste Domain mit einer Auswahl und der Schaltfläche Wechseln. Die gewählte Domain bleibt beim Tab-Wechsel erhalten; jeder Tab arbeitet im Rahmen dieses Startpunkts. Zur Auswahl stehen ausschließlich lizenzierte Startpunkte – eine install-weite Option gibt es bewusst nicht.

Ist gar kein Startpunkt angelegt, meldet das Modul: „Es ist noch kein Startpunkt angelegt.“

Dashboard und Voll-Scan

Das Dashboard beantwortet die Frage „Wo stehen wir?“ mit einer Zahl und acht Kennzahlen.

A11Y-Score

Der Ring zeigt „<Zahl>% optimiert“ mit der Bildunterschrift A11Y-SCORE und darunter unmissverständlich: „Richtwert auf Basis der gefundenen Probleme – keine Konformitätsaussage.“ Solange noch kein Lauf gespeichert wurde, steht daneben „(live · noch kein Lauf gespeichert)“.

Kennzahlen

KachelBedeutung
Offene Befundealles, was weder erledigt noch ignoriert ist
Kritisch / ErnstBefunde mit Schweregrad Kritisch bzw. Schwer
Ein-Klick lösbarBefunde, für die ein unterstützter Reparaturweg existiert
Nur manuellBefunde, die eine menschliche Entscheidung brauchen
Erledigtbeim letzten Lauf nicht mehr gefunden
Frontend (axe)Befunde aus der gerenderten Seite
Bilder ohne AltKurzzugriff auf den häufigsten Fall

Hinter den Kacheln steht die Einteilung in drei Kategorien: Erledigt (✅), Ein-Klick (🔘) und Nur manuell (👤). Was in „Ein-Klick“ landet, ist eng definiert – derzeit ausschließlich der Check Bilder ohne Alternativtext, weil nur dort ein unterstützter Weg zur Behebung existiert. Der Hinweis dazu lautet: „Automatisch lösbar — im Modul KI-Alt-Texte erzeugen & übernehmen.“

Hinweis

„Ein-Klick“ heißt unterstützt, nicht automatisch. Kein Befund wird ohne menschliche Freigabe live verändert – die Liste der Prüfungen, die live angewendet werden dürfen, ist im Code bewusst leer.

Frontend-Abschnitt

Der Abschnitt Frontend-Analyse (axe) – <Anzahl> listet die Befunde aus der gerenderten Seite. Ist er leer: „Keine offenen Frontend-Befunde. (Voll-Scan starten, um gerenderte Seiten zu prüfen.)“ Die Schaltfläche Frontend-Befunde zurücksetzen löscht sie für einen sauberen Neustart – bestätigt mit „<Anzahl> Frontend-Befunde zurückgesetzt. Nächster Voll-Scan prüft die Seiten neu.“ Das ist der vorgesehene Weg bei offensichtlichen Falschmeldungen, etwa aus Einblend-Animationen.

Mehrere Domains

Bedient eine Installation mehrere Domains, erscheint der Hinweis: „Diese Installation bedient mehrere Domains. Frontend-Funktionen (Komfort-Overlay, Einfache Sprache, Untertitel) und der Frontend-Scan gelten je Domain – den Scan jeweils dort ausführen. Die Datenbank-Analyse arbeitet install-weit und ist davon unabhängig.“ Zu jeder Domain wird die Seitenzahl gezeigt und, wo sinnvoll, ein Link „dortiges Backend öffnen ›“.

Lauf-Verlauf

Eine Tabelle Lauf-Verlauf mit Zeitpunkt und Score. Zusätzlich steht an den Kennzahlen die Veränderung: „(seit letztem Lauf: +<neu> neu, −<behoben> behoben)“.

Bericht

Der Bericht ist die Arbeitsliste. Die Schaltfläche Scan jetzt startet ausschließlich die Datenbank-Checks – der Hilfetext sagt es deutlich: „Liest die Contao-Inhalte (Datenbank) — verändert nichts.“ Danach erscheint eine Zusammenfassung der Form „Scan fertig. Neu: … · Wieder offen: … · Behoben: … · Offen: … · Score: …“.

Die fünf Datenbank-Checks

BezeichnungKennungWCAGSchweregradWas geprüft wird
Bilder ohne Alternativtextimage_alt_missing1.1.1MittelBilddateien, die tatsächlich verwendet werden (Einzelbild, Galerie, Slider, Modul oder {{file::UUID}}) und in tl_files.meta für eine aktive Sprache keinen Alt-Text haben. Geprüft werden jpg, jpeg, png, gif, webp.
Überschriften-Hierarchieheading_hierarchy1.3.1, 2.4.6MittelÜbersprungene Ebenen und mehrfache H1 innerhalb eines Artikels, ermittelt aus den Überschrift-Inhaltselementen in Dokumentreihenfolge.
Seitensprache (lang) fehltpage_language_missing3.1.1SchwerStartpunkte ohne gesetzte Sprache – davon hängt <html lang> für den gesamten Baum ab.
Wenig aussagekräftige Linktextelink_text_vague2.4.4MittelHyperlink-Elemente und Inline-Anker im Fließtext mit nichtssagender Beschriftung.
Formularfelder ohne Beschriftungform_field_no_label1.3.1, 3.3.2SchwerFelder in tl_form_field, die eine sichtbare Beschriftung brauchen und keine haben. Strukturelle Typen (html, headline, submit) sind ausgenommen.
Hinweis

Der Alt-Text-Check meldet nur ein fehlendes Attribut, nicht ein leeres. Ein bewusst leerer Alt-Text ist bei rein dekorativen Bildern die richtige Angabe und gilt daher als getroffene Entscheidung. Deshalb ist der Schweregrad Mittel und nicht Kritisch.

Triage

StatusBedeutung
openfrisch gefunden, noch nicht bewertet
confirmedein Mensch hat bestätigt, dass es ein echtes Problem ist – im Bericht als [bestätigt] markiert
ignoredbewusst akzeptiert
fixedbeim letzten Lauf nicht mehr gefunden – automatisch gesetzt

Die Schaltflächen heißen Bestätigen, Wieder offen und Ignorieren; jede Änderung wird mit „Status aktualisiert.“ quittiert. Entscheidend: von Menschen gesetzte Zustände sind klebend. Ein erneuter Scan setzt sie nicht zurück; er setzt einen Befund nur dann auf Erledigt, wenn er in der Quelle nicht mehr auftaucht.

Weitere Elemente

  • Auf der Seite zeigen → öffnet eine Vorschau, in der das betroffene Element markiert wird. Ist das nicht möglich, erscheint „(Cross-Origin – nicht markierbar)“, „(Element nicht gefunden – Seite evtl. geändert)“ oder „(Vorschau nicht möglich)“.
  • Jetzt fixen › springt zum passenden Werkzeug.
  • Das Abzeichen Best Practice mit dem Titel „Empfehlung – kein WCAG/BFSG-Pflichtverstoß“ markiert Frontend-Befunde ohne zugeordnetes Erfolgskriterium.
  • Mehrfach auftretende Befunde werden zusammengefasst und mit „ × <Anzahl> Seiten“ ausgewiesen.
  • Die Score-Zeile lautet: „Score: <Zahl>/100 (<Anzahl> offene Befunde · Richtwert, keine Konformitätsaussage)“.
  • Ist nichts offen: „Keine offenen Befunde. Entweder noch nicht gescannt oder alles erledigt.“

PDF-Dokumente

Die Schaltfläche PDFs prüfen liest verlinkte PDF-Dateien. Hilfetext: „Liest verlinkte PDFs (Titel, Sprache, Tags). Verändert die Dateien NICHT.“

KennungPrüfungWCAGSchweregrad
pdf_no_titleDokumenttitel fehlt2.4.2Mittel
pdf_no_langDokumentsprache fehlt3.1.1Mittel
pdf_not_taggedDokument ist nicht getaggt1.3.1Schwer

Das Ergebnis erscheint als „PDF-Prüfung fertig. Geprüft: … · Probleme: … · Unklar (komprimiert): … · Unlesbar: …“. Die Kategorie unklar ist ehrlich gemeint: bei komprimierten Objektströmen lässt sich der Tagging-Zustand nicht sicher aus den Bytes ablesen, und das Werkzeug behauptet dann nichts.

Achtung

Der Abschnitt trägt den Hinweis: „PDFs werden nicht automatisch repariert — echte Barrierefreiheit (Tags/Struktur) entsteht beim getaggten Export aus der Quelle. Das Tool zeigt, welche Dokumente betroffen sind.“ Ein PDF wird also nie verändert; die Reparatur passiert im Ausgangsdokument.

KI-Alt-Texte

Erzeugt Alt-Text-Vorschläge – ausschließlich für Bilder ohne vorhandenen Alt-Text. Der Hilfetext im Modul: „Erzeugt Alt-Text-Vorschläge nur für Bilder OHNE vorhandenen Alt-Text. Nichts wird automatisch veröffentlicht.“

ElementVerhalten
Anzahl:Obergrenze für einen Durchlauf
Vorschläge erzeugenstartet die Generierung; Ergebnis: „Erzeugt: … · Erneut vorgelegt: … · Fehler: …“
Offene Vorschläge (<Anzahl>)Liste der zu prüfenden Vorschläge; leer: „Keine offenen Vorschläge.“
TextfeldPlatzhalter „Alt-Text – leer lassen = dekoratives (leeres) alt“
Abzeichen dekorativ → leeres altDie KI hat das Bild als rein dekorativ eingeschätzt.
Übernehmenschreibt nach tl_files.meta: „Alt-Text übernommen (in tl_files.meta geschrieben).“
Verwerfen„Vorschlag verworfen.“
Achtung

Ein manuell gepflegter Alt-Text wird niemals überschrieben. Der Versuch wird abgewiesen mit: „Nicht übernommen: es existiert bereits ein manueller Alt-Text (wird nie überschrieben).“ Fehlt die Datei: „Nicht übernommen: Datei nicht gefunden.“

Weil der Alt-Text in tl_files.meta landet, wirkt eine Freigabe an jeder Stelle, an der die Datei eingebunden ist. Bilder werden mit maximal 4 MB an den Anbieter übertragen; größere werden mit „Bild zu groß (<Größe> KB, max <max> KB).“ abgelehnt. Für diese Funktion ist ein Vision-fähiges Modell nötig.

Ist der Egress-Schalter aktiv, erscheint statt der Schaltfläche: „„Keine externen Aufrufe“ ist aktiv – Generierung gesperrt. In den Einstellungen freigeben.“

ARIA-Namen

Sammelt Elemente ohne barrierefreien Namen aus dem Frontend-Scan und setzt nach Freigabe zur Laufzeit ein aria-label. Die Modulbeschreibung im Backend: „Elemente ohne barrierefreien Namen (Links/Schaltflächen/iframes ohne Text) werden beim Frontend-Scan gesammelt. Prüfe den vorgeschlagenen Namen, passe ihn an und übernimm ihn — er wird dann zur Laufzeit als aria-label gesetzt, aber nur wo das Element noch keinen Namen hat (nie überschrieben). Der saubere Fix gehört langfristig ins Template.“

RegelBezeichnung im Modul
link-nameLink ohne erkennbaren Namen
button-nameSchaltfläche ohne Namen
frame-titleiframe ohne Titel
aria-input-field-nameEingabefeld ohne Namen
input-button-nameButton-Eingabe ohne Namen
aria-command-nameBedienelement ohne Namen
aria-toggle-field-nameUmschalter ohne Namen
input-image-altBild-Button ohne Alt-Text

Die Liste ist in Offen und Aktiv geteilt. Jeder Eintrag zeigt Selektor: und ein Feld mit dem Platzhalter „Barrierefreier Name (aria-label)“. KI-Vorschlag füllt es aus dem Anbieter („KI-Vorschlag eingetragen: „…“. Bitte prüfen und übernehmen.“), Übernehmen aktiviert den Namen („Name übernommen und aktiv: „…“.“), Deaktivieren nimmt ihn wieder zurück. Ohne Eingabe: „Bitte einen Namen eingeben.“ Ist noch nichts da: „Keine offenen Elemente. Führe im Dashboard einen Voll-Scan aus.“

Hinweis

Freigegebene Namen werden auf jeder Seite ausgeliefert; ein Selektor, der auf der aktuellen Seite nicht greift, bleibt wirkungslos. Ein Fix an Kopf- oder Fußzeile wirkt dadurch site-weit. Gesetzt wird das Attribut nur dort, wo das Element noch keinen Namen hat. Auf einem nicht lizenzierten Startpunkt wird gar nichts eingefügt.

KI-Untertitel

Erzeugt WebVTT-Untertitel aus Video- und Audiodateien. Hilfetext: „Erzeugt WebVTT-Untertitel aus Video/Audio (Whisper). KI-Entwurf – muss geprüft und freigegeben werden, bevor er als Datei gespeichert wird. Limit 25 MB pro Datei; nur Anbieter OpenAI / kompatibel.“

ElementVerhalten
Medien (<Anzahl>)Liste der gefundenen Dateien; verwendete Dateien tragen das Abzeichen verwendet. Leer: „Keine Audio-/Videodateien in der Dateiverwaltung gefunden.“
Sprache:Sprachcode für die Transkription
Untertitel erzeugen / Neu erzeugen„Untertitel-Entwurf erzeugt (<Sprache>, <ms> ms). Bitte prüfen und freigeben.“
Entwurf speichern„Entwurf gespeichert.“ – der Text bleibt Entwurf
Freigeben & speichernschreibt die VTT-Datei: „Untertitel freigegeben und gespeichert: <Pfad>“
Status:Entwurf, ungeprüft · freigegeben · verworfen

Für die Einbindung gilt der Hinweis: „Untertitel danach im Video-Element als <track> einbinden (Contao 5.4+ / zoglo). Whisper-Zeitstempel und Text bitte gegenlesen.“ Das Paket setzt das zusätzlich selbst um: Für jedes <video> ohne eigenen <track> sucht es zu jeder lokalen Quelle eine gleichnamige Untertiteldatei nach dem Muster clip.mp4clip.de.vtt und fügt ein <track kind="captions"> ein. Die erste Sprache wird als default markiert. Videos ohne passende Datei bleiben unangetastet.

Achtung

Harte Grenze von 25 MB je Datei: „Datei größer als 25 MB – bitte kürzen/komprimieren oder via Konsole verarbeiten.“ Untertitel funktionieren nur mit den Anbietern OpenAI und kompatibel; sonst: „Untertitel benötigen einen Whisper-kompatiblen Anbieter (OpenAI oder „kompatibel“). Aktueller Anbieter unterstützt keine Audio-Transkription.“

Einfache / Leichte Sprache

Erzeugt vereinfachte Fassungen der Seitentexte, die Besucherinnen und Besucher im Frontend umschalten können. Der Disclaimer steht direkt über dem Modul: „KI erstellt Entwürfe in vereinfachter Sprache. Keine zertifizierte Leichte Sprache – menschliche Prüfung nötig, nichts wird automatisch veröffentlicht.“

Einstellungen

FeldWerteStandard
Funktion aktiv (Umschalter im Frontend anzeigen)je Startpunktaus
Angebotene Register:Einfache Sprache, Leichte Sprachebeide
Umschalter:im Komfort-Overlay, Floating-Button, Nav-Link-ModulOverlay an, Button an, Nav-Link aus

Wird die Aktivierung gespeichert, meldet das Modul „Einstellungen gespeichert (Aktivierung für diese Domain).“ – ein bewusster Unterschied zu den install-weiten Feldern.

Entwürfe erzeugen und freigeben

  1. Unter Seite wählen eine Seite auswählen (Platzhalter „– bitte wählen –“) oder ★ Alle Inhalte (ganze Website). Für den zweiten Fall gilt: „Bereich: ganze Website – alle Inhaltselemente (auch modul-/theme-eingebundene Karten).“
  2. Register: und Sprache: setzen, dann Laden.
  3. Entwürfe erzeugen (<Anzahl> Elemente). Ergebnis: „Erzeugt: … · Übersprungen: … · Fehler: …“.
  4. Je Element stehen Original: und Entwurf: nebeneinander. Speichern, Freigeben oder 🔒 Sperren. Mit Alle Entwürfe freigeben geht es gebündelt.

Statuswerte je Element: kein Entwurf, Entwurf, ungeprüft, freigegeben, verworfen. Die Freigabe bestätigt: „Entwurf freigegeben (erscheint im Frontend bei aktivem Umschalter).“ Ohne Entwurf steht dort: „Noch kein Entwurf – oben „Entwürfe erzeugen“.“

Hinweis

🔒 Sperren heißt „Freigeben + vor Neu-Generierung schützen“ und bestätigt mit „Bereich gesperrt – wird nicht mehr neu generiert und bleibt live.“ Genau das braucht man für redaktionell nachgearbeitete Texte, die ein späterer Sammellauf sonst überschreiben würde. 🔓 Entsperren hebt es wieder auf.

Wie die Umschaltung im Frontend wirkt

Der Umschalter setzt das Cookie accessplus_simple (Wert einfach oder leicht) und lädt die Seite neu. Die freigegebenen Entwürfe werden dann im gerenderten HTML an die Stelle des Originaltexts gesetzt. Das ist bewusst so gebaut: Es funktioniert auch bei Theme- und RockSolid-Elementen, die über eigene Templates rendern. Die Inhalte in tl_content werden dabei nie verändert; Textstellen ohne freigegebenen Entwurf bleiben unverändert stehen. Anfragen mit gesetztem Cookie gelten als privat und landen nicht im geteilten Cache.

Zur Rückkehr in die Normalfassung dient der Eintrag Alltagssprache.

Komfort-Overlay

Eine optionale Bedienleiste im Frontend mit Anzeige- und Komfortoptionen. Der Hinweis im Modul ist Teil des Produkts: „Komfort-/Anzeigeoptionen fürs Frontend. Kein Ersatz für barrierefreie Inhalte und nicht als „Barrierefreiheits-Lösung“ zu vermarkten.“

Aktivierung

Der Schalter Overlay im Frontend anzeigen gilt je Domain – der Abschnitt sagt es selbst: „Diese Aktivierung gilt nur für die gewählte Domain. Design und Funktionen unten gelten install-weit für alle Domains.“ Standard: aus.

Design

FeldWerteStandard
Button-FarbeFarbwert#1d4ed8
Button-PositionUnten rechts · Unten links · Mitte rechts · Mitte links · Oben rechts · Oben linksUnten rechts

Funktionen

30 einzeln abschaltbare Funktionen in vier Gruppen; standardmäßig sind alle aktiv.

GruppeFunktionen
ModiEpilepsie-sicherer Modus · Sehbehinderten-Modus · ADHS-freundlicher Modus
LesenInhaltliche Skalierung · Schriftgröße · Zeilenhöhe · Buchstabenabstand · Lesbare Schriftart · Legasthenie-Schrift · Titel hervorheben · Links hervorheben · Kognitives Lesen · Link-Navigator
OrientierungDunkler Kontrast · Heller Kontrast · Hoher Kontrast · Einfarbig · Animationen stoppen · Töne stummschalten · Großer Cursor · Bilder ausblenden · Lesehilfe (Leselineal) · Vorlesen (Text in Sprache) · Fokus hervorheben · Hover hervorheben · Textausrichtung
FarbenTextfarbe anpassen · Titelfarbe anpassen · Linkfarbe anpassen · Hintergrundfarbe anpassen

Die Bestandteile werden lokal ausgeliefert – kein externer Loader, kein Inline-Skript, keine Tokens, kein Tracking.

Erklärung & Meldekanal

Stellt die Pflichtangaben zusammen und speichert sie je Domain. Zwei Hinweise stehen fest im Modul:

  • „Dies ist keine Rechtsberatung. Das Tool stellt die Pflichtangaben zusammen; für die rechtliche Richtigkeit ist der Betreiber verantwortlich.“
  • „Diese Erklärung gilt für die gewählte Domain. Jede Domain hat ihre eigene Erklärung; ohne eigene Angaben greift die install-weite Vorlage („Alle Domains“).“
AbschnittFeldWerte / Standard
AngabenBetreiber / Organisationfrei
Website (URL)frei
Stand der Vereinbarkeitvollständig konform · teilweise konform (Standard) · nicht konform
Nicht barrierefreie Inhalte (frei)Freitext für bekannte Barrieren
Kontakt / MeldekanalKontakt-Namefrei
Kontakt-E-Mailfrei
Kontakt-Telefonfrei
E-Mail für Meldungen (Meldekanal)Empfänger der Barriere-Meldungen
Erstellung & DurchsetzungErstellt am (Datum)frei
MethodeSelbstbewertung (Standard) · Externe Prüfung
Durchsetzungsverfahren / Schlichtungsstelle (frei)Freitext

Aus den aktuellen Befunden leitet das Modul einen Vorschlag ab: „Status-Vorschlag aus aktuellen Befunden: <Status> (nur Empfehlung).“ Die Entscheidung bleibt beim Betreiber. Eine ungültige Meldekanal-Adresse wird abgewiesen: „Meldekanal-E-Mail ungültig — nicht gespeichert.“

Zur Veröffentlichung: „Im Frontend einbinden: Modul-Typ Barrierefreiheitserklärung (zeigt diese Angaben) und Meldekanal (Meldeformular) auf eine Seite legen.“ Siehe Frontend-Module.

Meldungen (Posteingang)

Ein eigener Backend-Eintrag Meldungen („Eingegangene Barriere-Meldungen“, do=accessplus_feedback). Eingänge werden nur über das Frontend-Formular erzeugt – eine „Neu“-Schaltfläche gibt es nicht.

AbschnittFelder
MeldungName, E-Mail, URL, Nachricht – alle schreibgeschützt
Statusnew · progress · done (Standard new) – das einzige bearbeitbare Feld

Es stehen die Aktionen Bearbeiten, Löschen und Anzeigen zur Verfügung; Liste und Filter kommen von Contao.

Hinweis

Ist kein Startpunkt lizenziert, wird der Posteingang schreibgeschützt und meldet: „Keine gültige Lizenz für einen Startpunkt: Die Meldungen sind nur lesbar. Die Lizenz wird unter Seitenstruktur → Startpunkt bearbeiten → AccessPlus Licence management hinterlegt.“ Bereits eingegangene Meldungen werden dabei weder ausgeblendet noch gelöscht – sie sind die rechtliche Korrespondenz des Betreibers, keine Bundle-Funktion.

Verlauf / Undo

Jede angewendete Änderung wird protokolliert. Der Tab Verlauf zeigt eine Tabelle mit Zeit, Aktion, Ziel, Vorher → Nachher und Benutzer. War vorher kein Wert gesetzt, steht dort ∅ (kein alt).

Rückgängig stellt den vorherigen Zustand her und legt den Vorschlag wieder offen: „Änderung rückgängig gemacht; Vorschlag wieder offen.“ Wurde das Ziel inzwischen anderweitig geändert oder die Aktion bereits zurückgenommen: „Rückgängig nicht möglich (inzwischen geändert oder bereits rückgängig).“ Zurückgenommene Einträge tragen die Markierung rückgängig. Ist noch nichts passiert: „Noch keine angewendeten Änderungen.“

Monitoring

Damit der Zustand zwischen zwei bewussten Scans nicht wegdriftet, prüft das Paket auf zwei Wegen nach – beide ausschließlich lokal, ohne externen Aufruf:

  • Nach dem Speichern. Wird ein Inhaltselement, eine Seite oder ein Formularfeld gespeichert, laufen die Datenbank-Checks erneut – gedrosselt über das Intervall aus den Einstellungen. Steuerbar über Nach Speichern automatisch neu prüfen.
  • Über den Contao-Cron. Ein täglicher Cronjob stößt denselben Lauf an. Er ignoriert den Speichern-Schalter, bleibt aber an dasselbe Intervall gebunden. Contaos „Poor-Man-Cron“ genügt – ein System-Cron ist nicht erforderlich.

Ein Fehler beim Monitoring blockiert nie den Speichervorgang der Redaktion; er wird protokolliert und übersprungen.

Auf der Konsole zeigt accessplus:monitor zusätzlich die Veränderung: „Score: … · Offen: …“ und „Seit letztem Lauf: +… neu · -… behoben · Score …“ – beim allerersten Lauf „Erstlauf — kein Vergleich.“

Frontend-Module

Drei Modultypen in der Gruppe Barrierefreiheit:

ModultypBeschreibungTemplate
Barrierefreiheitserklärung„Zeigt die Erklärung zur Barrierefreiheit“mod_accessplus_statement
Barriere-Meldekanal„Formular zum Melden von Barrieren“mod_accessplus_feedback
Einfache/Leichte Sprache – Umschalter„Links zum Umschalten der Sprachebene“mod_accessplus_simple_switch

Alle drei benutzen die Standard-Palette: Titel, Überschrift, Typ, Zugriffsschutz und CSS-ID/Klasse. Bestehende tl_module-Felder werden nicht verändert.

Barrierefreiheitserklärung

Rendert die Angaben aus dem Tab Erklärung unter der Überschrift „Erklärung zur Barrierefreiheit“, mit den Abschnitten Stand der Vereinbarkeit, Nicht barrierefreie Inhalte, Erstellung dieser Erklärung, Feedback und Kontaktangaben und Durchsetzungsverfahren.

Barriere-Meldekanal

Formular mit der Überschrift Barriere melden und den Feldern Name (optional), E-Mail (optional, für Rückfragen), Betroffene Seite (URL, optional), Ihre Meldung sowie der Schaltfläche Meldung absenden. Ein verstecktes Feld „Website (bitte leer lassen)“ dient als Spam-Falle. Nach dem Absenden: „Vielen Dank — Ihre Meldung wurde übermittelt.“

PrüfungMeldung
Nachricht fehlt oder zu lang„Bitte eine Nachricht eingeben (max. 5000 Zeichen).“
E-Mail unplausibel„E-Mail-Adresse ungültig.“
URL ohne Schema„Seiten-URL muss mit http(s):// beginnen.“
Name zu lang„Name zu lang.“
Token abgelaufen„Sicherheits-Token ungültig. Bitte erneut senden.“

Ist im Tab Erklärung eine E-Mail für Meldungen hinterlegt, geht zusätzlich eine Benachrichtigung mit dem Betreff „Neue Barrierefreiheits-Meldung“ dorthin.

Umschalter Einfache/Leichte Sprache

Navigations-Links zum Wechsel der Sprachebene, beschriftet mit „Sprache wählen“. Nur nötig, wenn in den Einstellungen die Variante Nav-Link-Modul gewählt wurde – Floating-Button und Overlay-Variante kommen ohne Modul aus.

Teil 3 – Für Entwickler

Konsolenbefehle

Sechs Befehle, alle unter dem Namensraum accessplus:. Alle prüfen zuerst, ob mindestens ein Startpunkt lizenziert ist; sonst brechen sie ab mit „Keine gültige Lizenz für einen Startpunkt hinterlegt.“

BefehlBeschreibung (aus --help)Optionen (Standard)
accessplus:scanRun the accessibility checks over the content.
accessplus:monitorRe-check accessibility and show the change since the previous run.
accessplus:pdf:scanCheck linked PDFs for title, language and tags.
accessplus:alt:generateGenerate AI alt-text suggestions for images without alt text (review).--limit (25)
accessplus:simplifyGenerate AI drafts in plain/easy language for all pages (review).--register (einfach) · --lang (de) · --limit (1000)
accessplus:subtitles:generateGenerate AI subtitle drafts (VTT) for media without subtitles (review).--lang (de) · --limit (10)
Hinweis

Befehlsnamen, Beschreibungen und Optionshilfen sind bewusst englische Literale: Symfony liest sie für list und --help aus, bevor das Contao-Framework für den Befehl initialisiert ist – der Sprachlader steht dort noch nicht zur Verfügung. Die Laufzeitausgabe der Befehle ist dagegen vollständig übersetzt, etwa „Scan fertig. Neu: … · Wieder offen: … · Behoben: … · Offen gesamt: … · Score: …“.

Beispiel:

vendor/bin/contao-console accessplus:alt:generate --limit=25
vendor/bin/contao-console accessplus:simplify --register=leicht --lang=de --limit=200
vendor/bin/contao-console accessplus:subtitles:generate --lang=de --limit=5

Die drei KI-Befehle erzeugen ausschließlich Entwürfe und hängen die Aufforderung „Bitte im Backend prüfen und freigeben.“ an. Sie respektieren den Egress-Schalter: Ist er aktiv, ist der Lauf ein Nulldurchgang mit klarer Meldung.

Datenbanktabellen

Acht additive Tabellen. Keine Contao-Kerntabelle wird verändert.

TabelleInhaltBackend-Bildschirm
tl_accessplus_findingBefunde aus allen Quellen (Datenbank, Frontend, manuell); dedupliziert über fingerprinteigene Bericht-Oberfläche
tl_accessplus_runLauf-Historie mit Score und KategoriezählernDashboard
tl_accessplus_altsuggestionAlt-Text-VorschlägeTab „KI-Alt-Texte“
tl_accessplus_ariafixbarrierefreie Namen (Selektor, Regel, Wert)Tab „ARIA-Namen“
tl_accessplus_trackUntertitel-Aufträge und VTT-InhalteTab „KI-Untertitel“
tl_accessplus_simplificationEntwürfe in einfacher/leichter SpracheTab „Einfache Sprache“
tl_accessplus_auditPrüfpfad angewendeter ÄnderungenTab „Verlauf“
tl_accessplus_feedbackBarriere-Meldungen aus dem Frontendechtes DCA-Modul do=accessplus_feedback
Hinweis

Bis auf tl_accessplus_feedback sind alle DCAs closed und notEditable – sie existieren, damit contao:migrate die Tabellen anlegt und die Models eine Definition haben. Die eigentliche Oberfläche rendert das Bundle selbst. Diese Tabellen sind Speicher, keine Redaktionsbildschirme.

Zwei Spalten verdienen Erwähnung: rootId auf tl_accessplus_finding und tl_accessplus_run ordnet einen Befund einem Startpunkt zu; 0 bedeutet install-weit bzw. geteilt (etwa bei tl_files). fingerprint ist der Dedup-Schlüssel und trägt einen Unique-Index.

Dateien und Verzeichnisse

PfadZweck
var/accessplus/Der gesamte eigene Zustand des Pakets: Einstellungen, verschlüsselt gespeicherte Zugangsdaten und der Lizenzstand je Startpunkt. Wird beim ersten Schreibzugriff angelegt. Die Struktur darin ist intern und weder zur Bearbeitung von Hand noch als Schnittstelle gedacht.
public/bundles/vtinnovationsaccessplus/Frontend- und Backend-Assets (Overlay, Sprachumschalter, ARIA-Injektor, Scanner, axe.min.js).
Achtung

var/accessplus/ vollständig in Sicherungen und Deployments mitnehmen. Geht das Verzeichnis verloren, muss der API-Schlüssel neu hinterlegt und jede Lizenz neu aktiviert werden. In die Versionsverwaltung gehört es nicht.

Routen

Fünf Routen, geladen über config/routes.yaml durch das Contao-Manager-Plugin.

NamePfadMethodeZweck
vtinnovations_accessplus_db_analyze/contao/accessplus/db-analyzePOSTstartet die Datenbank-Analyse des Voll-Scans
vtinnovations_accessplus_axe_ingest/contao/accessplus/axe-ingestPOSTnimmt die axe-Ergebnisse der gescannten Seiten entgegen
vtinnovations_accessplus_aria_ingest/contao/accessplus/aria-ingestPOSTnimmt Elemente ohne barrierefreien Namen entgegen
vtinnovations_accessplus_highlight/contao/accessplus/highlightGETVorschau „Auf der Seite zeigen“
vtinnovations_accessplus_service_callback/rest/api/v1/accessplus-license-updaterServer-zu-Server-Rückruf für Lizenzänderungen

Die ersten vier liegen unter dem Backend-Präfix /contao und damit hinter der Backend-Firewall; die Controller prüfen das Request-Token zusätzlich selbst. Contaos automatische Token-Prüfung ist für sie abgeschaltet, weil sie den Token nur aus dem POST-Body liest und die JSON-Anfragen ihn im Header mitschicken.

Achtung

Der Pfad /rest/api/v1/accessplus-license-updater ist durch das Hersteller-Protokoll festgelegt und darf nicht umgeschrieben werden. Er liegt bewusst nicht im Backend-Bereich – der Aufrufer ist ein Server, kein angemeldeter Benutzer, und wird kryptografisch authentifiziert. Reverse-Proxys, WAF-Regeln oder Redirects, die diesen Pfad blockieren, verhindern, dass Lizenzänderungen ankommen.

Die Gegenstellen für Aktivierung und Signalisierung sind fest im Code verdrahtet und lassen sich weder über Konfiguration noch über Umgebungsvariablen umlenken.

Hooks, Callbacks und Cron

IntegrationHook / ZielAufgabe
OverlayInjectionListenergeneratePagebindet das Komfort-Overlay ein, wenn es für den Startpunkt aktiviert ist
SimpleSwitchInjectorgeneratePagebindet den Sprachumschalter ein
AriaInjectormodifyFrontendPageliefert freigegebene aria-label-Zuordnungen aus (max. 500 je Seite)
SimpleLanguageRenderermodifyFrontendPageersetzt Originaltexte durch freigegebene Entwürfe
SubtitleTrackInjectormodifyFrontendPageergänzt <track kind="captions"> an Videos ohne Track
MonitorOnChangeListenerconfig.onsubmit auf tl_content, tl_page, tl_form_fieldgedrosselter Re-Scan nach dem Speichern
RootRegistrationSectioninput_field_callback + config.onsubmit_callback auf tl_pageLizenzabschnitt im Startpunkt
FeedbackInboxGateconfig.onload_callback auf tl_accessplus_feedbackschaltet den Posteingang ohne Lizenz schreibgeschützt
MonitorCroncontao.cronjob, Intervall dailytäglicher Re-Scan
LicenseRefreshCroncontao.cronjob, Intervall hourlyerneuert den Lizenzstand, wenn die signierte Frist abgelaufen ist
UsageSignalListenerkernel.terminatesendet Signale erst nach der Antwort, nie währenddessen

Sämtliche Frontend-Einbindungen prüfen zuerst, ob der aktuelle Startpunkt lizenziert ist. Ist er es nicht, geben sie den Puffer unverändert zurück – die Seite ist dann Byte für Byte die, die Contao ohne dieses Bundle ausliefern würde.

Erweiterungspunkte

Eigene Prüfungen

Der einzige vorgesehene Erweiterungspunkt: VTInnovations\AccessPlus\Check\CheckInterface implementieren. Über _instanceof wird die Klasse automatisch mit vtinnovations.accessplus.check getaggt und von CheckRegistry eingesammelt – keine weitere Registrierung nötig. Für Prüfungen über die Datenbank bietet AbstractDatabaseCheck die Verbindung, die aktiven Sprachen sowie tableExists() und columnExists(), mit denen eine Prüfung sauber aussetzt, wenn die Tabelle fehlt.

Eine Prüfung liefert Finding-Objekte mit checkId, wcagCriteria, severity, sourceType, ptable, pid, field, elementLabel, message und suggestion.

Templates

Die drei Frontend-Templates lassen sich wie üblich im Theme überschreiben: mod_accessplus_statement, mod_accessplus_feedback, mod_accessplus_simple_switch.

Was ausdrücklich kein Erweiterungspunkt ist

  • Die Automatik-Regel. AutoFixPolicy ist die einzige Stelle, die entscheidet, was als „Ein-Klick“ gilt und was live angewendet werden darf. Die Liste der live anwendbaren Prüfungen ist bewusst leer und durch einen Test festgenagelt.
  • Die Lizenz-Gegenstelle. Ziel-Host und Pfade sind Kompilierzeit-Konstanten ohne Setter und ohne Parameter.
  • Der Rückruf-Pfad. Durch das Protokoll festgelegt.
  • Der Funktionskatalog des Overlays. OverlayFeatures ist ein statischer Katalog; Backend und Injektor lesen dieselbe Quelle.
  • Die deutschen CLI-Texte. Befehlsname, Beschreibung und Optionshilfe sind englische Literale (siehe Konsolenbefehle).

Migrationen

Drei Migrationen laufen über contao:migrate und melden sich nur, wenn sie tatsächlich etwas zu tun haben:

MigrationWirkung
Umbenennung tl_tca11y_*tl_accessplus_*benennt Tabellen per RENAME TABLE um (Daten bleiben erhalten) und verschiebt var/tca11y nach var/accessplus
Umbenennung tl_vta11y_*tl_accessplus_*dasselbe für den zwischenzeitlichen Präfix; var/vta11yvar/accessplus
Ergänzung rootIdfügt die Spalte rootId auf tl_accessplus_finding und tl_accessplus_run hinzu und ordnet vorhandene Befunde ihrem Startpunkt zu

Wer von einer älteren Version mit einem der alten Präfixe aktualisiert, verliert also weder Befunde noch Lizenzen – vorausgesetzt, contao:migrate läuft und das Verzeichnis unter var/ ist beschreibbar.

Deployment und Cache

  • Nach jedem Update: contao:migrate, dann cache:clear. Auf einer Managed Edition erledigt contao:setup zusätzlich das Veröffentlichen der Assets.
  • Assets: Overlay, Sprachumschalter und ARIA-Injektor werden mit einem Versions-Parameter eingebunden, damit Browser-Caches beim Update sicher greifen. Diese Tags landen bewusst nicht in Contaos Combiner, weil dieser keine Query-Strings akzeptiert.
  • Page-Cache: Anfragen mit gesetztem Cookie accessplus_simple gelten als privat und landen nicht im geteilten Cache. Ohne Cookie ist die Seite unverändert cachefähig.
  • Mitzusichern: var/accessplus/ vollständig – siehe Dateien und Verzeichnisse.
  • Ausgehende Verbindungen: Für die Lizenzprüfung muss HTTPS nach außen möglich sein. Für die KI-Funktionen zusätzlich der Endpunkt des gewählten Anbieters – aber nur, wenn Keine externen Aufrufe deaktiviert wurde.
  • Eingehende Verbindungen: Der Rückruf-Pfad muss erreichbar bleiben, sonst wirken Lizenzänderungen erst über den stündlichen Nachlauf.

Fehlerbehebung

SymptomUrsache und Prüfung
Im Backend erscheint keine Gruppe Barrierefreiheit. Bundle nicht registriert oder Cache alt. vendor/bin/contao-console list accessplus ausführen; erscheint nichts, greift das Contao-Manager-Plugin nicht. Danach cache:clear.
Das Modul zeigt nur „Für diesen Startpunkt liegt keine gültige Lizenz vor. …“ Der gewählte Startpunkt ist nicht lizenziert. Lizenz unter Seitenstruktur → Startpunkt bearbeiten → AccessPlus Licence management hinterlegen.
„Für diesen Startpunkt ist keine Domain hinterlegt.“ Im Startpunkt unter Routing fehlt die Domain. Die Lizenz wird exakt an diesen Hostnamen gebunden – www.example.com und example.com sind verschiedene Hosts.
„Die Lizenz gilt nicht für die Domain dieses Startpunkts.“ Der eingetragene Hostname weicht vom lizenzierten ab. Häufig www.-Präfix oder ein Umlautdomain-Problem; für Letzteres ext-intl aktivieren.
„Auf diesem Server fehlt die benötigte Krypto-Erweiterung (libsodium).“ ext-sodium ist nicht aktiv. Ohne sie lässt sich kein Lizenzstand prüfen.
„Der Lizenzserver ist derzeit nicht erreichbar. Der bisherige Stand bleibt erhalten.“ Ausgehendes HTTPS blockiert oder Störung beim Hersteller. Der bisherige Stand gilt weiter, bis die signierte Frist abläuft. Später erneut Lizenz aktualisieren.
Die Lizenz wurde beim Hersteller geändert, die Installation merkt nichts. Der Server-Rückruf erreicht die Installation nicht (Firewall, WAF, Reverse Proxy, geänderter DNS). Der stündliche Nachlauf holt den Stand nach; prüfen Sie, ob /rest/api/v1/accessplus-license-updater von außen erreichbar ist.
KI-Schaltflächen fehlen oder sind gesperrt. Keine externen Aufrufe ist aktiv – Standard. Meldung: „„Keine externen Aufrufe“ ist aktiv – Generierung gesperrt. In den Einstellungen freigeben.“ Siehe Einstellungen.
„Kein API-Schlüssel hinterlegt. Bitte in den Einstellungen setzen.“ Der Schlüssel wurde nie gespeichert oder mit Schlüssel entfernen gelöscht. Achtung: Ein leeres Feld bedeutet unverändert, nicht löschen.
„Ungültige Basis-URL. Nur http(s) mit Hostname erlaubt.“ Beim Anbieter OpenAI-kompatibel muss eine vollständige Basis-URL eingetragen sein.
„Test nicht ausgeführt: „Keine externen Aufrufe“ ist aktiv. Zum Testen erst freigeben.“ Der Verbindungstest ist bei aktivem Egress-Schalter bewusst gesperrt.
Der Voll-Scan bleibt bei der Frontend-Phase stehen. Er läuft im Browser-Tab des Backends. Das Tab muss offen bleiben, bis „Fertig“ erscheint. Geschützte Seiten werden übersprungen – im Iframe erschiene nur die Anmeldemaske.
„Keine veröffentlichten, öffentlichen Seiten gefunden.“ Es gibt keine Seite vom Typ „regulär“, die veröffentlicht, nicht geschützt und innerhalb ihres Zeitfensters ist.
Es werden weniger Seiten gescannt als erwartet. Der Sweep ist auf 300 Seiten begrenzt; der Hinweis „auf <Anzahl> Seiten begrenzt.“ wird angezeigt, nie verschwiegen. Von dynamischen Listen (News, Termine) wird eine Stichprobe der 25 neuesten Detailseiten geprüft, weil alle dieselbe Vorlage nutzen.
Frontend-Befunde wirken falsch (z. B. Kontrastfehler durch Einblend-Animationen). Auf dem Dashboard Frontend-Befunde zurücksetzen und den Voll-Scan wiederholen. Siehe Dashboard.
„Nicht übernommen: es existiert bereits ein manueller Alt-Text (wird nie überschrieben).“ Kein Fehler, sondern die Regel: Redaktionell gepflegte Alt-Texte haben Vorrang. Wenn der Vorschlag besser ist, den Text direkt in der Dateiverwaltung ändern.
„Bild zu groß (<Größe> KB, max <max> KB).“ Für die Alt-Text-Erzeugung gilt eine Obergrenze von 4 MB je Bild.
Alt-Text-Vorschläge sind unbrauchbar oder es kommen keine. Das eingestellte Modell kann keine Bilder lesen. Im Feld Modell ein Vision-fähiges Modell eintragen.
„Untertitel benötigen einen Whisper-kompatiblen Anbieter …“ Nur OpenAI und OpenAI-kompatibel unterstützen die Audio-Transkription.
„Datei größer als 25 MB – bitte kürzen/komprimieren oder via Konsole verarbeiten.“ Harte Grenze der Transkription. Datei kürzen, komprimieren oder in Abschnitten verarbeiten.
Der Umschalter für einfache Sprache erscheint im Frontend nicht. Drei Bedingungen: Startpunkt lizenziert, Funktion aktiv für diesen Startpunkt gesetzt, und mindestens eine Umschalter-Variante gewählt. Für die Nav-Variante muss zusätzlich das Modul auf einer Seite liegen.
Der Umschalter erscheint, aber der Text bleibt gleich. Für die betreffenden Elemente ist noch kein Entwurf freigegeben. Nur freigegebene Entwürfe werden ersetzt; alles andere bleibt unverändert stehen.
Das Komfort-Overlay erscheint auf einer Domain nicht. Die Aktivierung gilt je Domain. Im Tab Overlay zuerst über die Domain-Leiste den richtigen Startpunkt wählen, dann Overlay im Frontend anzeigen setzen.
Untertitel erscheinen im Video nicht. Ergänzt wird nur bei einem <video> ohne eigenen <track>, und nur bei passender Benennung: clip.mp4clip.de.vtt im selben Verzeichnis.
Der Posteingang Meldungen lässt sich nicht bearbeiten. „Keine gültige Lizenz für einen Startpunkt: Die Meldungen sind nur lesbar. …“ Bestehende Meldungen bleiben bewusst sichtbar.
„Ungültiges Sicherheits-Token. Bitte erneut versuchen.“ Die Backend-Sitzung ist abgelaufen oder das Formular lag zu lange offen. Neu anmelden und die Aktion wiederholen.
Der Score springt ohne erkennbaren Anlass. Das Monitoring hat nach einem Speichervorgang oder über den Cron neu gescannt. Frequenz über Drossel-Intervall steuern; abschalten über Nach Speichern automatisch neu prüfen.
Nach einem Update fehlen Befunde oder Lizenzen. contao:migrate wurde nicht ausgeführt oder var/ ist nicht beschreibbar. Siehe Migrationen.
Overlay oder Umschalter verhalten sich nach einem Update seltsam. Alte Asset-Dateien in public/bundles/vtinnovationsaccessplus/. contao:setup bzw. assets:install ausführen und den Browser-Cache leeren.

Bekannte Einschränkungen

  • Der Score ist kein Konformitätsnachweis. Er ist im Produkt selbst als Richtwert gekennzeichnet und ersetzt keine Prüfung durch eine Prüfstelle.
  • Automatische Prüfungen finden nicht alles. Verständlichkeit, sinnvolle Bedienreihenfolge, aussagekräftige Alternativtexte – das bleibt menschliche Arbeit. Genau deshalb trennt das Dashboard „Ein-Klick“ und „Nur manuell“, statt Häkchen zu verteilen.
  • Die Datenbank-Checks sehen nur die Datenbank. Überschriften, die fest in einem Template stehen, tauchen dort nicht auf; sie erreicht erst die Frontend-Analyse.
  • Der Frontend-Scan ist auf 300 Seiten begrenzt und überspringt geschützte Seiten. Von dynamischen Listen wird eine Stichprobe geprüft.
  • Der Frontend-Scan braucht ein offenes Backend-Tab. Er läuft im Browser, nicht auf dem Server.
  • PDFs werden nie repariert. Bei komprimierten Objektströmen bleibt der Tagging-Zustand ausdrücklich „unklar“.
  • Untertitel: 25 MB je Datei, nur mit Whisper-fähigem Anbieter.
  • Alt-Text-Erzeugung: 4 MB je Bild, Formate jpg, jpeg, png, gif, webp, Vision-Modell erforderlich.
  • Kein Auto-Publish. Es gibt derzeit keine Prüfung, deren Behebung ohne menschliche Freigabe live angewendet wird – das ist eine bewusste Festlegung, keine Lücke.
  • Einfache Sprache ist keine zertifizierte Leichte Sprache und wird durch Ersetzung im gerenderten HTML umgesetzt; Textstellen ohne freigegebenen Entwurf bleiben unverändert.
  • ARIA-Namen sind eine Zwischenlösung. Das Modul sagt es selbst: der saubere Fix gehört ins Template.
  • Das Komfort-Overlay ist ausdrücklich kein Ersatz für barrierefreie Inhalte.
  • Ohne Lizenz ist alles aus. Es gibt weder Testzeitraum noch kostenlose Stufe: Was nicht aktiv ist, verhält sich für diesen Startpunkt wie ein nicht installiertes Paket.

Deinstallation

  1. Optional: Lizenzen entfernen. Je Startpunkt über Lizenz entfernen + Entfernen bestätigen. Bestätigung: „Lizenz entfernt. Für diesen Startpunkt gilt wieder das Contao-Standardverhalten.“
  2. Optional: Meldungen sichern. Barriere-Meldungen sind Ihre Korrespondenz mit Nutzerinnen und Nutzern. Vor dem Entfernen aus tl_accessplus_feedback exportieren.
  3. Frontend-Module entfernen. Module vom Typ Barrierefreiheitserklärung, Barriere-Meldekanal und Einfache/Leichte Sprache – Umschalter aus den Layouts und Artikeln nehmen.
  4. Paket entfernen. Im Contao Manager unter PaketeInstallierte Pakete, oder auf der Konsole:
    composer remove vtinnovations/accessplus
    vendor/bin/contao-console cache:clear
  5. Rückstände aufräumen. Contao entfernt die Tabellen nicht automatisch. Nach einem Backup können die acht Tabellen tl_accessplus_* und das Verzeichnis var/accessplus/ gelöscht werden.
Hinweis

Bereits übernommene Alt-Texte bleiben erhalten: Sie stehen in tl_files.meta und gehören damit Contao, nicht dem Bundle. Ebenso bleiben freigegebene Untertiteldateien in der Dateiverwaltung liegen. Verloren gehen dagegen Befunde, Lauf-Verlauf, Entwürfe, ARIA-Namen und der Prüfpfad – prüfen Sie vor dem endgültigen Löschen, ob Sie etwas davon aufheben möchten.