Subscriber bei Stateänderung einer Bestellung

Hat jmd. evtl. eine Idee, mit welchem Event ich am besten in einem Subscriber bei Änderung des Bestellstatus oder Zahlstatus auf die Bestelldaten bzw. orderId zugriff habe? Ich habe einige Events ausprobiert, aber so richtig funktioniert das nicht. Entweder werden die nicht getriggert oder ich habe keine Daten um an die orderId zu kommen.

Diese Events habe ich ausprobiert: OrderStateMachineStateChangeEvent, StateMachineTransitionEvent, OrderStateChangeEventListener, OrderEvents::ORDER_STATE_WRITTEN_EVENT

Danny

Hallo Danny,

das OrderStateMachineStateChangeEvent hat als Property die komplette Order. Darüber solltest du auch problemlos an die ID kommen. 

Viele Grüße aus Schöppingen

cool Michael Telgmann

Hi Michael,

wenn ich im Admin aber einen Status ändere, wird das Event nicht gefeuert bzw. ich bekomme meine Debug Ausgabe im Subscriber nicht angezeigt.

Hallo Danny,

wie du in dieser Klasse sehen kannst, wird beim feuern des Events ein Name angegeben: platform/OrderStateChangeEventListener.php at 6.1 · shopware/platform · GitHub
Das bedeutet, du kannst nicht einfach mit OrderStateMachineStateChangeEvent::class auf das Event horchen. 
Der Eventname wird hier zusammen gebaut: platform/StateMachineStateChangeEvent.php at 6.1 · shopware/platform · GitHub
Du musst dich also auf ein Event subscriben, dass wie folgt aussehen kann: “state_enter.order.state.in_progress” Dies wird z.B. gefeuert, wenn du die Bestellung in den State “In Progress” schiebst.

Viele Grüße aus Schöppingen

cool Michael Telgmann

1 „Gefällt mir“

Ich danke dir! So klappt es.

Danny

Hallo, ich interessiere mich ebenfalls für diesen Anwendungsfall, muss aber doof fragen wie man sich konkret auf dieses Event subscribt. Ich steh irgendwie auf dem Schlauch. Danke vorab.

 

...
use Shopware\Core\Checkout\Order\OrderEvents;
use Shopware\Core\Checkout\Order\Listener\OrderStateChangeEventListener;
use Shopware\Core\Checkout\Order\OrderDefinition;
use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Contracts\EventDispatcher\Event;

class OnOrderChanged implements EventSubscriberInterface {
    /**
     * @return array The event names to listen to
     */
    public static function getSubscribedEvents()
    {
        return [
            ???...state_enter.order.state.in_progress => ['doMagic']
        ];
    }

public function doMagic(EntityWrittenEvent $event) {
        
	print_r('Hallo Welt.');
	
    }
}

 

Hey Andey,

so funktioniert es bei mir:

**public static function** getSubscribedEvents(): **array** { **return** [**'state\_enter.order\_transaction.state.paid'** =\> **'onOrderTransactionStateChanged'**]; }

Das Event wird getriggert wenn der Zahlstatus auf Bezahlt gesetzt wird.

Ich danke dir. Das kann ich mir umbauen für den order-Status…oh man, am Ende doch ganz easy. Wie besorgst du dir in der Folge die Bestellnummer raus? Ich würde wahrscheinlich sogar noch weiter gehen und würde am liebsten noch deutlich mehr Details aus der order ziehen wollen, wie Lieferanschrift, Positionen, Custom-fields etc.

 

Hol dir am besten mit

 $orderId = $event-\>getOrder()-\>getId();

über die id per DAL die Daten die du benötigst.

da bekomme ich einen Fehler.

use Shopware\Core\Checkout\Order\OrderEvents;
use Shopware\Core\Checkout\Order\Listener\OrderStateChangeEventListener;
use Shopware\Core\Checkout\Order\OrderDefinition;
use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityWrittenEvent;
use Shopware\Core\Framework\DataAbstractionLayer\Event\EntityLoadedEvent;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Contracts\EventDispatcher\Event;

class OnOrderChanged implements EventSubscriberInterface {
    /**
     * @return array The event names to listen to
     */
    public static function getSubscribedEvents(): array
{
    return [
        'state_enter.order_transaction.state.paid' => 'doMagic'
    ];
}

public function doMagic(EntityLoadedEvent $event) {
        
	$orderId = $event->getOrder()->getId();

	
	
    }
}

ich glaube EntityLoadedEvent ist hier nicht richtig, EntityWrittenEvent aber auch nicht. Man steh ich heute auf dem Schlauch

hier:

**public function** onOrderStateChanged(OrderStateMachineStateChangeEvent $event): **void**** { ****}**

Danke hab ich auch grad gefunden. 

Läuft!

Mal noch ne allgemeine Frage… hab zwar schon paar Kleinigkeiten programmiert, aber eher im Frontend und weniger im Core, lese immer wieder dass phpstorm mit der IDE quasi alternativlos ist, insbesondere wegen dem Autofill der Klassen etc. Empfiehlst du das auch oder kannst du die alle auswendig?

Nene, ich nutze auch PhpStorm. :wink:

OK installiere ich grad. Ich hoffe ich nerve nicht schon, Ziel ist eine Mail an das Lager, wenn eine Bestellung den Status X hat. Mit php kann ich natürlich die mail funcion nutzen, aber ich würde gern die in shopware hinterlegte Mail Funktion nutzen, da ich hier auch einen SMTP Server hinterlegt habe. Wie stösst man denn sowas an? Außerdem könnte ich dann in meiner Vision direkt ein Template zur Auflistung der Artikel der jeweiligen Bestellung nutzen oder ist das zu visionär?

Werden diese Events  ORDER_STATE_WRITTEN_EVENT oder state_enter.order_transaction.state.paid ausgeführt, wenn die State der Bestellung in der Administartion geändert ist. Ich hab es so probierrt aber es funktioniert nicht ! 

 

    public static function getSubscribedEvents(): array
    {
        
        return [
            'state_enter.order_transaction.state.paid' => 'onUpdateState',
            OrderEvents::ORDER_STATE_LOADED_EVENT => 'onUpdateState'
        ];
    }

    public function onUpdateState(EntityWrittenEvent $event)
    {
        dd('onUpdateState');
    }