sales_order_save_commit_after acara dipicu dua kali?

8

Saya mendaftarkan pengamat agar sales_order_save_commit_afteracara tersebut diberitahukan ketika ada pesanan baru. Ini berfungsi dengan baik tetapi acara tersebut dipicu dua kali berturut-turut dengan urutan yang sama.

Config.xml saya

        <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>

Bagaimana saya bisa mengecek apakah ini pertama kalinya atau acara lain mana yang lebih baik?

Memperbarui

Saya juga mencoba sales_order_invoice_payacara (ditemukan di SO ) tetapi itu tidak dipicu untuk saya.

PiNomor
sumber

Jawaban:

9

Coba gunakan sales_order_save_after, itu dipicu tepat setelah pesanan disimpan dalam database dan mengembalikan objek pesanan penuh

Mengapa acara ini dipicu dua kali, saya tidak yakin. Ini adalah peristiwa yang dipicu dari Core/Model/Abstract.phpmetode afterCommitCallback, tampaknya Magento menyimpan / melakukan 2 set data berbeda pada model Order. Mungkin sekali urutan itu sendiri dan sekali riwayat status.

Apakah ada perbedaan antara data yang diuraikan pada 2 peristiwa yang mungkin memberikan petunjuk dari mana itu berasal?

Sander Mangel
sumber
1
Terima kasih sales_order_save_afterberfungsi tetapi saya akan menggunakannya sales_order_place_afterkarena tidak dipicu lagi oleh perubahan back end.
PiTheNumber
7

Jika ada yang masih mengalami masalah dengan ini, saya menemukan bagaimana Magento berurusan dengan ini.

Dalam metode yang dipanggil Anda dapat mengambil pesanan dan menetapkan bendera di atasnya.

Ex:

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); 
}

Dalam aplikasi / kode / inti / Mage / Kataloginventory / Model / Observer.php

function subtractQuoteInventory (Varien_Event_Observer $ observer)

adalah contoh bagaimana Magento berurusan dengan ini.

Magarusu
sumber
5

Saya mengubah acara menjadi sales_order_place_after. Ini berfungsi dengan baik.

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

        //your code here...

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

    }
}

Kode Bove bekerja untuk saya.

Anandan Dart
sumber