Gdzie mogę znaleźć pełną listę wydarzeń Magento?

94

Wiem, że Magento ma system przypominający hak zwany zdarzeniami. Czy ktoś ma pełną listę lub skrypt, za pomocą którego można określić, które zdarzenia można wywołać?

zalety
źródło
4
Używam tego jako ładnego ściągawki nicksays.co.uk/magento-events-cheat-sheet-1-7
Derrik Nyomo 24.01.2013
1
@DerrikNyomo - powinieneś opublikować to jako odpowiedź wraz z podsumowaniem informacji, które zawiera. :-)
zyskuje
1
Ściągawki na imprezy są w rzeczywistości bardziej kłopotliwe, ponieważ dają fałszywe poczucie, że „wydarzenie, którego chcę, nie istnieje” i możesz tracić godziny na kodowanie, przegapiając wydarzenie, które można było wykorzystać (ponieważ wiele są tworzone dynamicznie). Opublikowałem odpowiedź na to pytanie: link i moja odpowiedź dotyczy również tego pytania. Nie daje ci kompletnej „listy”, ale daje ci pełną listę zdarzeń związanych z działaniem / ładowaniem strony, do których chcesz się podłączyć.
ProxiBlue

Odpowiedzi:

102

Nie ma listy wszystkich zdarzeń magento, ponieważ większość zdarzeń ma nazwy dynamiczne.

Jeśli mnie zapytasz, znajomość tych kluczowych wydarzeń (i ich konsekwencji) jest dobrym punktem wyjścia (obok listy z nicka):

Każdy obiekt rozszerzony z Mage_Core_Model_Abstract wywołuje wiele zdarzeń dotyczących ładowania, zapisywania i usuwania:

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

Na przykład, aby dodać kontrole, po załadowaniu obiektu

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

aby dodać dodatkowe dane do obiektu przed jego zapisaniem

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

Aby zapisać inne modele po zapisaniu „rodzica”

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

wyczyść, zanim model zostanie usunięty

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

posprzątaj, zanim model zostanie usunięty - a może później? Jesteś tutaj nadal w transakcji!

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

Jeśli chcesz mieć pewność, że jednostka została usunięta

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

Kolekcje rozszerzone z Mage_Core_Model_Resource_Db_Collection_Abstract mają również dwa ogólne zdarzenia:

Na przykład: aby zmienić kod SQL i załadować kolekcję:

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

Na przykład: aby dodać dodatkowe dane do obiektów:

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
źródło
4
Bardzo dobra odpowiedź; mając nadzieję na coś, co możemy schować na wiki. Znaczenie _eventPrefixzdarzeń modelowych, zdarzeń żądania ukierunkowanego, czasami użytecznych ogólnych zdarzeń blokowych oraz znaczenie logowania w celu znalezienia zdarzeń
zaznacza
1
Doskonały. Chciałem zauważyć, że w Magento 2 naprawdę muszą upewnić się, że wszystkie klasy podstawowe mają zdefiniowany prefiks zdarzeń. Właściwie przepisałem klasy tylko po to, aby zdefiniować prefiks zdarzenia, aby móc bez problemu podłączyć się do zdarzeń zapisu / ładowania. Hmm Właściwie myślę, że sam pójdę sprawdzić źródło Magento 2.
Tim Reynolds,
3
Podejście I zazwyczaj jest szybkie edytować / zapisać / przywrócić app/code/core/Mage/Core/Model/App.phpi mage::log($eventName,null,'events.txt',true);do dispatchEventmetody. Załaduj stronę, którą próbuję obserwować. Oczywiście nie zostawiaj tego tak, jak jest i przywróć po utworzeniu pliku var / logs / events.txt. Brudne, tak. Szybko tak. :)
B00MER
2
dobrze, jeśli chcesz, aby Twój obserwator był na jednej stronie. Ale bądź ostrożny, są wydarzenia, które powinny zostać wysłane, ale mogą nie być. Istnieje zamówienie lub zdarzenie płatnicze, które nie jest wyrzucane, gdy jest płacone paypal ...
Fabian Blechschmidt
Czy zdarzenie zostaje zwolnione po utworzeniu przesyłki w magento @FabianBlechschmidt
Kingshuk Deb
48

Do the bloody grep 'Mage::dispatchEvent' app/ -rsnZapewni ci to listę wydarzeń specyficznych dla twojej instalacji, ponieważ lista wydarzeń może się różnić w zależności od wersji Magento, zainstalowanych dostosowań i rozszerzeń.

użytkownik487772
źródło
2
To najlepsza rada, obejmie również wydarzenia związane z modułami stron trzecich. Zwykle, gdy chcę wiedzieć, do których zdarzeń mogę się przyczepić dla konkretnej strony, loguję parametry aplikacji: dispatchEvent.
Petar Dzhambazov
1
Grep dostarczy ci również złych informacji: na przykład twierdzi, że sales_order_place_aftertak się stanie, ale wygląda na to, że wezwanie do strzału, z którego został skomentowany, zostało skomentowane Checkout/Type/Onepage.php.
kojiro
To kiepska odpowiedź, ponieważ wychwytuje tylko ułamek dostępnych zdarzeń, ponieważ całkowicie pomija wszystkie dynamicznie generowane zdarzenia. @PetarDzhambazov daje dobrą radę, aby zalogować się od dyspozytora, a następnie załadować strony, które Cię interesują. Najlepszą odpowiedzią jest jak dotąd zaakceptowana odpowiedź udzielona przez FabianBlechschmidt
Dom
26

Używam tego jako ładnego ściągawki http://www.nicksays.co.uk/magento-events-cheat-sheet-1-7/ . Ma wszystkie zdarzenia, które można wywołać w 1.7.

Derrik Nyomo
źródło
4
Skoro już wykonałeś dobrą robotę w łączeniu treści, najlepiej też tutaj podaj treść, na wypadek gdyby Nick powiedział „wkręć Magento” i
usunął
3
Nie jestem fanem tej listy, ponieważ 1: jest niekompletna, 2: istnieją inne 1231 blogi o Magento z „wszystkimi” wydarzeniami w Magento (+ niektóre strony wiki na Magento).
FlorinelChis
@benmarks zgadnij, co wydarzyło się w międzyczasie ...
toon81
9

Wiem, że odpowiedziano na to pytanie, dodam tutaj swoją drogę:

  • Przygotowuję stronę, którą chcę oglądać w przeglądarce
  • Otwieram aplikację / Mage.php
  • dla public static function dispatchEvent(ln: ~ 446) na początku dodaję //Mage::log($name, null, 'events.log', true);
  • odkomentować tę linię,
  • odśwież stronę, na której jestem
  • skomentuj ponownie ten wiersz

Następnie otwierasz var / log / events.log (~ 40kb) i widzisz wiele wydarzeń tylko na tej stronie! :)

Kresimir Pendic
źródło
2
Spowoduje to pominięcie niektórych zdarzeń uruchamianych przed scaleniem konfiguracji sklepu.
benmarks
6

Odpowiedź została już zaakceptowana, ale i tak opublikuję moją odpowiedź na przyszłość:

Jeśli chcesz zobaczyć listę wydarzeń, które Magento ma, masz 3 opcje:

1) Google, jest wiele osób, które opracowały listę wydarzeń Magento

2) Utwórz moduł, który przechwytuje controller_action_predispatchzdarzenie, które jest wywoływane przed wywołaniem jakiegokolwiek innego zdarzenia. Wewnątrz tego modułu możesz rejestrować niektóre zdarzenia, które są wywoływane:

Dodaj następujące informacje na 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>

A wewnątrz modułu / Modelu / Obserwatora:

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

Powyższe zapisuje każde wysłane zdarzenie ...

3) Jeśli masz dostęp do SSH, możesz uruchomić następujące polecenie, aby uzyskać przegląd wszystkich zdarzeń (i ich plików, w których są wysyłane):

cd /path/to/<magento-root>
grep -nris 'dispatchEvent' app/code/
Kenny
źródło
1
Przepraszamy - chociaż nr 3 jest dobry, informacje w 1 i 2 z Twojej odpowiedzi są naprawdę nieprawidłowe. 1) controller_action_predispatchZwłaszcza kilka wcześniej odpalonych wydarzeń controller_front_init_before. 2) Takie podejście po prostu nie rejestruje każdego wysłanego zdarzenia, czy jest to literówka czy niekompletna sekcja?
zyskuje
Zmieniłem to na „większość”;)
Kenny
2
Niestety, wciąż niezbyt dokładne :-( - wysłano o wiele więcej zdarzeń (predispatch, layout, rendering, a także ładowanie modelu i kolekcji) ...
benmarks
Zaktualizowano odpowiedź do „niektórych zdarzeń”.
Kenny,
4

Używam Magento Developer Toolbar, który ma fajną funkcję wyświetlania zdarzeń, które można zaobserwować na ładowanej stronie.

Damir Mitrovic
źródło
4

Zrobiłem grep na głównym module Magento i przestrzegałem listy,

Wyczerpująca lista wydarzeń Magento

PS Jak wskazano, może zawierać zdarzenia, które są w przestarzałych funkcjach Magento, więc sprawdź implementację pliku i linii przed implementacją.

Otwarty na sugestie!

huzefam
źródło
1
Wciąż brakuje ci wszystkich magicznych wydarzeń z podklas. Nie można się na niego przywitać.
zyskuje
Magiczne wydarzenia jak w? Te, które są dynamiczne? Czy mógłbyś opracować plz @benmarks
huzefam
@benmarks Zgadzam się, nie sądzę, że musimy przygotować do tego wyraźną listę
huzefam
Stąd mój komentarz, który został zaproponowany w oparciu o użycie „wyczerpującego”
zaznaczono
4
grep "::dispatchEvent" -R * | sort -u

grep "eventPrefix" -R * | sort -u

Poprzednio wymienione polecenie grep wyświetlałoby duplikaty (często) i nie obejmuje listy prefiksów zdarzeń, które byłyby wymagane do zrozumienia dynamicznie generowanych nazw zdarzeń. Te polecenia renderują obie listy z unikalnymi wartościami. Możesz dodać flagę -n jak inną odpowiedź grep i uzyskać numer linii, jak sądzę. Ale pytanie nie zadawało, gdzie są w kodzie. ~ _ ~

mprototyp
źródło
mamy podobną odpowiedź tutaj. Patrz @TimBezhashvyly odpowiedź „s
Rajeev K Tomy
w pewnym sensie ... poprzednio wymienione polecenie grep wyświetlałoby duplikaty (dużo) i nie obejmuje listy prefiksów zdarzeń, które byłyby wymagane do zrozumienia dynamicznie generowanych nazw zdarzeń. Te polecenia renderują obie listy z unikalnymi wartościami. Możesz dodać flagę -n jak inną odpowiedź grep i uzyskać numer linii, jak sądzę. Ale pytanie nie zadawało, gdzie są w kodzie.
mprototyp
czy możesz dodać ten opis do swojej odpowiedzi? Wtedy twoja odpowiedź stanie się super fajna ... (jestem więc gotowy na głosowanie) :-)
Rajeev K Tomy
To pomaga?
mprototyp
Tak. +1 za to. :)
Rajeev K Tomy