Observer le changement d'état de l'ordre

8

Il semble qu'il n'y ait pas d'événement d'état de l'ordre par défaut, alors comment procédez-vous habituellement pour observer le changement d'état de l'ordre? Il y a deux possibilités que je vois: a) Écraser le modèle de vente / commande pour créer votre événement personnalisé pour un changement d'état b) Observer l'événement d'enregistrement de commande et regarder l'état dans celui-ci

Est-ce que l'un d'eux est la voie à suivre ou existe-t-il une meilleure option?

Edit: Merci pour vos réponses jusqu'à présent. La situation est un peu plus compliquée. Je souhaite ajouter des informations à la commande en fonction de l'état actuel. Voici maintenant le problème: dans l'événement save_before, j'ai toujours l'ancien état et pas maintenant le nouvel état, car dans le modèle de vente / commande, la méthode _beforeSave () est la suivante:

parent::_beforeSave();
$this->_checkState();
//...

Ainsi, l'événement est traité en parent::_beforeSave();MAIS l'état de la commande est en fait modifié par la suite $this->_checkState();(c'est le changement automatique, par exemple si vous créez une facture, l'état passe en traitement s'il n'y a pas encore d'expédition)

Je ne peux pas non plus utiliser l'événement save_after, car je veux enregistrer qch. à la commande et cela casserait probablement tout pour appeler une sauvegarde dans l'événement save_after.

Des idées? Ma seule idée maintenant est de reproduire le $this->_checkState();comportement dans mon observateur save_before pour savoir quel sera finalement l'état ...

mpaepper
la source

Réponses:

11

Je déconseille fortement d'écraser le modèle de vente / commande pour deux raisons:

  1. Il est toujours préférable d'utiliser des événements plutôt que des réécritures.
  2. Outre les conseils généraux pour utiliser des événements au lieu de réécrire, ce n'est surtout pas une bonne idée d'écraser une classe Magento aussi centrale et importante. La possibilité d'un conflit avec une autre extension est trop élevée.

Je n'ai aucune idée d'une meilleure solution - je pense qu'il serait tout à fait correct d'observer l' sales_order_save_afterévénement et de vérifier si l'état a changé.

Simon
la source
J'ai mis à jour ma question - une idée pour ça? Merci!
mpaepper
4

Je préférerais enregistrer l'ancien état des données d'origine dans l' sales_order_save_beforeévénement et vérifier à nouveau cela dans le sales_order_save_afterou before, selon ce que vous voulez faire.

Fabian Blechschmidt
la source
2
Je pense que vous n'avez pas besoin de vous connecter à l'événement _before pour sauvegarder l'ancien état. Vous pouvez utiliser à la getOrigData()place: stackoverflow.com/a/8184430/719023
Simon
1
Je suis sûr qu'ils sont définis de nouveau après la sauvegarde, car sinon, vous ne pouvez pas être sûr que quelque chose a changé au prochain save(), mais je ne trouve pas d'endroit où cela se produit
Fabian Blechschmidt
J'ai mis à jour ma question - une idée pour ça? Merci!
mpaepper
0

Je trouve que remplacer la setStateméthode est Mage_Sales_Model_Orderplus facile et meilleur:

protected function _setState($state, $status = false, $comment = '',
            $isCustomerNotified = null, $shouldProtectState = false)
    {
        // dispatch an event before we attempt to do anything
        Mage::dispatchEvent('sales_order_status_before', array('order' => $this, 'state' => $state, 'status' => $status, 'comment' => $comment, 'isCustomerNotified' => $isCustomerNotified, 'shouldProtectState' => $shouldProtectState));

        parent::_setState($state,$status,$comment,$isCustomerNotified,$shouldProtectState);

        Mage::dispatchEvent('sales_order_status_after', array('order' => $this, 'state' => $state, 'status' => $status, 'comment' => $comment, 'isCustomerNotified' => $isCustomerNotified, 'shouldProtectState' => $shouldProtectState));

        return $this;
    }
Paul Grigoruta
la source