Osservando il cambio di stato dell'ordine


8

Sembra che non ci sia alcun evento sullo stato dell'ordine per impostazione predefinita, quindi come si fa a osservare il cambiamento dello stato dell'ordine? Ci sono due possibilità che vedo: a) Sovrascrivi il modello di vendita / ordine per creare il tuo evento personalizzato per un cambio di stato b) Osserva l'evento di salvataggio dell'ordine e osserva lo stato in esso

Uno di questi è la strada da percorrere o esiste un'opzione migliore?

Modifica: grazie per le risposte finora. La situazione è un po 'più complicata. Voglio aggiungere informazioni all'ordine in base allo stato corrente. Ora ecco il problema: nell'evento save_before ho ancora il vecchio stato e non ora il nuovo stato, perché nel modello vendite / ordine il metodo _beforeSave () è il seguente:

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

Quindi l'evento viene elaborato parent::_beforeSave();MA lo stato dell'ordine viene successivamente modificato in seguito $this->_checkState();(si tratta della modifica automatica, ad esempio se si crea una fattura, lo stato viene spostato in elaborazione se non è ancora presente alcuna spedizione)

Nemmeno io posso usare l'evento save_after, poiché voglio salvare sth. all'ordine e probabilmente si spezzerebbe tutto per chiamare un salvataggio nell'evento save_after.

Qualche idea? La mia unica idea ora è replicare il $this->_checkState();comportamento nel mio osservatore save_before per scoprire quale sarà finalmente lo stato ...

Risposte:


11

Consiglio vivamente di non sovrascrivere il modello di vendita / ordine per due motivi:

  1. È sempre meglio usare gli eventi invece di riscriverli.
  2. Oltre al consiglio generale di usare eventi invece di riscrivere, non è particolarmente una buona idea sovrascrivere una classe Magento così centrale e importante. La possibilità di un conflitto con un'altra estensione è troppo alta.

Non ho idea di una soluzione migliore - penso che sarebbe assolutamente bene osservare l' sales_order_save_afterevento e verificare se lo stato è stato modificato.


Ho aggiornato la mia domanda - qualche idea per questo? Grazie!
mpaepper,

4

Preferirei salvare il vecchio stato dai dati originali sales_order_save_beforenell'evento e controllare di nuovo questo nel sales_order_save_aftero before, a seconda di ciò che vuoi fare.


2
Penso che non sia necessario collegarsi all'evento _before per salvare il vecchio stato. Puoi getOrigData()invece usare : stackoverflow.com/a/8184430/719023
Simon

1
Sono sicuro che sono stati impostati nuovi dopo il salvataggio, perché in caso contrario, non si può essere sicuri, se qualcosa è cambiato in un secondo momento save(), ma non trovo un posto dove questo accada
Fabian Blechschmidt

Ho aggiornato la mia domanda - qualche idea per questo? Grazie!
mpaepper,

0

Trovo che l'override del setStatemetodo sia Mage_Sales_Model_Orderpiù semplice e migliore:

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;
    }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.