注文状態の変化の観察


8

デフォルトでは注文状態イベントはないようですが、通常は注文状態の変化をどのように観察しますか?2つの可能性があります。a)販売/注文モデルを上書きして、状態変更のカスタムイベントを作成します。b)注文保存イベントを観察し、そこで状態を確認します。

これらのうちの1つは進むべき道ですか、それともより良いオプションがありますか?

編集:これまでの回答に感謝します。状況はもう少し複雑です。現在の状態に応じて注文に情報を追加したい。ここに問題があります:save_beforeイベントでは、古い状態のままで新しい状態にはなりません。sales/ orderモデルでは_beforeSave()メソッドが次のようになっているためです。

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

したがって、イベントは処理されますがparent::_beforeSave();、注文の状態は後で実際に変更されます$this->_checkState();(これは自動変更です。たとえば、請求書を作成すると、まだ出荷がない場合、状態は処理に移行します)。

sthを保存したいので、save_afterイベントも使用できません。順序で、おそらくsave_afterイベントでsaveを呼び出すためにすべてを壊します。

何か案は?今の私の唯一のアイデアは$this->_checkState();、私のsave_beforeオブザーバーで動作を複製して、最終的に状態がどうなるかを見つけることです...

回答:


11

次の2つの理由により、販売/注文モデルを上書きしないことを強くお勧めします。

  1. 書き換えではなく、常にイベントを使用することをお勧めします。
  2. 書き換えの代わりにイベントを使用するという一般的なアドバイスに加えて、そのような中心的で重要なMagentoクラスを上書きすることは特にお勧めできません。別の拡張機能との競合の可能性が高すぎます。

私はより良い解決策を考えていません-私はsales_order_save_afterイベントを観察し、状態が変更されたかどうか確認することは絶対に大丈夫だと思います。


質問を更新しました-これについて何か考えはありますか?ありがとう!
mpaepper 2013年

4

sales_order_save_beforeイベントの元のデータから古い状態を保存し、何をしたいsales_order_save_afterbeforeに応じて、またはでこれを再度チェックしたいと思います。


2
古い状態を保存するために_beforeイベントにフックする必要はないと思います。getOrigData()代わりに使用できます:stackoverflow.com/a/8184430/719023
Simon

1
保存後に新しいものに設定されていると思います。変更されてsave()いない場合、次に何かが変更されたかどうかはわかりませんが、これが発生する場所はわかりません
Fabian Blechschmidt

質問を更新しました-このためのアイデアはありますか?ありがとう!
mpaepper 2013年

0

私はsetStateメソッドをオーバーライドする方がMage_Sales_Model_Order簡単で優れていると思います:

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;
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.