Varianten-Preisanpassung: Technische Details
Technische Details der Varianten-Preisanpassung: Ablauf von Storefront und Warenkorb, Plugin-Struktur, Services und Tags, Logging, Fehlercode sowie Hinweise zu Erweiterbarkeit, Rollenrechten und Snippets.
Technische Details
Ablauf
graph TD
A["Produkt wird im Verkaufskanal geladen"] --> B["ProductSubscriber"]
B --> C["SurchargeConfigReader"]
C --> D["ParentPriceResolver"]
D --> E["VariantPriceCalculator"]
E --> F["QuantityPriceCalculator"]
F --> G["calculatedPrice der Variante"]
H["Warenkorb wird berechnet"] --> I["VariantPriceProcessor"]
I --> C
I --> D
I --> E
I --> F
F --> J["Preis der Position"]
Plugin-Struktur
| Klasse | Aufgabe |
|---|---|
MmdVariantPriceSurcharge |
Plugin-Klasse. Beim Deinstallieren ohne "Nutzerdaten behalten" löscht sie Custom-Field-Set und Systemkonfiguration. |
Migration1705200000CreateCustomFields |
Legt Custom-Field-Set und die drei Felder an |
Subscriber\ProductSubscriber |
Hört auf sales_channel.product.loaded und ersetzt den berechneten Preis von Varianten |
Core\Checkout\Cart\VariantPriceProcessor |
Cart-Prozessor, Service-Tag shopware.cart.processor, Priorität 1000 |
Service\SurchargeConfigReader |
Liest und validiert die Zusatzfelder, entscheidet über die Vererbung |
Service\SurchargeConfig |
Unveränderliches Wertobjekt aus Prozentsatz und Aufschlag |
Service\ParentPriceResolver |
Lädt das Hauptprodukt samt erweiterter Preise, ermittelt dessen Preis, cached pro Request |
Service\VariantPriceCalculator |
Rechnung, Wertebereiche, Rundungs-Einstellungen aus der Systemkonfiguration |
Exception\ParentProductNotFoundException |
HTTP 404, Fehlercode MMD_VARIANT_PRICE_SURCHARGE__PARENT_NOT_FOUND |
Details
- Der
ParentPriceResolverträgt das Tagkernel.resetund leert seinen Cache zwischen Requests. - Die Rundungseinstellungen werden mit der Verkaufskanal-ID aus der Systemkonfiguration gelesen.
- Der Cart-Prozessor ist als öffentlicher Service registriert, damit er beim Kompilieren des Containers nicht entfernt wird.
- Der Cart-Prozessor lädt Varianten und Hauptprodukte jeweils in einer Abfrage für alle Positionen und übernimmt die Steuerregeln der vorhandenen Preisdefinition.
- Probleme werden über den Logger geschrieben: Warnungen für ungültige oder nicht numerische Werte und fehlende Hauptprodukte im Warenkorb, Fehler für fehlende Hauptprodukte in der Produktanzeige.
Erweiterbarkeit, Rechte, Snippets
- Das Plugin definiert keine eigenen Events, Erweiterungspunkte oder Konfigurationsschnittstellen. Die Services sind normale Symfony-Services.
- Es registriert keine Admin-Rollenrechte (ACL), keine Admin-Module und keine Storefront-Templates.
- Es liefert keine Snippet-Dateien. Die Beschriftungen der Zusatzfelder (de-DE und en-GB) liegen in der Konfiguration des Custom-Field-Sets, die der Plugin-Einstellungen in der
config.xml.