Observando a alteração do estado do pedido

8

Parece que não há evento de estado do pedido por padrão, então como você costuma observar a alteração do estado do pedido? Existem duas possibilidades que eu vejo: a) Sobrescreva o modelo de pedidos / vendas para criar seu evento personalizado para uma mudança de estado b) Observe o evento de salvamento de pedidos e observe o estado lá

Existe uma dessas opções ou existe uma opção melhor?

Edit: Obrigado por suas respostas até agora. A situação é um pouco mais complicada. Quero adicionar informações ao pedido, dependendo do estado atual. Agora, aqui está o problema: No evento save_before, ainda tenho o estado antigo e agora não o novo estado, porque no modelo de vendas / pedidos, o método _beforeSave () é o seguinte:

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

Portanto, o evento é processado, parent::_beforeSave();MAS o estado do pedido é realmente alterado posteriormente $this->_checkState();(esta é a alteração automática, por exemplo, se você criar uma fatura, o estado será movido para processamento se ainda não houver remessa)

Também não posso usar o evento save_after, pois quero salvar sth. no pedido e provavelmente quebraria tudo para chamar um salvamento no evento save_after.

Alguma ideia? Minha única idéia agora é replicar o $this->_checkState();comportamento em meu save_before observador para descobrir qual será o estado finalmente ...

mpaepper
fonte

Respostas:

11

Eu desaconselharia fortemente a substituição do modelo de pedidos / vendas por dois motivos:

  1. É sempre melhor usar eventos em vez de reescrever.
  2. Além do conselho geral de usar eventos em vez de reescrever, não é uma boa idéia substituir uma classe Magento tão importante e central. A possibilidade de um conflito com outra extensão é muito alta.

Não tenho nenhuma idéia para uma solução melhor - acho que seria absolutamente bom observar o sales_order_save_afterevento e verificar se o estado foi alterado.

Simon
fonte
Eu atualizei minha pergunta - alguma ideia para isso? Obrigado!
Mpaepper
4

Eu preferiria salvar o antigo estado dos dados originais no sales_order_save_beforeevento e verificar novamente isso no sales_order_save_afterou before, dependendo do que você deseja fazer.

Fabian Blechschmidt
fonte
2
Eu acho que você não precisa se conectar ao evento _before para salvar o estado antigo. Você pode usar getOrigData()em vez disso: stackoverflow.com/a/8184430/719023
Simon
11
Tenho certeza que eles são definidos nova após o salvar, porque se não, você não pode ter certeza, se algo mudou na próxima save(), mas eu não encontrar um lugar onde isso acontece
Fabian Blechschmidt
Eu atualizei minha pergunta - alguma ideia para isso? Obrigado!
Mpaepper
0

Acho que substituir o setStatemétodo é Mage_Sales_Model_Ordermais fácil e melhor:

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
fonte