Observando el cambio de estado del orden

8

Parece que no hay un evento de estado de orden de forma predeterminada, entonces, ¿cómo se observa el cambio de estado de orden? Veo dos posibilidades: a) Sobrescribir el modelo de ventas / pedidos para crear su evento personalizado para un cambio de estado b) Observe el evento de guardado de pedidos y observe el estado allí

¿Es uno de estos el camino a seguir o hay una mejor opción?

Editar: Gracias por sus respuestas hasta ahora. La situación es un poco más complicada. Quiero agregar información al pedido según el estado actual. Ahora aquí está el problema: en el evento save_before todavía tengo el estado anterior y ahora no tengo el estado nuevo, porque en el modelo de ventas / pedidos el método _beforeSave () es el siguiente:

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

Por lo tanto, el evento se procesa parent::_beforeSave();PERO el estado del pedido se cambia realmente después $this->_checkState();(este es el cambio automático, por ejemplo, si crea una factura, el estado se mueve al procesamiento si todavía no hay ningún envío)

Tampoco puedo usar el evento save_after, ya que quiero guardar algo. en el pedido y probablemente rompería todo para llamar a guardar en el evento save_after.

¿Algunas ideas? Mi única idea ahora es replicar el $this->_checkState();comportamiento en mi observador save_before para descubrir cuál será finalmente el estado ...

mpaepper
fuente

Respuestas:

11

Aconsejaría encarecidamente no sobrescribir el modelo de ventas / pedidos por dos razones:

  1. Siempre es mejor usar eventos en lugar de reescrituras.
  2. Además del consejo general de usar eventos en lugar de reescrituras, particularmente no es una buena idea sobrescribir una clase de Magento tan central e importante. La posibilidad de un conflicto con otra extensión es demasiado alta.

No tengo idea de una solución mejor. Creo que sería absolutamente correcto observar el sales_order_save_afterevento y verificar si el estado ha cambiado.

Simón
fuente
Actualicé mi pregunta, ¿alguna idea para esto? ¡Gracias!
mpaepper
4

Preferiría guardar el estado anterior de los datos originales en el sales_order_save_beforeevento y verificar esto nuevamente en sales_order_save_aftero before, dependiendo de lo que desee hacer.

Fabian Blechschmidt
fuente
2
Creo que no necesita conectarse al evento _before para guardar el estado anterior. En su getOrigData()lugar, puede usar : stackoverflow.com/a/8184430/719023
Simon
1
Estoy seguro de que se configuran como nuevos después de guardar, porque si no, no puede estar seguro de si algo cambió en el siguiente save(), pero no encuentro un lugar donde esto ocurra
Fabian Blechschmidt
Actualicé mi pregunta, ¿alguna idea para esto? ¡Gracias!
mpaepper
0

Encuentro que reemplazar el setStatemétodo es Mage_Sales_Model_Ordermás fácil y mejor:

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
fuente