lineItem: Ändern nicht möglich? Nur Menge (quantity)...

Hey,

für einen Produktkonfigurator möchte ich das nachträgliche Anpassen der Konfiguration ermöglichen. Jedoch scheint es hier einen fiesen Bug zu geben?

$lineItem->setLabel(‚ABCDEFG‘); // Geht nicht
$lineItem->setQuantity(123); // Geht

Ich habe mich an das Beispiel des Storefront API Controllers gehalten:

https://github.com/shopware/platform/blob/c649e8fb8071ce57113134ede8168caa5a353012/src/Core/Checkout/Cart/SalesChannel/SalesChannelCartController.php#L219

Mein Bsp Controller:

/**
     * @Route("/bla/checkout/line-item/update/{id}", name="bla.checkout.line-item.update", defaults={"XmlHttpRequest": true}, methods={"POST"})
     */
    public function updateLineItem(Cart $cart, string $id, Request $request, SalesChannelContext $salesChannelContext): Response
    {
        try {
            $quantity = $request->get('quantity');

            if ($quantity === null) {
                throw new \InvalidArgumentException('quantity field is required');
            }

            if (!$cart->has($id)) {
                throw new LineItemNotFoundException($id);
            }

            $lineItem = $cart->get($id);
            //$lineItem = $cart->getLineItems()->get($id);

            $lineItem->setLabel('ABCDEFG'); // geht nicht
            $lineItem->setPayloadValue('bla', json_decode($request->get('bla'), true)); // geht nicht
            $lineItem->setQuantity((int) $quantity); // geht

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

            //$cart = $this->cartService->changeQuantity($cart, $id, (int) $quantity, $salesChannelContext);

            if (!$this->traceErrors($cart)) {
                $this->addFlash('success', $this->trans('checkout.cartUpdateSuccess'));
            }
        } catch (\Exception $exception) {
            $this->addFlash('danger', $this->trans('error.message-default'));
        }

        return $this->createActionResponse($request);
    }

Bis auf die Menge kann ich im WK nichts updaten, finde auch keine Ansätze oder Beispiele dazu - bis auf dem API Controller. Funktioniert halt nur nicht. Ist das ein Bug oder bin ich einfach zu blöd? :wink:

push 

$lineItem->setLabel(‘ABCDEFG’); // Geht nicht!

$lineItem->setQuantity(123); // Geht

 $lineItem-\>setStackable(true); //Geht $lineItem-\>setRemovable(true); //Geht

 

Der ProductProcessor passt es an. Du musst dich nach dem hängen

@Shyim du meinst den “ProductCartProcessor”, ich schau mal ob es hier ein Event gibt worauf ich mich anhängen kann.

Danke einstweilen! Lg

 

 

 LineItemAddedEvent kann hier helfen.

LineItemAddedSubscriber anlegen und in services.xml registrieren!

 

Auszug aus LineItemAddedSubscriber.php

public static function getSubscribedEvents(): array
{
    return [
        LineItemAddedEvent::class => 'onLineItemAdded',
    ];
}

public function onLineItemAdded(LineItemAddedEvent $event): void
{
$lineItem = $event->getLineItem();
$lineItem->setPayload(['key' => $value]);
$lineItem->setLabel('Mein Custom Design');

 

hier als Referenz ein services.xml Eintrag: