LineItem in Warenkorb-Positionen erweitern

Hallo,

ich möchte Warenkorb-Positionen um Informationen erweitern, die der Kunde auf der Produktdetailseite eingeben kann:

Beispielsweise, wie hier in diesem Fall, ein eigenes Wunschlieferdatum, welches zu jeder Produktposition hinterlegt werden kann.

Wie ist der grundsätzliche Ansatz? Ich hätte da zwei Gedanken:

  1. Sollte man den Controller CartLineItemController.php anpassen bzw. überschreiben und dort die zusätzlichen Informationen von der Detailseite mit einarbeiten.
  2. Oder macht man eher einen Subscriber, der auf das AfterLineItemAddedEvent anspringt und dann den PayLoad für das LineItem um die gewünschte Information erweitert? Wie kommt man in diesem Fall an die Daten aus den zusätzlichen Eingabefeldern auf der Detailseite?

Was wäre der korrekte Weg, um die Warenkorb-Payloads zu erweitern? Hat jemand eventuell ein ähnliches Beispiel?

Shopware Standard controller actions zu überschreiben hat natürlich oft sehr weitreichende Folgen. Am sinnvollsten (und am wenigstens invasiv) wäre wahrscheinlich das AfterLineItem event. Da kannst du über den request_stack auf den request und auf das Formular zugreifen. Da sollten dann deine Infos drin stehen, die du ins payload des line items packen kannst.

Aber beachte: ein Standard Shopware product kann nur 1x im Warenkorb liegen. Das heißt, dass du den Parameter isMerged prüfen musst und dass dein Kunde nicht 2x das gleiche Produkt mit unterschiedlichen Eingaben im Warenkorb haben kann.

Viele Grüße

Hallo @EikeBrandtWarneke,

vielen Dank für die Hinweise. Dann werde ich mal den Weg über das AfterLineItem event versuchen :-).

Das mit dem Subscriber klappt nun gut, aber ich habe Probleme via request_stack den Wert aus dem Formularfeld auszulesen:

$desired_delivery_date = $this->requestStack->getCurrentRequest()->request->get('lq_desiredDeliveryDate');

Ist der Befehl so korrekt, oder muss man das anders machen?

hier, zum besseren Verständnis mal der komplette Subscriber:

class LineItemSubscriber implements EventSubscriberInterface
{

    /**
     * @var RequestStack
     */
    private $requestStack;

    public function __construct(RequestStack $requestStack)
    {
        $this->requestStack = $requestStack;
    }

    public static function getSubscribedEvents(): array
    {
        return [
            BeforeLineItemAddedEvent::class => 'beforeLineItemAdded'
        ];
    }  

    public function beforeLineItemAdded(BeforeLineItemAddedEvent $event)
    {
        $desired_delivery_date = $this->requestStack->getCurrentRequest()->request->get('lq_desiredDeliveryDate');

        // liefert neu hinzugefügtes LineItem im Warenkorb
        $lineItem = $event->getLineItem();

        $payLoad = $lineItem->getPayLoad();
        $payLoad['desired_delivery_date'] = $desired_delivery_date;
        $lineItem->setPayLoad($payLoad);

    }

}
1 „Gefällt mir“

Okay. Ich weiß nicht, was ich beim ersten Versuch falsch gemacht habe, aber jetzt klappt es genau so.

Danke nochmal für den Tipp. Viele Grüße, Frank