Наблюдение за изменением состояния заказа

8

Кажется, по умолчанию события состояния заказа не существует, так как вы обычно наблюдаете за изменением состояния заказа? Я вижу две возможности: а) Перезаписать модель продаж / заказа, чтобы создать собственное событие для изменения состояния. Б) Наблюдать за событием сохранения заказа и посмотреть на состояние там.

Один из них - путь или есть лучший вариант?

Изменить: Спасибо за ваши ответы до сих пор. Ситуация немного сложнее. Я хочу добавить информацию к заказу в зависимости от текущего состояния. Теперь вот проблема: в событии save_before у меня все еще есть старое состояние, а теперь нет нового, потому что в модели продажи / заказа метод _beforeSave () выглядит следующим образом:

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

Таким образом, событие обрабатывается в parent::_beforeSave();НО, но в действительности состояние заказа впоследствии изменяется $this->_checkState();(это автоматическое изменение, например, если вы создаете счет-фактуру, состояние перемещается в обработку, если отгрузки пока нет)

Я также не могу использовать событие save_after, так как хочу сохранить sth. в порядке, и это, вероятно, сломает все, чтобы вызвать сохранение в событии save_after.

Любые идеи? Моя единственная идея сейчас состоит в том, чтобы повторить $this->_checkState();поведение в моем наблюдателе save_before, чтобы выяснить, каково будет состояние ...

mpaepper
источник

Ответы:

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(), но я не могу найти место, где это происходит
Фабиан Блехшмидт
Я обновил свой вопрос - есть идеи для этого? Спасибо!
mpaepper
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;
    }
Пол Григорута
источник