Options payload wird gelöscht

Moin zusammen,

ich dekoriere die CartItemAddRoute und reicher das LineItem vor der Weitergabe etwas an. Wenn ich den payload wie folgt anreichere
$items[0]->setPayloadValue('foo', 'bar');
gibt es kein Problem und der Wert bleibt mir erhalten.

Wenn ich jetzt allerdings options belege, werden mir die einfach gelöscht. Unter 6.4 hatte ich das nicht, da blieben mir die schön erhalten.

Ich hab den Cart jetzt im Debugger etwas verfolgt und festgestellt, dass die options erst im CartCalculator aus dem LineItem gelöscht werden.

Ist jemand über ein ähnliches Problem gestolpert?

Hi Goldbachmedien,
ich habe das gleiche Problem. Konntest Du es schon lösen?
Beste Grüße
Christian

Hallo Christian,

ja, die Payload wird nun im ProductCartProcessor zuverlässiger überschrieben, was dazu führt, dass Dinge, die vor dem Processor unter einem existierenden Payload-Key geschrieben werden, ersetzt werden.

Ich weiß nicht, was ihr vorhabt, vielleicht genügt euch ja auch einfach nur ein anderer Key statt options?
Ansonsten wäre die Lösung, sich nicht an die Route zu hängen, sondern in den Cart-Prozess und die Daten erst nach dem ProductCartProcessor zu schreiben (Add Cart Collector/Processor | Shopware Documentation)

Viele Grüße
Max

Vielen Dank für die schnelle Antwort!
Ich bin mir nicht sicher, ob die Folgesystem die Daten übernehmen (bzw. wenn der cart in eine order umgewandelt wird), wenn ich einen eigenen key verwende.
Aber super, das hilft mir als Lösungsansatz schonmal weiter!

Hey Christian,

ja, auch andere Keys werden in die Order übernommen, siehe im \Shopware\Core\Checkout\Cart\Order\Transformer\LineItemTransformer.

Ich habs mir grad mal bei uns angesehen, das Modul und die Schnittstelle zum ERP gehen immer vom options key aus. Ich schaue mal, das ich mich an einer anderen Stelle als bisher einhake.
Danke. Es hat mir als Hirnanstoß aber sehr geholfen.

Hat geklappt. Im Processor schreibe ich die Daten aus meinem custom key in den options key.
Ist jetzt vielleicht nicht die feine, englische Art aber es löst erstmal mein Problem.

Achtung: Die originalen options werden dabei natürlich überschrieben. Wenn man diese noch braucht, holt man sich diese zuvor einfach aus der payload und macht ein array merge.

<service id="Vendor\ModulName\Cart\Checkout\ConfiguratorCartHandler">
         <tag name="shopware.cart.processor" priority="4901"/>
</service>
<?php declare(strict_types=1);

namespace Vendor\ModulName\Cart\Checkout;

use Shopware\Core\Checkout\Cart\Cart;
use Shopware\Core\Checkout\Cart\CartBehavior;
use Shopware\Core\Checkout\Cart\CartDataCollectorInterface;
use Shopware\Core\Checkout\Cart\CartProcessorInterface;
use Shopware\Core\Checkout\Cart\LineItem\CartDataCollection;
use Shopware\Core\Checkout\Cart\LineItem\LineItem;
use Shopware\Core\System\SalesChannel\SalesChannelContext;

class ConfiguratorCartHandler implements CartProcessorInterface
{
    

    public function process(CartDataCollection $data, Cart $original, Cart $toCalculate, SalesChannelContext $context, CartBehavior $behavior): void
    {
        // get all lineItem line items
        $lineItems = $toCalculate->getLineItems()->filterType(LineItem::PRODUCT_LINE_ITEM_TYPE);

        /** @var LineItem $lineItem */
        foreach ($lineItems as $lineItem) {
            
            // identify configurator items
            $payload = $lineItem->getPayload();
           
                $customOptions = $lineItem->getPayloadValue('customOptions');
                if(!empty($customOptions)) {
                    $lineItem->setPayloadValue('options', $customOptions);
                }
            }
        }
    }
    
}
1 „Gefällt mir“