Hallo zusammen,
ich versuche gerade die Versandkosten im Warenkorb anzupassen.
Im BeforeLineItemAddedEvent sind die Deliveries allerdings noch leer.
Im AfterLineItemAddedEvent zwar gesetzt und anpassbar, aber die Änderungen werden nicht angezeigt/gespeichert trotz cartService->recalculate.
Was mache ich falsch oder ist es im AfterLineItemAddedEvent nicht mehr möglich?
In der Datei CartItemAddRoute.php kann man den Ablauf sehen. Hast du es schon mit einer Cart Rule probiert? Die werden anscheinend vor dem cartPersister (Schreiben in DB) berechnet. Oder vielleicht hilft das: Add cart collector/processor. Sonst wäre eventuell noch ein Decorator auf CartCalculator eine Möglichkeit, aber da weiß ich nicht ob das so schön ist.
Stimmt, das Recalculate persistiert einen Cart. Jedoch wird in der Methode beim Calculate ein neuer Cart erstellt, welcher persistiert wird und als Rückgabewert zurückgegeben wird. Diesen müsstest du deinem $cart zuweisen, dann sollte es funktionieren, meiner Meinung nach.
Danke für Deine Antwort, ich dachte es gibt vielleicht noch eine andere Möglichkeit als das.
Ich glaube langsam man kann den Preis der Versandkosten gar nicht ändern.
Ich habe mir mal den CartPersister und die Tabelle Cart angeschaut.
Es sieht so aus als wenn nur die shipping_method_id gespeichert wird und gar nicht die Höhe der Versandkosten.
Hallo, ich bin zwar etwas spät, aber vielleicht findet das jemand noch hilfreich. Es gibt einen Weg, wie man die Versandkosten mittels “Cart Processor” ändern kann. Das wichtige ist nur dass man die richtige Priority bei der Registrierung des Processors setzt.
Hier einmal der Ausschnitt aus der services.xml
<service id="PluginName\Core\Checkout\Cart\CustomCartProcessor">
<!-- priority -5001 so it runs after the original delivery processor -->
<tag name="shopware.cart.processor" priority="-5001" />
</service>
Und hier die CustomCartProcessor.php Datei
<?php
declare(strict_types=1);
namespace PluginName\Core\Checkout\Cart;
use Shopware\Core\Checkout\Cart\Cart;
use Shopware\Core\Checkout\Cart\CartBehavior;
use Shopware\Core\Checkout\Cart\CartProcessorInterface;
use Shopware\Core\Checkout\Cart\LineItem\CartDataCollection;
use Shopware\Core\Checkout\Cart\Price\Struct\CalculatedPrice;
use Shopware\Core\Checkout\Cart\Tax\Struct\CalculatedTaxCollection;
use Shopware\Core\Checkout\Cart\Tax\Struct\TaxRuleCollection;
use Shopware\Core\System\SalesChannel\SalesChannelContext;
class CustomCartProcessor implements CartProcessorInterface
{
public function process(CartDataCollection $data, Cart $original, Cart $toCalculate, SalesChannelContext $context, CartBehavior $behavior): void
{
$delivery = $toCalculate->getDeliveries()->first();
$manualShippingCosts = new CalculatedPrice(100.5, 100.5, new CalculatedTaxCollection(), new TaxRuleCollection());
$delivery->setShippingCosts($manualShippingCosts);
$toCalculate->getDeliveries()->clear();
$toCalculate->getDeliveries()->add($delivery);
}
}