sales_order_save_commit_after sự kiện được kích hoạt hai lần?


8

Tôi đã đăng ký một người quan sát cho sales_order_save_commit_aftersự kiện sẽ được thông báo khi có đơn hàng mới. Điều này hoạt động tốt nhưng sự kiện được kích hoạt hai lần liên tiếp với cùng một đơn hàng.

Cấu hình của tôi

        <sales_order_save_commit_after>
            <observers>
                <unique_sales_order_save_commit_after>
                    <type>singleton</type>
                    <class>mymodule/observer</class>
                    <method>export</method>
                </unique_sales_order_save_commit_after>
            </observers>
        </sales_order_save_commit_after>

Làm thế nào tôi có thể kiểm tra nếu đó là lần đầu tiên hoặc sự kiện nào khác sẽ tốt hơn?

Cập nhật

Tôi cũng đã thử sales_order_invoice_paysự kiện này (được tìm thấy trên SO ) nhưng điều đó không được kích hoạt cho tôi.

Câu trả lời:


9

sales_order_save_afterThay vào đó, hãy thử sử dụng , nó được kích hoạt ngay sau khi một đơn hàng được lưu trong cơ sở dữ liệu và trả về đối tượng đơn hàng đầy đủ

Tại sao sự kiện này được kích hoạt hai lần, tôi không chắc chắn. Đây là một sự kiện được kích hoạt từ Core/Model/Abstract.phpphương thức afterCommitCallback, có vẻ như Magento đang lưu / cam kết 2 bộ dữ liệu khác nhau trên mô hình Đơn hàng. Có lẽ một khi trật tự chính nó và một lần lịch sử trạng thái.

Có sự khác biệt nào giữa dữ liệu được phân tích cú pháp trên 2 sự kiện có thể đưa ra manh mối về nơi nó được gọi không?


1
Cảm ơn bạn sales_order_save_afterhoạt động nhưng tôi sẽ sử dụng sales_order_place_aftervì nó không được kích hoạt lại bởi những thay đổi ở đầu cuối.
PiTheNumber

7

Nếu bất cứ ai vẫn gặp vấn đề với điều này, tôi đã tìm ra cách magento đối phó với điều này.

Trong phương thức được gọi, bạn có thể nhận đơn đặt hàng và đặt cờ trên đó.

Ví dụ:

public function export(Varien_Event_Observer $observer) {
    $order = $observer->getEvent()->getOrder();
    if($order->getExportProcessed()){ //check if flag is already set.
        return;
    }

    // your part of code

    //"setExportProcessed" can be called anything you want as it's getting set magically by magento on our $order object.
    $order->setExportProcessed(true); 
}

Trong ứng dụng / mã / lõi / Mage / Cataloginventory / Model / Observer.php

hàm minractQuoteInventory (Varien_Event_Observer $ observer)

là một ví dụ về cách magento đối phó với điều này.



0
public function sendEmail(Varien_Event_Observer $observer) {
    if(!Mage::registry('varien_event')){

        //your code here...

        Mage::register('varien_event',true);

    }
}

Mã Bove đang làm việc cho tôi.

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.