Markus Michalski FAQ

Varianten-Preisaufschlag: Erweiterbarkeit

Varianten-Preisaufschlag erweitern: dekorierte Preisrechner, Service-IDs und Repository, Sylius-Ressource, Twig-Hook des Variantenformulars, Setup-Befehl, Routen und Zusammenspiel mit anderen Preis-Decoratoren.

English Version

Zurück zur Übersicht

Varianten-Preisaufschlag: Erweiterbarkeit

Das Plugin definiert keine eigenen Service-Tags und keine Konfigurationsoptionen. Die Erweiterungspunkte sind die Sylius-Mechanismen, über die es eingebunden ist.

Preisrechner

Die Klasse Mmd\SyliusVariantPriceSurchargePlugin\Calculator\SurchargeAwareProductVariantPriceCalculator dekoriert den Service sylius.calculator.product_variant_price (Interface ProductVariantPricesCalculatorInterface).

Methode Verhalten
calculate() Preis mit Aufschlag
calculateOriginal() Ursprünglicher Preis mit Aufschlag
calculateLowestPriceBeforeDiscount() Wird unverändert an den dekorierten Rechner weitergereicht

Ab Sylius 2.3 gibt es zusätzlich den Service sylius.calculator.product_variant_catalog_price (Interface CatalogPricesCalculatorInterface). Ihn dekoriert die Klasse SurchargeAwareCatalogPricesCalculator, eine Unterklasse des Rechners oben ohne eigene Logik. Das erledigt der Compiler-Pass DecorateCatalogPricesCalculatorPass, den das Bundle registriert. Existiert der Service nicht, etwa unter Sylius 2.2, tut der Pass nichts.

Dekoriert ein anderes Plugin oder dein Projekt denselben Service, bestimmt die Decorator-Priorität die Reihenfolge. Das Plugin setzt für seine Decorator keine eigene Priorität, es gilt der Standard. Es ruft den jeweils darunterliegenden Rechner für Variante und Basisvariante auf.

Den Channel für die Überschreibungen liest der Rechner aus dem Kontext ($context['channel']). Fehlt er, gelten die globalen Werte.

Repository und Ressource

Zweck Bezeichner
Ressource mmd_sylius_variant_price_surcharge.product_variant_price_surcharge
Repository-Service mmd_sylius_variant_price_surcharge.repository.product_variant_price_surcharge, als Alias auch über das Interface ProductVariantPriceSurchargeRepositoryInterface erreichbar
Entity Mmd\SyliusVariantPriceSurchargePlugin\Entity\ProductVariantPriceSurcharge mit dem Interface ProductVariantPriceSurchargeInterface
Überschreibung pro Channel Mmd\SyliusVariantPriceSurchargePlugin\Entity\Channel\ProductVariantPriceSurchargeChannel, eine einfache Doctrine-Entity ohne eigene Ressource, Grid und Repository
Einstellungen VariantPriceSurchargeSettingsRepository mit der Methode getSettings(), liefert ohne gespeicherte Zeile ein Objekt mit aktivem Schalter

Das Repository-Interface bietet zwei Methoden:

Am Interface ProductVariantPriceSurchargeInterface erreichst du die Überschreibungen mit getChannelOverrides() (Collection, Schlüssel ist der Channel-Code), getChannelOverride(string $channelCode), addChannelOverride() und removeChannelOverride(). Auf der Überschreibung stehen isEnabled(), getPercentage() und getFixedSurcharge(), jeweils null, wenn der globale Wert gelten soll.

Admin-Oberfläche

Punkt Bezeichner
Twig-Hook des Formularbereichs sylius_admin.product_variant.update.content.form.sections, Eintrag mmd_sylius_variant_price_surcharge
Template des Formularbereichs @MmdSyliusVariantPriceSurchargePlugin/admin/product_variant/form/sections/price_surcharge.html.twig
Form-Erweiterung ProductVariantTypeExtension am Formulartyp ProductVariantType
Formulartypen ProductVariantPriceSurchargeType (globale Felder, Sammlung der Channels) und ProductVariantPriceSurchargeChannelType (ein Channel)
Grid der Übersicht mmd_sylius_variant_price_surcharge_admin_product_variant_price_surcharge
Routen mmd_variant_price_surcharge_admin_settings für die Einstellungen, die Ressourcen-Routen der Übersicht ohne Anlegen, Bearbeiten und Anzeigen
Menü-Ereignis sylius.menu.admin.main

Konsolenbefehl

mmd:variant-price-surcharge:setup (Klasse Mmd\SyliusVariantPriceSurchargePlugin\Command\SetupCommand) ist als Service mmd_sylius_variant_price_surcharge.command.setup mit dem Tag console.command registriert. Was er tut, steht unter Installation und Betrieb.

Grenzen