Custom Products und LineItem Payload - wie Werte ändern?

Ich hatte eben das Vergnügen mich mit der Kombination Custom Products und LineItem Payload herumzuschlagen.

Anscheinend ist es nicht möglich per setPayloadValue() den Wert der LineItem Payloads zu ändern, da Custom Products, zur Wahrung der Integrität, stets das Payload anhand des Templates lädt und nicht des LineItems.

Hat jemand Erfahrung hierzu und konnte das Problem lösen?

Normalerweise sollte genau mit setPayloadValue der Paylod Wert eines LineItems gesetzt und somit auch geändert werden können.

Ich kenne jetzt den Code des Custom Products Plugins nicht, eventuell wird der Payload im CartProcessor gesetzt und somit auch mehrmals gesetzt, so dass deine Änderungen eventuell überschrieben werden?

Was ist mit „stets das Payload anhand des Templates lädt und nicht des LineItems“ gemeint?

An welcher Stelle versuchst du den Payload Wert zu ändern?

1 „Gefällt mir“

Der ProductLineItemProviderDecorator mit

 public function getProducts(Cart $cart): LineItemCollection
    {
        $collection = $this->decorated->getProducts($cart);

        $customProductsCollection = $cart->getLineItems()->filterType(CustomizedProductsCartDataCollector::CUSTOMIZED_PRODUCTS_TEMPLATE_LINE_ITEM_TYPE);

        foreach ($customProductsCollection as $item) {
            $existingItems = $collection->filter(static function (LineItem $lineItem) use ($item) {
                return $lineItem->getId() === $item->getId();
            });

            if (\count($existingItems->getElements()) > 0) {
                continue;
            }

            $collection->add($item);
        }

        return $collection;
    }

ist glaube ich mein Problem. Wenn ich das recht verstehe, wird hier das Template geladen.

Ich habe per CartProcessorInterface versucht mittels setPayloadValue die Werte zu setzen. Habe es kurz per Log debugged, mein Code wurde ausgeführt und später auch nicht durch einen anderen setPayloadValue überschrieben. Sprich, das komplette LineItem wurde vermutlich ausgetauscht.

In der oben genannten Methode werden die Produkt-LineItems um die CustomProduct LineItems, LineItems vom Type Customized_Product_Template_Line_Item_Type, erweitert.

Die Payloads der CustomProduct LineItems werden wahrscheinlich, falls vorhanden, über ein (CustomaProducts)LineItemFactory gesetzt.
Wenn die LineItems neu erzeugt statt aktualisiert werden, wie du es meinst, dann geht deine Änderung verloren.

Hast du Mal in deren CartProcessor nachgeguckt, was da gemacht wird?

Falls die im CartProcessor das LineItem neu erzeugen, könntest du versuchen die Priorität deines CartProcessors ändern, so dass dein CartProcessor später ausgeführt wird?

1 „Gefällt mir“