Markus Michalski FAQ

Sylius Media Alt Text: Erweiterbarkeit

Sylius Media Alt Text erweitern: Resolver und Manager als Services, eigene Fallback-Provider mit Tag und Priorität, weitere Bildtypen über die Registry sowie Normalizer-Priorität.

English Version

Zurück zur Übersicht

Sylius Media Alt Text: Erweiterbarkeit

Diese Dokumentation bezieht sich immer auf die aktuellste veröffentlichte Version.

Services

Service / Interface Zweck
Mmd\SyliusMediaAltTextPlugin\Resolver\AltTextResolverInterface Löst den Text eines Bildes auf (resolve, resolveWithFallback, isDecorative)
Mmd\SyliusMediaAltTextPlugin\Manager\AltTextManagerInterface Schreibt Texte und Kennzeichen eines Bildes (apply), validiert dabei Sprache und Länge

Beide Interfaces sind als öffentliche Alias-Services registriert und lassen sich per Autowiring einbinden. AltTextManagerInterface::apply() ersetzt alle Texte eines Bildes und persistiert sie, ruft aber kein flush() auf, das übernimmt der Aufrufer. Mit MediaAltTextSettingsProvider::isActive() fragst Du den Schalter „Alt-Texte ausgeben“ ab.

Fallback-Provider

Ein Fallback-Provider liefert den Text, wenn kein gepflegter Text da ist. Das Plugin bringt OwnerNameFallbackProvider mit: Er nimmt den Produkt- bzw. Kategorienamen, bei Avatars den Namen des Admin-Benutzers.

Eigene Provider implementieren das Interface:

use Mmd\SyliusMediaAltTextPlugin\Resolver\AltTextFallbackProviderInterface;
use Sylius\Component\Core\Model\ImageInterface;

final class MyFallbackProvider implements AltTextFallbackProviderInterface
{
    public function supports(ImageInterface $image): bool
    {
        return $image instanceof MyImage;
    }

    public function fallbackFor(ImageInterface $image, string $locale, bool $exactLocale = false): ?string
    {
        return 'Mein Text';
    }
}

Das Tag mmd_sylius_media_alt_text.fallback_provider vergibt das Plugin nur für seine eigenen Services. Einen Provider in Deiner App musst Du selbst taggen:

services:
    App\Alt\MyFallbackProvider:
        tags:
            - { name: mmd_sylius_media_alt_text.fallback_provider, priority: 10 }

Die Provider werden nach Priorität gefragt (höher zuerst), der erste nicht leere Text gewinnt. OwnerNameFallbackProvider hat die Standardpriorität 0 und antwortet für Produkt- und Kategoriebilder mit dem Namen, sobald einer vorhanden ist. Ein eigener Provider für diese Bildtypen kommt nur zum Zug, wenn Du ihm eine höhere Priorität gibst. $exactLocale = true verlangt einen Namen genau in der angegebenen Sprache (so arbeitet der Backfill-Befehl).

Weitere Bildtypen

Die Zuordnung „Bild-Interface => Alt-Text-Entity“ steckt im Service mmd_sylius_media_alt_text.registry (ImageAltTextTypeRegistry). Sie ist ein reines Konstruktor-Argument, es gibt kein Tag, mit dem sich ein Typ von außen eintragen lässt.

Um einen weiteren Bildtyp abzudecken, brauchst Du:

  1. eine eigene Entity, die AbstractImageAltText erweitert und ImageAltTextInterface implementiert (mit Mapping und Migration für Deine Tabelle)
  2. eine Überschreibung des Services mmd_sylius_media_alt_text.registry in Deiner App, die beide Arrays um Deinen Typ ergänzt (Interface => Entity und Kurzname => Interface)

Der Kurzname ist der Wert, den der Backfill-Befehl bei --type annimmt.

Normalizer und Persist-Processor

Das Plugin dokumentiert keine Abwärtskompatibilitäts-Zusage für Interfaces und Service-IDs. Leite bei eigenem Code lieber von den genannten Interfaces ab, statt von konkreten Klassen.