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 ...

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é.


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.


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;
    }
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.