CheckoutOrderPlacedEvent - Order unvollständig?

    public function onOrderPlaced(CheckoutOrderPlacedEvent $event) :void
    {
        $order = $event->getOrder();
        $config = DocumentConfigurationFactory::createConfiguration(array());
        $context = $event->getContext();

        $this->invoiceGenerator->generate($order, $config, $context);
    }

Dies führt stets zu folgender Fehlermeldung: Return value of Shopware\Core\Checkout\Order\OrderEntity::getLanguage() must be an instance of Shopware\Core\Framework\Language\LanguageEntity, null returned

Auch der Versuch, mit dem EntityWrittenEvent zu arbeiten, bedingt selbigen Fehler:

    public function test(EntityWrittenEvent $event) 
    {
        $id = $event->getIds()[0];

        $criteria = new Criteria();

        $criteria->addFilter(new EqualsFilter('order.id', $id));


        $context = Context::createDefaultContext();

        $orderResult = $this->orderRepository->search(
            $criteria,
            $context
        )->first();

        $config = DocumentConfigurationFactory::createConfiguration(array());

        $this->invoiceGenerator->generate($orderResult, $config, $context);
    }

Ich würde mich über sachdienliche Hinweise freuen, weshalb im jeweiligen Context die Language nicht gesetzt ist.

Ist offensichtlich nicht vorgesehen. Die MethodeinvoiceGenerator->generate ist vielleicht nur im Admin Bereich existent. Vielleicht musst Du ein paar includes einsetzen und das $order object selbst zusammensetzen / erweitern… 

Hallo,

dass die Language an der Order, die über das Event kommt, nicht vorhanden ist, liegt daran, dass im CartService \Shopware\Core\Checkout\Cart\SalesChannel\CartService::order die Order ohne die Language geladen wird. Assoziationen werden nie automatisch mitgeladen, sondern müssen immer explizit angegeben werden.
Du kannst aber einfach mit den Infos, die du hast, die Order noch mal neuladen, mit den Assoziationen, die du brauchst. Beispiele kannst du dir ja abgucken, wo der InvoiceGenerator im Core genutzt wird.

Viele Grüße aus Schöppingen

cool Michael Telgmann

1 „Gefällt mir“

Danke, zum Abschluss noch die Lösung - wenngleich ich noch eine bessere Lösung für meine Zwecke ausgemacht habe.

$criteria = (new Criteria([$orderId]))
            ->addAssociation('lineItems')
            ->addAssociationPath('transactions.paymentMethod')
            ->addAssociation('currency')
            ->addAssociationPath('language.locale')
            ->addAssociation('addresses')
            ->addAssociationPath('deliveries.positions')
            ->addAssociationPath('deliveries.shippingMethod');

Dabei fiel mir auf, dass getOrderBaseCriteria in DocumentService private ist. Möchte ich hier selbst weitere Assoziationen implementieren, dann bedingt das recht umfangreiche Code-Duplikate beim Dekorieren des Services. Außerdem vermisse ich ein Interface.

Moin,

wir haben bewusst zu Anfang wenig Interfaces und public Methoden in unsere Klassen eingebaut. Damit wollen wir die public API, die wir dann über lange Zeit maintainen müssen, möglichst klein halten. Falls dir an dieser Stelle ein guter Einstiegspunkt fehlt, kannst du aber gerne einen PR oder ein Ticket aufmachen.

Viele Grüße aus Schöppingen

cool Michael Telgmann