Acara Magento Observer - urutan operasi

9

Saya mencoba menyuntikkan fungsionalitas ke catalog_model_product_duplicateacara tersebut. Bagian dari modul ini adalah untuk memastikan bahwa status persediaan dari produk yang digandakan juga digandakan; saat ini tidak.

Saya melihat bahwa CatalogInventorymengamati acara ini dan mengatur beberapa informasi stok standar. Dapatkah saya dijamin bahwa acara inti diselesaikan sebelum penduduk lokal saya? Apakah ada urutan operasi di sini yang dapat saya andalkan?

Philwinkle
sumber

Jawaban:

11

Urutan pengiriman acara tergantung pada urutan modul dimuat. Karena Anda perlu memastikan bahwa CatalogInventorypengamat modul menyala sebelum Anda melakukannya, yang perlu Anda lakukan hanyalah mengonfigurasi modul Anda untuk bergantung pada Mage_CatalogInventorymodul. Anda dapat melakukan ini dengan menambahkan node dependen ke kode di app/etc/modules/My_Module.xmlfile Anda :

<config>
    <modules>
        <My_Module>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_CatalogInventory />
            </depends>
        </My_Module>
    </modules>
</config>

Itu depends node dalam XML di atas adalah bagian penting dari konfigurasi di sini, karena memaksa modul inti Magento untuk memuat sebelum Anda melakukan.

davidalger
sumber
7

Urutan pengiriman acara tidak mudah dijamin. Mereka tergantung pada urutan modul yang dimuat. Biasanya semua pengamat acara inti akan dipanggil sebelum pengamat kumpulan kode komunitas dan lokal.

Ada metode untuk memaksa pengamat magento untuk menembak setelah kebiasaan dengan "memalsukan" ketergantungan modul inti ke yang lokal atau komunitas. Lihat jawaban Lee di sini: Buat api pengamat khusus di hadapan pengamat Magento yang ada .

/app/etc/modules/Groupname_Page.xml

<config>
    <modules>
        <Groupname_Page>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <!-- Your dependencies go here -->
            </depends>
        </Groupname_Page>
        <Enterprise_PageCache>
            <depends>
                <Groupname_Page />
            </depends>
        </Enterprise_PageCache>
    </modules>
</config>

Saya pribadi tidak suka pendekatan itu karena saya tidak tahu konsekuensi apa yang memaksa ketergantungan itu.

Untuk kasus penggunaan Anda, sepertinya Anda harus melakukan semacam deteksi untuk data / negara untuk mengetahui apakah itu dipecat atau tidak. Memeriksa data / keadaan pada model akan lebih baik daripada mencoba memaksakan urutan acara.

beeplogic
sumber
Namun, dalam kasus saya, saya tidak perlu melakukan apa pun jika stok barang belum ada. Adakah pemikiran tentang peristiwa selanjutnya yang bisa saya hirup untuk melihat apakah itu merupakan hasil dari metode duplikat?
philwinkle
5

Jawaban umum

Pengamat dieksekusi berdasarkan area terlebih dahulu, kemudian dengan urutan pemuatan modul

Itu berarti, semua pengamat yang terdaftar di <global>dieksekusi sebelum semua pengamat yang terdaftar di <frontend>atau <adminhtml>.

Di dalam suatu area, pengamat dieksekusi dalam urutan mereka muncul di pohon XML konfigurasi gabungan, yang berarti secara teknis dalam urutan modul telah dimuat.

Pesanan modul pemuatan ditentukan sebagai berikut:

  1. Grafik dependensi dibangun dari <depends>definisi di app/etc/modules/*.xml. Jika X tergantung pada Y, Y dimuat sebelum X.

  2. Setelah dipesan berdasarkan ketergantungan, modul inti lebih diutamakan daripada modul komunitas dan lokal

  3. Segala sesuatu yang lain dimuat secara alfabet. Perhatikan bahwa nama file dalam app/etc/modulesdigunakan untuk perbandingan, bukan nama modul yang sebenarnya.

Jadi, Anda memiliki dua opsi untuk memengaruhi pesanan pemuatan modul:

  1. bergantung pada modul lain untuk membuat pengamat Anda dieksekusi setelah itu (atau membuat modul lain bergantung pada Anda untuk mengeksekusi mereka sebelumnya)
  2. Ganti nama file definisi modul. Anda tidak perlu mengganti nama modul itu sendiri karena nama file tidak penting untuk apa pun selain memuat pesanan.

("3. tambahkan modul Anda ke kumpulan kode inti" tidak masuk hitungan)

Lihat juga:

Fabian Schmengler
sumber
1

Hanya sebuah saran, amati keduanya catalog_model_product_duplicatedancatalog_model_product_save_after dengan pengamat tunggal. Dalam catalog_model_product_duplicatemenetapkan data inventaris sebagai data pengamat, dan catalog_model_product_save_aftermenggunakan data tersebut untuk mengisi inventaris untuk produk duplikat.

Petar Dzhambazov
sumber
Jadi, Anda menyarankan untuk menyimpan properti ke objek yang diberikan kepada saya dalam acara tersebut, lalu mengujinya pada catalog_model_product_save_after... itu bisa berhasil. Satu-satunya perangkap akan bertahan properti tanpa memanggil save()... ada pikiran di sana?
philwinkle
Anda akan menyimpan model inventaris, bukan produk, jadi Anda seharusnya tidak terjebak dalam satu lingkaran.
Petar Dzhambazov