Kennisbank

logo

Aanpassen van verzendkosten in Shopware 6 via code

Soms is het wenselijk om de verzendkosten niet alleen door Shopware zelf te laten bepalen, maar ook door een plugin. Deze situatie kan voorkomen wanneer er extra variabelen aanwezig zijn om de verzendkosten te bepalen, hierbij valt te denken aan een koppeling met o.a. een externe verzendpartij.

Om de verzendkosten van een order binnen Shopware 6 via een plugin te kunnen bepalen of deze aan te passen is het nodig dat er gebruik gemaakt wordt van het zogenaamde decorator design pattern.Dit houd in dat het bestaande bestand wat gebruikt wordt voor het berekenen van de verzendkosten (/src/Core/Checkout/Cart/Delivery/DeliveryCalculator.php) uitgebreid wordt door middel van een eigen implementatie van dit bestand.

Het aanmaken van de decorator gaat door middel van het path van het DeliveryCalculator bestand aan te maken in je eigen plugin en hierin een bestand aan te maken genaamd: DeliveryCalculatorDecorator. In dit bestand plaats je dan de gehele inhoud van de orginele DeliveryCalculator.

Na het plakken van de inhoud pas je de class naam aan naar het volgende: class DeliveryCalculatorDecorator extends DeliveryCalculator. Hierna is het nog nodig om in je services.xml het volgende te plaatsen:

<service id="PluginNamespace\Core\Checkout\Cart\Delivery\DeliveryCalculatorDecorator"
decorates="Shopware\Core\Checkout\Cart\Delivery\DeliveryCalculator">
	<argument type="service" id="Shopware\Core\Checkout\Cart\Price\QuantityPriceCalculator"/>
	<argument type="service" id="Shopware\Core\Checkout\Cart\Tax\PercentageTaxRuleBuilder"/>
	<argument type="service" id="Shopware\Core\Checkout\Cart\Tax\TaxDetector"/>
	<argument type="service" id="Shopware\Core\System\SystemConfig\SystemConfigService"/>
</service>

Met bovenstaande code wordt aangegeven dat je het orginele Shopware bestand decorate met je eigen decorator. Doordat het een nieuwe class is, is het wel nodig om alle services ook mee te geven. Wanneer bovenstaande gedaan is, is het mogelijk om de uiteindelijke verzendkosten echt aan te gaan passen.

Het aanpassen van deze kosten dient te gebeuren in de functie: calculateShippingCosts binnen de DeliveryCalculatorDecorator, dat het alleen op deze plek kan heeft ermee te maken dat hier het bedrag echt als integer beschikbaar is. Op andere plekken binnen de DeliveryCalculator zal de prijs zich binnen een object bevinden waar alleen setters op zitten en geen getters en je hierdoor het orginele niet direct kunt verkrijgen om te veranderen.