Onde posso encontrar uma lista completa dos eventos Magento?

94

Eu sei que o Magento tem um sistema semelhante a um gancho chamado events. Alguém tem uma lista completa ou um script que pode ser usado para determinar quais eventos podem ser chamados?

benmarks
fonte
4
Eu uso isso como uma boa folha de fraude nicksays.co.uk/magento-events-cheat-sheet-1-7
Derrik Nyomo
1
@DerrikNyomo - você deve postar isso como resposta, juntamente com um resumo das informações que ele fornece. :-)
benmarks
1
As folhas de dicas para eventos são, na verdade, mais incômodas, pois dão a você uma falsa sensação de que 'o evento que eu quero não existe' e você pode perder horas de codificação, perdendo um evento que poderia ter sido usado (já que muito são criados dinamicamente) Publiquei uma resposta a esta pergunta: link e minha resposta também se refere a esta pergunta. Ele não fornece uma 'lista' completa, mas fornece uma lista completa de eventos para o carregamento de ação / página que você está interessado em conectar.
ProxiBlue

Respostas:

102

Não há uma lista de todos os eventos magento, porque a maioria dos eventos é nomeada dinamicamente.

Se você me perguntar, conhecer esses eventos importantes (e as consequências) é um bom ponto de partida (ao lado da lista de nick):

Todo objeto estendido de Mage_Core_Model_Abstract envia muitos eventos para carregar, salvar e excluir:

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

Por exemplo, para adicionar verificações, depois que o objeto foi carregado

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

para adicionar dados adicionais ao objeto antes que ele seja salvo

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

Para salvar outros modelos depois que o "pai" foi salvo

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

antes de excluir o modelo

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

limpar, antes que o modelo seja excluído - ou talvez depois? Você ainda está aqui na transação!

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

Se você quiser ter certeza de que a entidade foi excluída

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

As coleções estendidas de Mage_Core_Model_Resource_Db_Collection_Abstract também possuem dois eventos genéricos:

Por exemplo: para alterar o SQL para carregar a coleção:

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

Por exemplo: para adicionar dados adicionais aos objetos:

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
fonte
4
Muito boa resposta; esperando por algo que possamos colocar no wiki. A importância do _eventPrefixpara os eventos modelo, os eventos direcionados pedido, os eventos de blocos genéricos ocasionalmente-úteis, e a importância do registro para encontrar eventos
benmarks
1
Excelente. Eu queria observar que no Magento 2 eles realmente precisam garantir que todas as classes principais tenham um prefixo de evento definido. Na verdade, eu reescrevi as classes apenas para definir o prefixo do evento, para que eu possa conectar-se corretamente a salvar / carregar eventos. Hmm. Na verdade, acho que vou verificar a fonte do Magento 2.
Tim Reynolds
3
A abordagem que eu costumo adotar é uma rápida edição / salvamento / reversão para app/code/core/Mage/Core/Model/App.phpe mage::log($eventName,null,'events.txt',true);para o dispatchEventmétodo. Carregue a página que estou tentando observar. Obviamente, não deixe isso como está e reverta depois que seu var / logs / events.txt for criado. Sujo, sim. Rápido, sim. :)
B00MER
2
bom, se você quiser que seu observador esteja em uma página. Mas tenha cuidado, há eventos que devem ser despachados, mas podem não ser. Não é um evento de ordem ou de pagamento que não é jogado, quando pago com paypal ...
Fabian Blechschmidt
Existe algum evento disparado após a criação da remessa no magento @FabianBlechschmidt
Kingshuk Deb
48

Faça o sangrento grep 'Mage::dispatchEvent' app/ -rsnIsso fornecerá uma lista de eventos específicos para sua instalação, pois a lista de eventos pode variar dependendo da versão do Magento, personalizações e extensões instaladas.

user487772
fonte
2
Esse é o melhor conselho: incluirá também eventos de módulos de terceiros. Normalmente, quando quero saber em quais eventos posso conectar-se a uma página específica, faço o log de parâmetros app: dispatchEvent.
Petar Dzhambazov
1
O grep também fornecerá informações ruins: por exemplo, afirma que sales_order_place_afterisso acontecerá, mas parece que a chamada para acioná-lo foi comentada Checkout/Type/Onepage.php.
Kojiro
Essa é uma resposta ruim, pois ela capta apenas uma fração dos eventos disponíveis, pois perde completamente todos os eventos gerados dinamicamente. @PetarDzhambazov dá um bom conselho para fazer logon no expedidor e depois carregar as páginas em que você está interessado. A melhor resposta de longe é a resposta aceita dada por FabianBlechschmidt
Dom
26

Eu uso isso como uma boa folha de dicas http://www.nicksays.co.uk/magento-events-cheat-sheet-1-7/ . Tem todos os eventos que podem ser chamados no 1.7.

Derrik Nyomo
fonte
4
Desde que você já tenha feito um bom trabalho de vincular o conteúdo, melhor para também fornecer o conteúdo aqui no caso de Nick diz "parafuso Magento" e exclui sua página :-)
benmarks
3
Não sou fã desta lista, porque 1: está incompleto, 2: existem outros 1231 blogs sobre Magento com "todos" os eventos no Magento (+ algumas páginas wiki no Magento).
precisa saber é o seguinte
@benmarks adivinhar o que aconteceu nesse meio tempo ...
toon81
9

Sei que esta pergunta foi respondida, apenas adiciono o meu caminho aqui:

  • Preparo a página que quero observar no meu navegador
  • Abro app / Mage.php
  • para public static function dispatchEvent(ln: ~ 446) no começo eu adiciono //Mage::log($name, null, 'events.log', true);
  • descomente essa linha,
  • atualizar a página em que estou
  • comentar novamente essa linha

Então você abre var / log / events.log (~ 40kb) e vê muitos eventos somente nessa página! :)

Kresimir Pendic
fonte
2
Isso perderá alguns eventos disparados antes da mesclagem da configuração da loja.
benmarks
6

A resposta já foi aceita, mas postarei minha resposta de qualquer maneira para o futuro:

Se você quiser ver a lista de eventos que o Magento possui, você tem 3 opções:

1) Google, há muitas pessoas que compilaram uma lista de eventos Magento

2) Crie um módulo que se conecte controller_action_predispatchao evento que é chamado antes de qualquer outro evento. Dentro deste módulo, você pode registrar alguns eventos que são despachados:

Adicione o seguinte em 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>

E dentro do seu módulo / modelo / observador:

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

O acima registraria todos os eventos despachados ...

3) Se você tiver acesso SSH, poderá executar o seguinte comando para obter uma visão geral de todos os eventos (e seus arquivos para onde eles são despachados):

cd /path/to/<magento-root>
grep -nris 'dispatchEvent' app/code/
Kenny
fonte
1
Desculpe - enquanto o número 3 é bom, as informações em 1 e 2 da sua resposta realmente não estão corretas. 1) Existem alguns eventos disparados antes controller_action_predispatch, principalmente controller_front_init_before. 2) Essa abordagem simplesmente não registra todos os eventos despachados, isso é um erro de digitação ou seção incompleta?
benmarks 29/01
Editou-o para "most";)
Kenny
2
Desculpe, ainda não é muito preciso :-( - existem muitos outros eventos despachados (pré-distribuição, layout, renderização, bem como cargas de modelo e de coleção) ...
benmarks
Atualizado a resposta para "alguns eventos".
Kenny
4

Estou usando a barra de ferramentas Magento Developer que possui um recurso interessante para a exibição de eventos que podem ser observados na página carregada.

Damir Mitrovic
fonte
4

Eu fiz um grep no módulo Mage principal do Magento e cumpri uma lista,

Lista exaustiva de eventos Magento

PS Como indicado, pode conter eventos que estão dentro das funções obsoletas do Magento, portanto verifique a referência de arquivo e linha antes da implementação.

Aberto para sugestões!

huzefam
fonte
1
Você ainda está perdendo todos os eventos mágicos subclassificados. Não pode ser recebido por.
benmarks
Eventos mágicos como em? Os que são dinâmicos? Você poderia elaborar plz @benmarks
huzefam
@benmarks eu concordo, eu não acho que nós precisamos preparar uma lista explicitamente para este
huzefam
Daí o meu comentário, que foi oferecido com base no uso de "exaustivo"
benmarks
4
grep "::dispatchEvent" -R * | sort -u

grep "eventPrefix" -R * | sort -u

O comando grep listado anteriormente renderizaria duplicatas (muito) e não cobre a lista de prefixos de eventos que seriam necessários para entender os nomes de eventos gerados dinamicamente. Esses comandos processam as duas listas apenas com valores exclusivos. Você pode adicionar o sinalizador -n como a outra resposta grep e obter o número da linha que eu suponho. Mas a pergunta não perguntou onde estavam todos no código. ~ _ ~

mprototype
fonte
nós temos uma resposta semelhante aqui. Consulte a resposta de @TimBezhashvyly
Rajeev K Tomy
mais ou menos ... o comando grep listado anteriormente renderizaria duplicatas (muito) e não cobre a lista de prefixos de eventos que seriam necessários para entender os nomes de eventos gerados dinamicamente. Esses comandos processam as duas listas apenas com valores exclusivos. Você pode adicionar o sinalizador -n como a outra resposta grep e obter o número da linha que eu suponho. Mas a pergunta não perguntou onde estavam todos no código.
Mprototype
Você poderia adicionar esta descrição à sua resposta. Então sua resposta se torna super legal ... (estou pronto para fazer um voto positivo então) :-) #
305 Rajeev K Tomy
Isso ajuda?
Mprototype
Sim. +1 para isso. :)
Rajeev K Tomy