Warenkorb Versandkosten ändern/aktualisieren

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?

Vielen Dank für Eure Hilfe im Voraus!

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.

Wenn du es im AfterCartLineItemAddedEvent setzt, musst du zusätzlich noch den Cart speichern, damit deine Änderungen übernommen werden.

Erst mal danke für die Rückmeldungen.

Eine Rule kann ich leider nicht nutzen weil die Versandkosten nur unter bestimmten Bedingungen entfallen die nicht per Rule umsetzbar sind.

Anbei mal ein Teil vom Code um den es geht aus AfterCartLineItemAddedEvent

$cart = $event->getCart();
$salesChannelContext = $event->getSalesChannelContext();
$deliveries = $cart->getDeliveries();
$delivery = $cart->getDeliveries()->first();
$costs = new CalculatedPrice(0.0, 0.0, new CalculatedTaxCollection(), new TaxRuleCollection());                                    
$delivery->setShippingCosts($costs);

$cart->setDeliveries($deliveries);                 
                    
$cart->markModified();

$this->cartService->recalculate($cart, $salesChannelContext);

Soweit ich sehen konnte müsste doch
$this->cartService->recalculate($cart, $salesChannelContext)

das speichern auslösen.

Unter BeforeLineItemRemovedEvent nutze ich
$this->cartService->recalculate($cart, $salesChannelContext)
auch und da funktioniert es.

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.

Wie kann ich die Cart denn noch speichern, ohne eine neue Cart zu erzeugen?

Das ist das normale vorgehen. Shopware tut dies auch in seinem CartItemAddRoute.

Dort findest du die Stelle:

$cart = $this->cartCalculator->calculate($cart, $context);

1 „Gefällt mir“

Also ich habe jetzt statt:

$this->cartService->recalculate($cart, $salesChannelContext);
$cart = $this->cartCalculator->calculate($cart, $salesChannelContext);
$this->cartPersister->save($cart, $salesChannelContext);

wie auch unter CartItemAddRoute.
Trotzdem wird es einfach nicht gespeichert :frowning:

Hast du Mal versuchte den Prozess zu debuggen?

Eventuell werden die Versandkosten von einem anderen Prozess wieder überschrieben.

Wahrscheinlich dumme Frage aber ich stelle sie trotzdem :yum:
Wie kann ich denn den ganzen Prozess debuggen?

Am besten mit xDebug und du setzt an den entsprechenden Stellen Brakepoints.

Du kannst auch Logausgaben in den Code hinzufügen und dir die Log Datei angucken.

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.