Varianten auf der Produktdetailseite im Twig verfügbar machen #2

Closed
opened 2026-09-02 12:47:29 +00:00 by csaeum · 1 comment
Owner

Ziel

Auf der Produktdetailseite soll das Storefront-Twig Zugriff auf die Geschwister-Varianten des aktuellen Produkts haben – mindestens die Artikelnummer, idealerweise die vollständigen Varianten-Entities (Name, Preis, Optionen, Cover).

Analog zu Funktion 1 „Varianten im Listing" (VariantenListingSubscriber), aber für die Detailseite.

Betroffen

  • Neue Subscriber-Klasse unter src/Subscriber/ (z. B. VariantenDetailSubscriber)
  • Registrierung in src/Resources/config/services.xml
  • Neue Toggles in src/Resources/config/config.xml (Karte „Varianten auf der Detailseite"):
    • variantenDetailActive (bool, Default false) – Guard
    • variantenDetailDebug (bool, Default false) – Debug-Logging
  • AGENT.md / README um die neue Funktion ergänzen

Lösungsweg A – Minimal (Erstvorschlag)

Subscriber auf ProductPageCriteriaEvent, ->addAssociation('parent.children'), Zugriff im Twig über page.product.parent.children.

Einschränkungen:

  • Auf einer Varianten-Detailseite ist das geladene Produkt die Variante selbst (hat parentId) – ->addAssociation('children') liefert dann nichts, children hängt am Vater. Daher parent.children + Sonderfall, wenn der Vater direkt aufgerufen wird.
  • Liefert plain ProductEntity ohne Sales-Channel-Kontext: keine berechneten Preise, keine Aktiv-/Lagerfilterung.

Lösungsweg B – empfohlen

Subscriber auf ProductPageLoadedEvent:

  • parentId = product.parentId ?? product.id
  • Geschwister über sales_channel.product.repository laden (Filter parentId), ggf. addAssociations(['options.group', 'cover.media'])
  • per ->setChildren() ans Produkt hängen → im Twig page.product.children mit vollen Sales-Channel-Entities

Konsistent mit VariantenListingSubscriber, gleiche Datenqualität wie im Listing.

Akzeptanzkriterien

  • Toggle in der Plugin-Config, Default false, Guard im Subscriber (bei false sofortiger Abbruch)
  • Im Twig der Detailseite sind die Varianten inkl. Artikelnummer erreichbar
  • Debug-Logging bei aktivem variantenDetailDebug
  • php -l sauber, php-cs-fixer + phpstan (Level 3) grün
  • DDEV-Verifikation im laufenden Shop (Vater-Direktaufruf und Varianten-Detailseite)
  • Patch-Version erhöht, AGENT.md/README aktualisiert
## Ziel Auf der Produktdetailseite soll das Storefront-Twig Zugriff auf die Geschwister-Varianten des aktuellen Produkts haben – mindestens die Artikelnummer, idealerweise die vollständigen Varianten-Entities (Name, Preis, Optionen, Cover). Analog zu Funktion 1 „Varianten im Listing" (`VariantenListingSubscriber`), aber für die Detailseite. ## Betroffen - Neue Subscriber-Klasse unter `src/Subscriber/` (z. B. `VariantenDetailSubscriber`) - Registrierung in `src/Resources/config/services.xml` - Neue Toggles in `src/Resources/config/config.xml` (Karte „Varianten auf der Detailseite"): - `variantenDetailActive` (bool, Default `false`) – Guard - `variantenDetailDebug` (bool, Default `false`) – Debug-Logging - AGENT.md / README um die neue Funktion ergänzen ## Lösungsweg A – Minimal (Erstvorschlag) Subscriber auf `ProductPageCriteriaEvent`, `->addAssociation('parent.children')`, Zugriff im Twig über `page.product.parent.children`. **Einschränkungen:** - Auf einer Varianten-Detailseite ist das geladene Produkt die Variante selbst (hat `parentId`) – `->addAssociation('children')` liefert dann nichts, `children` hängt am Vater. Daher `parent.children` + Sonderfall, wenn der Vater direkt aufgerufen wird. - Liefert plain `ProductEntity` ohne Sales-Channel-Kontext: keine berechneten Preise, keine Aktiv-/Lagerfilterung. ## Lösungsweg B – empfohlen Subscriber auf `ProductPageLoadedEvent`: - `parentId = product.parentId ?? product.id` - Geschwister über `sales_channel.product.repository` laden (Filter `parentId`), ggf. `addAssociations(['options.group', 'cover.media'])` - per `->setChildren()` ans Produkt hängen → im Twig `page.product.children` mit vollen Sales-Channel-Entities Konsistent mit `VariantenListingSubscriber`, gleiche Datenqualität wie im Listing. ## Akzeptanzkriterien - [ ] Toggle in der Plugin-Config, Default `false`, Guard im Subscriber (bei `false` sofortiger Abbruch) - [ ] Im Twig der Detailseite sind die Varianten inkl. Artikelnummer erreichbar - [ ] Debug-Logging bei aktivem `variantenDetailDebug` - [ ] `php -l` sauber, php-cs-fixer + phpstan (Level 3) grün - [ ] DDEV-Verifikation im laufenden Shop (Vater-Direktaufruf **und** Varianten-Detailseite) - [ ] Patch-Version erhöht, AGENT.md/README aktualisiert
Author
Owner

Umgesetzt mit Lösungsweg B in 9d2fc0a, gemerged nach main (58af781), Release v1.6.0.

  • Neuer VariantenDetailSubscriber auf ProductPageLoadedEvent, parentId = product.parentId ?? product.id, Geschwister über sales_channel.product.repository (Assoziationen options.group + cover.media, Sortierung nach name), setChildren() → page.product.children.
  • Registrierung in services.xml, Config-Karte 5 (variantenDetailActive / variantenDetailDebug, Default false, Guard).
  • AGENT.md + README aktualisiert, Version 1.5.1 → 1.6.0.

DDEV-Verifikation: php-cs-fixer 0/25, phpstan Level 3 „No errors", Detailseite (Variante + Vater-Direktaufruf) HTTP 200 ohne Fehler, Debug-Log korrekt (6 Geschwister-SKUs), Guard greift bei Default false, Simple-Produkt ohne Geschwister → leere children, kein Crash.

Alle Akzeptanzkriterien erfüllt.

Umgesetzt mit **Lösungsweg B** in `9d2fc0a`, gemerged nach `main` (`58af781`), Release **v1.6.0**. - Neuer `VariantenDetailSubscriber` auf `ProductPageLoadedEvent`, `parentId = product.parentId ?? product.id`, Geschwister über `sales_channel.product.repository` (Assoziationen `options.group` + `cover.media`, Sortierung nach `name`), `setChildren()` → `page.product.children`. - Registrierung in `services.xml`, Config-Karte 5 (`variantenDetailActive` / `variantenDetailDebug`, Default `false`, Guard). - AGENT.md + README aktualisiert, Version `1.5.1 → 1.6.0`. **DDEV-Verifikation:** php-cs-fixer 0/25, phpstan Level 3 „No errors", Detailseite (Variante + Vater-Direktaufruf) HTTP 200 ohne Fehler, Debug-Log korrekt (6 Geschwister-SKUs), Guard greift bei Default `false`, Simple-Produkt ohne Geschwister → leere `children`, kein Crash. Alle Akzeptanzkriterien erfüllt.
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
SW-Plugins/wsc_swplugin_variantenextended#2
No description provided.