Di mana saya dapat menemukan daftar lengkap acara Magento?

94

Saya tahu bahwa Magento memiliki sistem seperti kait yang disebut peristiwa. Adakah yang memiliki daftar lengkap atau naskah yang dapat digunakan untuk menentukan acara mana yang dapat dipanggil?

tanda batas
sumber
4
Saya menggunakan ini sebagai lembar contekan yang bagus nicksays.co.uk/magento-events-cheat-sheet-1-7
Derrik Nyomo
1
@DerrikNyomo - Anda harus mempostingnya sebagai jawaban beserta ringkasan informasi yang diberikannya. :-)
patokan
1
Cheat sheet untuk acara-acara sebenarnya lebih merepotkan, karena memberi Anda pengertian yang salah bahwa 'acara yang saya inginkan tidak ada' dan Anda mungkin menghabiskan waktu berjam-jam untuk pengkodean, setelah melewatkan acara yang bisa digunakan (karena banyak dibuat secara dinamis) Saya memposting jawaban untuk pertanyaan ini: tautan dan jawaban saya juga berkaitan dengan pertanyaan ini. Itu tidak memberi Anda 'daftar' lengkap, tetapi itu memberi Anda daftar lengkap peristiwa untuk tindakan / halaman yang Anda tertarik untuk terhubung.
ProxiBlue

Jawaban:

102

Tidak ada daftar semua peristiwa magento, karena sebagian besar peristiwa dinamai secara dinamis.

Jika Anda bertanya kepada saya, mengetahui peristiwa penting ini (dan konsekuensinya) adalah titik awal yang baik (di samping daftar dari nick):

Setiap Objek yang diperluas dari Mage_Core_Model_Abstract mengirimkan banyak peristiwa seputar pemuatan, penyimpanan, dan penghapusan:

app/code/core/Mage/Core/Model/Abstract.php:255
Mage::dispatchEvent($this->_eventPrefix.'_load_before', $params);
// e.g. sales_order_load_before, checkout_cart_load_before

Misalnya menambahkan cek, setelah objek dimuat

app/code/core/Mage/Core/Model/Abstract.php:267
Mage::dispatchEvent($this->_eventPrefix.'_load_after', $this->_getEventData());
// e.g. cms_page_load_after

untuk menambahkan data tambahan ke objek sebelum disimpan

app/code/core/Mage/Core/Model/Abstract.php:391
Mage::dispatchEvent($this->_eventPrefix.'_save_before', $this->_getEventData());
// e.g. catalog_product_save_before

Untuk menyimpan model lain setelah "induk" disimpan

app/code/core/Mage/Core/Model/Abstract.php:466  
Mage::dispatchEvent($this->_eventPrefix.'_save_after', $this->_getEventData());
// e.g. catalogrule_rule_save_after

bersihkan, sebelum model dihapus

app/code/core/Mage/Core/Model/Abstract.php:501
Mage::dispatchEvent($this->_eventPrefix.'_delete_before', $this->_getEventData());
// e.g. store_delete_before

bersihkan, sebelum model dihapus - atau mungkin sesudahnya? Anda masih di sini dalam transaksi!

app/code/core/Mage/Core/Model/Abstract.php:529
Mage::dispatchEvent($this->_eventPrefix.'_delete_after', $this->_getEventData());
// e.g. website_delete_after

Jika Anda ingin memastikan entitas telah dihapus

app/code/core/Mage/Core/Model/Abstract.php:541
Mage::dispatchEvent($this->_eventPrefix.'_delete_commit_after', $this->_getEventData());
// e.g. customer_delete_commit_after

Koleksi yang diperluas dari Mage_Core_Model_Resource_Db_Collection_Abstract memiliki dua acara umum juga:

Misalnya: untuk mengubah SQL untuk memuat koleksi:

app/code/core/Mage/Core/Model/Resource/Db/Collection/Abstract.php:588
Mage::dispatchEvent($this->_eventPrefix.'_load_before', array(
    $this->_eventObject => $this
));
// e.g. sales_order_status_history_collection_load_before

Misalnya: untuk menambahkan data tambahan ke objek:

app/code/core/Mage/Core/Model/Resource/Db/Collection/Abstract.php:637
Mage::dispatchEvent($this->_eventPrefix.'_load_after', array(
    $this->_eventObject => $this
));
// e.g. sales_order_shipment_collection_load_after
Fabian Blechschmidt
sumber
4
Jawaban yang sangat bagus; berharap untuk sesuatu yang bisa kita selipkan di wiki. Pentingnya _eventPrefixuntuk acara model, acara permintaan yang ditargetkan, acara blok generik yang kadang-kadang berguna, dan pentingnya penebangan untuk menemukan acara
tandai
1
Luar biasa. Saya ingin mencatat bahwa di Magento 2 mereka benar-benar perlu memastikan semua kelas inti memiliki awalan acara yang ditentukan. Saya sebenarnya telah menulis ulang kelas hanya untuk mendefinisikan awalan acara sehingga saya dapat dengan bersih menghubungkan ke save / memuat acara. Hmm. Sebenarnya saya pikir saya akan pergi memeriksa sumber Magento 2 sendiri.
Tim Reynolds
3
Pendekatan yang biasanya saya ambil adalah, edit / save / kembali cepat ke app/code/core/Mage/Core/Model/App.phpdan mage::log($eventName,null,'events.txt',true);ke dispatchEventmetode. Muat halaman yang saya coba amati. Tentunya jangan biarkan ini apa adanya dan kembalikan setelah var / logs / events.txt Anda dibuat. Kotor, ya. Cepat ya. :)
B00MER
2
bagus, jika Anda ingin pengamat Anda berada di satu halaman. Tapi hati-hati, ada kejadian yang harus dikirim, tetapi mungkin tidak. Ada pesanan atau acara pembayaran yang tidak dibuang, ketika dibayar dengan paypal ...
Fabian Blechschmidt
Apakah ada peristiwa yang dipecat setelah kiriman pengiriman di magento @FabianBlechschmidt
Deb
48

Lakukan bloody grep 'Mage::dispatchEvent' app/ -rsnIni akan memberi Anda daftar acara khusus untuk instalasi Anda karena daftar acara dapat bervariasi tergantung pada versi Magento, penyesuaian dan ekstensi yang diinstal.

pengguna487772
sumber
2
Itu saran terbaik, itu akan mencakup acara modul pihak ke-3 juga. Biasanya ketika saya ingin tahu acara mana yang dapat saya kaitkan untuk halaman tertentu, saya mencatat aplikasi: parameter dispatchEvent.
Petar Dzhambazov
1
Grep juga akan memberi Anda informasi buruk: Misalnya, klaim itu sales_order_place_afterakan terjadi, tetapi sepertinya panggilan untuk memecatnya dikomentari Checkout/Type/Onepage.php.
kojiro
Ini adalah jawaban yang buruk karena hanya akan mengambil sebagian kecil dari peristiwa yang tersedia karena sepenuhnya merindukan semua peristiwa yang dihasilkan secara dinamis. @PetarDzhambazov memberikan saran yang baik untuk masuk dari operator dan kemudian memuat halaman yang Anda minati. Jawaban terbaik sejauh ini adalah jawaban yang diterima yang diberikan oleh FabianBlechschmidt
Dom
26

Saya menggunakan ini sebagai lembar contekan yang bagus http://www.nicksays.co.uk/magento-events-cheat-sheet-1-7/ . Ia memiliki semua peristiwa yang dapat dipanggil di 1.7.

Derrik Nyomo
sumber
4
Karena Anda telah melakukan pekerjaan yang baik untuk menautkan konten, sebaiknya berikan juga konten di sini seandainya Nick mengatakan "screw Magento" dan
hapus
3
Saya bukan penggemar daftar ini, karena 1: tidak lengkap, 2: ada 1231 blog lain tentang Magento dengan "semua" acara di Magento (+ beberapa halaman wiki di Magento).
FlorinelChis
@benmark tebak apa yang terjadi dalam waktu yang berarti ...
toon81
9

Saya tahu bahwa pertanyaan ini telah dijawab, saya tambahkan saja di sini:

  • Saya menyiapkan halaman yang ingin saya amati di browser saya
  • Saya membuka aplikasi / Mage.php
  • untuk public static function dispatchEvent(ln: ~ 446) di awal saya tambahkan //Mage::log($name, null, 'events.log', true);
  • batalkan komentar pada garis itu,
  • segarkan laman yang saya kunjungi
  • berkomentar lagi baris itu

Kemudian Anda membuka var / log / events.log (~ 40kb) dan melihat banyak peristiwa di halaman itu saja! :)

Kresimir Pendic
sumber
2
Ini akan melewatkan beberapa peristiwa yang dipecat sebelum konfigurasi toko digabungkan.
patokan
6

Jawaban sudah diterima tetapi saya tetap akan mengirim jawaban saya untuk masa depan:

Jika Anda ingin melihat daftar acara yang dimiliki Magento, Anda memiliki 3 opsi:

1) Google untuk itu, ada banyak orang yang telah menyusun daftar acara Magento

2) Buat modul yang mengaitkan pada controller_action_predispatchacara yang merupakan acara yang dipanggil sebelum acara lain dipanggil. Di dalam modul ini Anda dapat mencatat beberapa peristiwa yang dikirim:

Tambahkan yang berikut ini di config.xml

<events>
    <controller_action_postdispatch>
        <observers>
            <controller_action_after>
                <class>yourmodule/observer</class>
                <method>hookToControllerActionPostDispatch</method>
            </controller_action_after>
        </observers>
    </controller_action_postdispatch>
</events>

Dan di dalam modul / Model / Pengamat Anda:

public function hookToControllerActionPostDispatch($observer) {
    Mage::log($observer->getEvent()->getControllerAction()->getFullActionName());
}

Di atas akan mencatat setiap peristiwa yang dikirim ...

3) Jika Anda memiliki akses SSH Anda dapat menjalankan perintah berikut untuk mendapatkan gambaran umum dari semua peristiwa (dan file mereka di mana mereka dikirim):

cd /path/to/<magento-root>
grep -nris 'dispatchEvent' app/code/
Kenny
sumber
1
Maaf - sementara # 3 baik, informasi dalam 1 & 2 dari jawaban Anda benar-benar tidak benar. 1) Ada beberapa peristiwa yang dipecat sebelumnya controller_action_predispatch, terutama controller_front_init_before. 2) Pendekatan ini tidak akan mencatat setiap peristiwa yang dikirim, apakah ini bagian salah ketik atau tidak lengkap?
patokan
Diedit ke "most";)
Kenny
2
Maaf, masih belum terlalu akurat :-( - ada banyak lagi acara yang dikirim (predispatch, tata letak, render, serta model dan koleksi koleksi) ...
patok
Memperbarui jawaban untuk "beberapa acara".
Kenny
4

Saya menggunakan Magento Developer Toolbar yang memiliki fitur bagus untuk menampilkan acara yang dapat diamati pada halaman yang dimuat.

Damir Mitrovic
sumber
4

Saya telah melakukan grep pada modul Mage inti Magento, dan memenuhi daftar,

Daftar Lengkap Acara Magento

PS Seperti yang ditunjukkan, mungkin berisi peristiwa yang ada di dalam fungsi Magento yang sudah usang, jadi periksa file dan referensi baris sebelum implementasi.

Buka saran!

huzefam
sumber
1
Anda masih melewatkan semua acara sulap subclass. Tidak bisa dipahami.
patokan
Peristiwa ajaib seperti di? Yang dinamis? Bisakah Anda menguraikan plz @benmarks
huzefam
@benmark saya setuju, saya tidak berpikir kita perlu menyiapkan daftar secara eksplisit untuk ini
huzefam
Karenanya komentar saya, yang ditawarkan berdasarkan penggunaan "lengkap"
tandas
4
grep "::dispatchEvent" -R * | sort -u

grep "eventPrefix" -R * | sort -u

Perintah grep yang terdaftar sebelumnya akan membuat duplikat (banyak) dan itu tidak mencakup daftar awalan acara yang akan diperlukan untuk memahami nama acara yang dihasilkan secara dinamis. Perintah-perintah ini membuat kedua daftar dengan hanya nilai unik. Anda dapat menambahkan flag -n seperti jawaban grep lainnya dan mendapatkan nomor baris yang saya kira. Tetapi pertanyaannya tidak menanyakan di mana dalam kode mereka semua. ~ _ ~

mprototipe
sumber
kami memiliki jawaban serupa di sini. Lihat jawaban @TimBezhashvyly
Rajeev K Tomy
semacam .... perintah grep yang terdaftar sebelumnya akan membuat duplikat (banyak) dan itu tidak mencakup daftar awalan acara yang akan diperlukan untuk memahami nama acara yang dihasilkan secara dinamis. Perintah-perintah ini membuat kedua daftar dengan hanya nilai unik. Anda dapat menambahkan flag -n seperti jawaban grep lainnya dan mendapatkan nomor baris yang saya kira. Tetapi pertanyaannya tidak menanyakan di mana dalam kode mereka semua.
mprototype
bisakah Anda menambahkan deskripsi ini ke jawaban Anda. Maka jawaban Anda menjadi sangat keren ... (siap untuk melakukan upvote) :-)
Rajeev K Tomy
Apakah itu membantu?
mprototype
Iya. +1 untuk itu. :)
Rajeev K Tomy