Quan sát sự thay đổi trạng thái trật tự


8

Dường như không có sự kiện trạng thái đơn hàng theo mặc định, vậy làm thế nào để bạn thường quan sát sự thay đổi trạng thái đơn hàng? Có hai khả năng tôi thấy: a) Ghi đè mô hình bán hàng / đơn hàng để tạo sự kiện tùy chỉnh của bạn để thay đổi trạng thái b) Quan sát sự kiện lưu đơn hàng và xem trạng thái trong đó

Là một trong những cách để đi hoặc có một lựa chọn tốt hơn?

Chỉnh sửa: Cảm ơn câu trả lời của bạn cho đến nay. Tình hình phức tạp hơn một chút. Tôi muốn thêm thông tin vào đơn hàng tùy thuộc vào trạng thái hiện tại. Bây giờ đây là vấn đề: Trong sự kiện save_b Before tôi vẫn có trạng thái cũ và không phải là trạng thái mới, bởi vì trong mô hình bán hàng / đặt hàng, phương thức _b BeforeSave () như sau:

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

Vì vậy, sự kiện được xử lý trong parent::_beforeSave();NHƯNG trạng thái đơn hàng thực sự được thay đổi sau đó $this->_checkState();(đây là thay đổi tự động, ví dụ: nếu bạn tạo hóa đơn, trạng thái được chuyển sang xử lý nếu chưa có lô hàng nào)

Tôi cũng không thể sử dụng sự kiện save_after, vì tôi muốn lưu sth. theo thứ tự và nó có thể sẽ phá vỡ mọi thứ để gọi lưu trong sự kiện save_after.

Có ý kiến ​​gì không? Ý tưởng duy nhất của tôi bây giờ là sao chép $this->_checkState();hành vi trong trình quan sát save_b Before của tôi để tìm hiểu xem trạng thái cuối cùng sẽ là gì ...

Câu trả lời:


11

Tôi đặc biệt khuyên bạn không nên ghi đè lên mô hình bán hàng / đơn hàng vì hai lý do:

  1. Luôn luôn tốt hơn để sử dụng các sự kiện thay vì viết lại.
  2. Bên cạnh lời khuyên chung là sử dụng các sự kiện thay vì viết lại, đặc biệt không nên ghi đè lên một lớp Magento trung tâm và quan trọng như vậy. Khả năng xảy ra xung đột với một phần mở rộng khác là quá cao.

Tôi không có ý tưởng nào cho một giải pháp tốt hơn - Tôi nghĩ rằng sẽ hoàn toàn ổn khi quan sát sales_order_save_aftersự kiện và kiểm tra xem trạng thái đã được thay đổi chưa.


Tôi cập nhật câu hỏi của tôi - bất kỳ ý tưởng cho điều này? Cảm ơn!
mpaepper

4

Tôi muốn lưu sate cũ từ dữ liệu gốc trong sales_order_save_beforesự kiện và kiểm tra các thông tin này trong sales_order_save_afterhoặc before, tùy thuộc vào những gì bạn muốn làm.


2
Tôi nghĩ rằng bạn không cần phải tham gia vào sự kiện _b Before để lưu trạng thái cũ. Bạn có thể sử dụng getOrigData()thay thế: stackoverflow.com/a/8184430/719023
Simon

1
Tôi chắc chắn rằng chúng được thiết lập mới sau khi lưu, bởi vì nếu không, bạn không thể chắc chắn, liệu có điều gì đó thay đổi ở lần tiếp theo không save(), nhưng tôi không tìm thấy nơi nào điều này xảy ra
Fabian Blechschmidt

Tôi cập nhật câu hỏi của tôi - bất kỳ ý tưởng cho điều này? Cảm ơn!
mpaepper

0

Tôi thấy ghi đè setStatephương thức Mage_Sales_Model_Orderdễ dàng hơn và tốt hơn:

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;
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.