Markus Michalski FAQ

Barrierefreiheit-Widget: Technische Details

Barrierefreiheit-Widget für Sylius - Ablauf-Diagramm, Plugin-Struktur, Entity- und Migrations-Übersicht

English Version

Zurück zur Übersicht

Barrierefreiheit-Widget: Technische Details

Live Demo: Teste dieses und weitere Plugins live — ohne Installation, ohne Risiko: demo.markus-michalski.net

Ablauf

graph TD
    A["Storefront-Request"] --> B["WidgetConfigResolverInterface"]
    H["Shop-API-Request"] --> B
    B --> C["ChannelSettingsRepositoryInterface"]
    C --> D[("mmd_sylius_accessibility_channel_settings")]
    D --> E{"Zeile aktiv?"}
    E -->|"Nein"| F["Kein Widget / HTTP 404"]
    E -->|"Ja"| G["WidgetConfig"]
    G --> I["Twig Hooks: stylesheets, javascripts, header, offcanvas"]
    G --> J["AccessibilitySettingsProvider (Shop API)"]

Das Ergebnis wird einmal pro Request und Channel-Code zwischengespeichert (WidgetConfigResolver, kernel.reset), da mehrere Storefront-Templates auf derselben Seite denselben Channel abfragen. Ein Datenbankfehler wird nicht zwischengespeichert.

Bundle und Ressourcen

Element Wert
Composer-Paket mmd/sylius-accessibility-plugin
Bundle-Klasse Mmd\SyliusAccessibilityPlugin\MmdSyliusAccessibilityPlugin
Konfigurationsbaum mmd_sylius_accessibility, bewusst leer
Sylius-Ressource mmd_sylius_accessibility_plugin.accessibility_settings (Doctrine ORM)
Admin-Route (Index) mmd_sylius_accessibility_plugin_admin_accessibility_settings_index unter /%sylius_admin.path_name%/accessibility-channel-settings (alle CRUD-Routen außer show)
Shop-API-Operation GET /shop/accessibility-settings (unter dem API-Präfix /api/v2)
Konsolenbefehl mmd:accessibility:setup
Sidebar-Gruppe MMKreativ Plugins (Code mmd_plugins, gemeinsam mit anderen MMKreativ-Plugins)

Plugin-Struktur

src/
├── Api/
│   ├── AccessibilitySettingsProvider.php     # API Platform State Provider
│   └── Resource/AccessibilitySettings.php    # API-Resource (GET /shop/accessibility-settings)
├── DependencyInjection/
│   ├── Configuration.php
│   └── MmdSyliusAccessibilityExtension.php   # Bundle-Extension, Doctrine-/Grid-/Hook-Prepend
├── Command/SetupCommand.php                  # mmd:accessibility:setup
├── Entity/
│   ├── ChannelSettings.php                   # einzige eigene Tabelle
│   ├── ChannelSettingsInterface.php
│   └── WidgetPosition.php                    # Enum: bottom_right, bottom_left
├── Form/Type/ChannelSettingsFormType.php     # @internal
├── Menu/
│   ├── AdminMenuListener.php                 # @internal
│   └── MenuGroup.php                         # "MMKreativ Plugins"-Sidebar-Gruppe
├── Migrations/Version20261003140000.php
├── Settings/
│   ├── ChannelSettingsRepository.php
│   └── ChannelSettingsRepositoryInterface.php
├── Twig/AccessibilityTwigExtension.php       # @internal
└── Widget/
    ├── WidgetConfig.php
    ├── WidgetConfigResolver.php
    └── WidgetConfigResolverInterface.php
config/                                       # services, admin-Routen, Grid, Twig Hooks
templates/                                    # shop/ (Skip-Link, Ziel, Widget, Stylesheets, JavaScripts), admin/
translations/                                 # messages, flashes, validators (de, en)
Resources/public/                             # accessibility.css, accessibility-early.js, accessibility.js

Entity

Eine einzige Tabelle, mmd_sylius_accessibility_channel_settings, geschlüsselt über channel_code statt über einen Fremdschlüssel - das Plugin braucht dafür keine Sylius-Core-Tabelle im eigenen Mapping.

Spalte Typ Bedeutung
id integer, auto increment Primärschlüssel
channel_code string(255), unique Channel-Code, kein Fremdschlüssel
enabled boolean Widget an/aus (Standard aus)
position string(16) bottom_right / bottom_left
skip_link_enabled boolean Skip-Link an/aus
show_font_size boolean Werkzeug Schriftgröße
show_contrast boolean Werkzeug Kontrast
show_color_filter boolean Werkzeug Farbfilter
show_blue_light boolean Werkzeug Blaulichtfilter
show_animations boolean Werkzeug Animationen reduzieren

Frontend

Reines JavaScript und CSS ohne Build-Schritt. accessibility-early.js hält Schema, Speicherung und Anwenden der Einstellungen und stellt sie als window.MmdAccessibility bereit; accessibility.js baut das Panel-Verhalten darauf auf. Das Widget sendet keine Netzwerkanfragen.