观察订单状态变化


8

似乎默认情况下没有订单状态事件,那么您通常如何观察订单状态变化?我看到两种可能性:a)覆盖销售/订单模型以创建状态更改的自定义事件b)观察订单保存事件并查看其中的状态

是其中一种方式还是有更好的选择?

编辑:感谢您到目前为止的答案。情况要复杂一些。我想根据当前状态向订单添加信息。现在是问题所在:在save_before事件中,我仍然具有旧状态,而现在没有新状态,因为在销售/订单模型中,_beforeSave()方法如下:

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

因此,事件是在parent::_beforeSave();BUT中处理的,但订单状态实际上是在$this->_checkState();此(这是自动更改,例如,如果您创建发票,则如果没有货,状态将移至处理中)

我也不能使用save_after事件,因为我想保存某事。按顺序执行,可能会破坏一切以在save_after事件中调用保存。

有任何想法吗?我现在唯一的想法是$this->_checkState();在观察者之前在save_before中复制行为,以找出状态最终将是...

Answers:


11

我强烈建议不要覆盖销售/订单模型,原因有两个:

  1. 最好使用事件而不是重写。
  2. 除了使用事件而不是重写的一般建议之外,覆盖这样一个重要的重要Magento类并不是一个好主意。与另一扩展名冲突的可能性太高。

我没有更好的解决方案的想法-我认为观察sales_order_save_after事件并检查状态是否已更改绝对是可以的。


我更新了问题-有任何想法吗?谢谢!
mpaepper

4

我宁愿在sales_order_save_before事件中保存原始数据中的旧状态,然后在sales_order_save_after或中before再次检查,这取决于您要执行的操作。


2
我认为您无需为了保存旧状态而陷入_before事件。您可以getOrigData()改用:stackoverflow.com/a/8184430/719023
Simon

1
我确定保存后会将它们设置为新的,因为如果没有设置,则不能确定下一次是否有所更改save(),但是我找不到发生这种情况的地方
Fabian Blechschmidt

我更新了问题-有任何想法吗?谢谢!
mpaepper

0

我发现setStateMage_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;
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.