Wie füge ich ein Produkt einem Warenkorb hinzu?
Posted: 18 Jan 2025, 21:12
TL;DR: Wie erstelle ich ein LineItem aus einem vorhandenen Produkt und füge es in einem Plugin zum Warenkorb hinzu?
Ich versuche, ein zu schreiben Plugin zum Hinzufügen eines Produkts zu einem Warenkorb, wenn es sich noch nicht darin befindet, z. B. um es immer in einem Warenkorb zu haben (eine Gebühr für Paypal, kostet nichts, wenn die BillingMethod nicht Paypal ist und andernfalls die Paypal-Gebühr).
Ich habe einen Abonnenten, der AfterLineItemAddedEvent erfolgreich abhört und darauf auslöst Veranstaltung, also keine Probleme da. Das ist mein Code:
Dies führt zu einer Endlosschleife, da „cartservice->add“ weitere AfterLineItemAddedEvents auslöst. Wenn ich die auskommentierten Methoden verwende (z. B. die Verwendung eines Persisters mit dem Event-Cart, nicht mit dem Cartservice), löst dies keine Ereignisse aus und führt nicht zu meinem Produkt im Warenkorb, aber mein Warenkorb im Browser zeigt „Artikel erfolgreich hinzugefügt“ an ( das normale Produkt, das ich hinzugefügt habe) UND „Produkt nicht gefunden“ (wahrscheinlich mein PayPalFee-Versuch) oben im Warenkorb.
-> Ich denke, das bedeutet, dass mein Problem entweder darin besteht, dass das LineItem vorhanden ist nicht korrekt hinzugefügt, oder dass es so ist falsch gebaut.
Also, wie würde ich das richtig machen?
Ich versuche, ein zu schreiben Plugin zum Hinzufügen eines Produkts zu einem Warenkorb, wenn es sich noch nicht darin befindet, z. B. um es immer in einem Warenkorb zu haben (eine Gebühr für Paypal, kostet nichts, wenn die BillingMethod nicht Paypal ist und andernfalls die Paypal-Gebühr).
Ich habe einen Abonnenten, der AfterLineItemAddedEvent erfolgreich abhört und darauf auslöst Veranstaltung, also keine Probleme da. Das ist mein Code:
Code: Select all
public function onItemAdded(AfterLineItemAddedEvent $event) {
//$cart = $event->getCart();
$cart = $this->cartservice->getCart($event->getCart()->getToken(), $event->getSalesChannelContext());
if ($cart->getLineItems()->filter(function (LineItem $item) {
if ($item->getPayload()['productNumber'] === "PP")
return $item;
})->count() !== 0)
return;
$criteria = new Criteria();
$criteria->addFilter(new EqualsFilter('productNumber', 'PP'));
$product = $this->productRepository->search($criteria, $event->getContext())->first();
$paypalFeeLineItem = (new LineItem('paypalfee', LineItem::PRODUCT_LINE_ITEM_TYPE, $product->getId(), 1))
->setRemovable(false)
->setStackable(false);
//$cart->add($paypalFeeLineItem);
//$this->persister->save($cart, $event->getSalesChannelContext());
$this->cartservice->add($cart, $paypalFeeLineItem, $event->getSalesChannelContext());
}
-> Ich denke, das bedeutet, dass mein Problem entweder darin besteht, dass das LineItem vorhanden ist nicht korrekt hinzugefügt, oder dass es so ist falsch gebaut.
Also, wie würde ich das richtig machen?