Marketplace Redirect: Technik
Technik von Marketplace Redirect: Entscheidungslogik, Abschalten des Warenkorb-Blocks, Plugin-Struktur, Tabellen und Produktformular.
Marketplace Redirect: Technik
Diese Dokumentation bezieht sich immer auf die aktuellste veröffentlichte Version.
Entscheidungslogik
graph TD
A["Produktseite oder API-Anfrage"] --> B{"Channel ermittelbar?"}
B -->|"Nein"| C["Normaler Warenkorb-Button"]
B -->|"Ja"| D{"Channel eingeschaltet?"}
D -->|"Nein"| C
D -->|"Ja"| E{"Produkt hat Link?"}
E -->|"Nein"| C
E -->|"Ja"| F{"Referenz gültig?"}
F -->|"Nein"| G["Warnung ins Log, normaler Button"]
F -->|"Ja"| H["URL bauen: externer Button oder JSON"]
Der Provider merkt sich das Ergebnis pro Anfrage je Produkt und Channel, weil der Hook-Renderer und das Button-Template dasselbe Produkt abfragen. Ein Datenbankfehler (zum Beispiel eine fehlende Tabelle) und eine nicht mehr gültige gespeicherte Referenz zählen als „kein Redirect“ und werden als Warnung geloggt.
Warenkorb-Block abschalten
Den Hookable add_to_cart des Hooks sylius_shop.product.show.content.info.summary schaltet der dekorierte Renderer MarketplaceRedirectHookableRenderer ab: Hat das Produkt einen Redirect, rendert er den Hookable leer. Eine Bedingung am Hookable scheidet aus, weil Hook-Bedingungen erst in neueren Twig-Hooks (Sylius 2.3) existieren und sich in der Bedingungssprache nicht abfragen lässt, ob ein Produkt einen Link hat. Der Renderer hat in jeder Twig-Hooks-Version dieselbe Schnittstelle, und kein Sylius-Template wird angefasst.
Plugin-Struktur
src/
├── Api/ # Shop-API-Provider, Admin-API-Processor und IRI-Filter
│ └── Resource/ # Read-Model ProductMarketplaceRedirect
├── Command/ # mmd:marketplace-redirect:setup
├── DependencyInjection/ # Bundle-Extension, leere Configuration
├── Entity/ # ChannelSettings, ProductMarketplaceLink
├── Enum/ # MarketplaceType
├── Form/ # Produktformular-Erweiterung, Typen, Formularmodell
├── Hook/ # Dekorierter Hook-Renderer
├── Menu/ # Admin-Menü (Gruppe MMKreativ Plugins)
├── Migrations/ # Zwei Doctrine-Migrationen
├── Model/ # Redirect-Wertobjekt, Interface für die Formulardaten
├── Provider/ # Redirect pro Produkt
├── Repository/ # Repository der Links
├── Settings/ # Repository der Channel-Einstellungen
├── Twig/ # Twig-Funktionen
├── Url/ # URL-Builder je Marktplatz und Resolver
├── Validator/ # Constraint ValidMarketplaceReference
└── MmdSyliusMarketplaceRedirectPlugin.php # Bundle-Klasse
assets/ # leere Platzhalter (admin, shop), kein JavaScript
config/ # Services, Routen, Grid, Twig-Hooks
templates/ # Shop-Button samt eingebettetem Logo, Admin-Karte, Titelzeile
translations/ # messages, validators, flashes (de_DE, en_US)
Tabellen
| Tabelle | Entity | Inhalt |
|---|---|---|
mmd_sylius_marketplace_redirect_link |
ProductMarketplaceLink |
Typ, Referenz, optionale Amazon-Domain und das Produkt (eindeutig, löscht mit dem Produkt) |
mmd_sylius_marketplace_redirect_channel_settings |
ChannelSettings |
Channel-Code (eindeutig) und der Schalter „enabled“ |
graph LR
A["sylius_product"] -->|"1 zu 0..1"| B["mmd_sylius_marketplace_redirect_link"]
C["Channel-Code"] -->|"1 zu 0..1"| D["mmd_sylius_marketplace_redirect_channel_settings"]
Der Link ist eine eigene Entity mit eindeutiger Join-Spalte, weil Product eine Mapped Superclass ist, die ein Plugin nicht erweitern kann. Der Channel wird als Code gespeichert, nicht als Relation: Der Eintrag überlebt ein Neuanlegen des Channels und hängt nicht an der Channel-Mapped-Superclass.
Die Migrationen liegen im Namespace Mmd\SyliusMarketplaceRedirectPlugin\Migrations und laufen nach denen des Sylius-Cores. Der Namespace ist bewusst nicht der Skeleton-Standard DoctrineMigrations, der mit dem Namespace des Hosts kollidieren würde.
Admin-Menü
Der Menüpunkt hängt in der Gruppe „MMKreativ Plugins“ (Code mmd_plugins), die sich mehrere unabhängig installierte MMKreativ-Plugins teilen. Fehlt die Route, weil der Host sie nicht importiert hat, entfällt der Eintrag, die Gruppe bleibt, solange andere Plugins sie füllen.
Produktformular
Eine Form-Extension am Admin-Produkttyp (Sylius\Bundle\AdminBundle\Form\Type\ProductType) fügt ein nicht gemapptes Unterformular marketplaceLink hinzu und gleicht es von Hand mit der Link-Entity ab. Sylius validiert Produktformulare in der Gruppe sylius, das Unterformular setzt deshalb Default ausdrücklich. Ist die Migration noch nicht gelaufen, bleibt das Formular benutzbar, die Karte ist dann aber wirkungslos: Bei einem bestehenden Produkt wird die Eingabe verworfen, ein neues Produkt mit gewähltem Marktplatz lässt sich nicht anlegen.
Die beteiligten Klassen sind ProductTypeExtension, MarketplaceLinkType (Block-Prefix mmd_sylius_marketplace_redirect_link) und ChannelSettingsFormType für die Channel-Einstellungen.
Frontend-Technik
Das Plugin bringt kein JavaScript und keine Stimulus-Controller mit. Der Shop-Button und die Admin-Karte bestehen aus Twig und CSS.