Mengamati perubahan status pesanan

8

Tampaknya tidak ada peristiwa status pesanan secara default, jadi bagaimana Anda biasanya mengamati perubahan status pesanan? Ada dua kemungkinan yang saya lihat: a) Menimpa model penjualan / pesanan untuk membuat acara kustom Anda untuk perubahan keadaan b) Mengamati pesanan menyimpan acara dan melihat keadaan di sana

Apakah ini salah satu cara untuk pergi atau ada pilihan yang lebih baik?

Sunting: Terima kasih atas jawaban Anda sejauh ini. Situasinya sedikit lebih rumit. Saya ingin menambahkan informasi ke pesanan tergantung pada kondisi saat ini. Sekarang inilah masalahnya: Dalam event save_before saya masih memiliki state lama dan tidak sekarang state baru, karena dalam model penjualan / pesanan, metode _beforeSave () adalah sebagai berikut:

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

Jadi acara diproses dalam parent::_beforeSave();NAMUN status pesanan benar-benar diubah setelahnya di $this->_checkState();(ini adalah perubahan otomatis, mis. Jika Anda membuat faktur, status dipindahkan ke proses jika tidak ada pengiriman di sana, belum)

Saya juga tidak bisa menggunakan save_after event, karena saya ingin menyimpan sth. atas perintah dan itu mungkin akan menghancurkan segalanya untuk memanggil save di save_after event.

Ada ide? Satu-satunya ide saya sekarang adalah untuk meniru $this->_checkState();perilaku di save_before pengamat saya untuk mengetahui apa yang akhirnya akan negara ...

mpaepper
sumber

Jawaban:

11

Saya akan sangat menyarankan agar tidak menimpa model penjualan / pesanan karena dua alasan:

  1. Itu selalu lebih baik untuk menggunakan acara daripada menulis ulang.
  2. Selain saran umum untuk menggunakan acara alih-alih menulis ulang, itu terutama bukan ide yang baik untuk menimpa kelas Magento pusat dan penting. Kemungkinan konflik dengan ekstensi lain terlalu tinggi.

Saya tidak punya ide untuk solusi yang lebih baik - saya pikir akan baik-baik saja untuk mengamati sales_order_save_afteracara tersebut dan memeriksa apakah keadaan telah diubah.

Simon
sumber
Saya memperbarui pertanyaan saya - ada ide untuk ini? Terima kasih!
mpaepper
4

Saya lebih suka menyimpan sate lama dari data asli di sales_order_save_beforeacara tersebut dan memeriksa ini di sales_order_save_afteratau before, tergantung apa yang ingin Anda lakukan.

Fabian Blechschmidt
sumber
2
Saya pikir Anda tidak perlu terhubung ke acara _before untuk menyelamatkan negara lama. Anda dapat menggunakan getOrigData(): stackoverflow.com/a/8184430/719023
Simon
1
Saya yakin mereka ditetapkan baru setelah save, karena jika tidak, Anda tidak bisa memastikan, apakah ada perubahan di kemudian hari save(), tapi saya tidak menemukan tempat di mana ini terjadi
Fabian Blechschmidt
Saya memperbarui pertanyaan saya - ada ide untuk ini? Terima kasih!
mpaepper
0

Saya menemukan setStatemetode utama Mage_Sales_Model_Orderlebih mudah dan lebih baik:

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
sumber