在哪里可以找到Magento事件的完整列表?


94

我知道Magento有一个类似钩子的系统,称为事件。是否有人拥有可用于确定可以调用哪些事件的完整列表或脚本?


4
我用它作为一个不错的备忘单nicksays.co.uk/magento-events-cheat-sheet-1-7
Derrik Nyomo

1
@DerrikNyomo-您应该将其发布为答案以及其提供的信息摘要。:-)
benmarks

1
实际上,事件备忘单更加麻烦,因为它们给您一种错误的感觉,即“我想要的事件不存在”,并且由于错过了可以使用的事件,您可能会浪费大量的编码时间(因为很多(是动态创建的))。我发布了此问题的答案:链接,我的答案也与此问题有关。它没有为您提供完整的“列表”,但确实为您提供了有关您感兴趣的操作/页面加载的事件的完整列表。
ProxiBlue

Answers:


102

没有所有magento事件的列表,因为大多数事件是动态命名的。

如果您问我,了解这些关键事件(及其后果)是一个很好的起点(除了nick的清单):

从Mage_Core_Model_Abstract扩展的每个对象都在加载,保存和删除方面调度很多事件:

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

例如,在对象加载后添加检查

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

在保存之前向对象添加其他数据

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

保存“父级”后要保存其他模型

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

在删除模型之前进行清理

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

在删除模型之前清理-也许之后?您仍在交易中!

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

如果要确保实体已删除

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

从Mage_Core_Model_Resource_Db_Collection_Abstract扩展的集合也有两个通用事件:

例如:更改SQL以加载集合:

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

例如:向对象添加其他数据:

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

4
非常好的答案;希望我们可以在Wiki中添加一些内容。的重要性_eventPrefix的模型事件,有针对性的请求事件,偶尔-有用的通用块的事件和日志记录,找到事件的重要性
benmarks

1
优秀的。我想指出,在Magento 2中,他们确实需要确保所有核心类都具有定义的事件前缀。我实际上已经重写了一些类,只是为了定义事件前缀,这样我就可以清楚地插入到保存/加载事件中。嗯 实际上,我想我自己去检查Magento 2来源。
蒂姆·雷诺兹

3
我通常采取的方法是,快速编辑/保存/恢复app/code/core/Mage/Core/Model/App.phpmage::log($eventName,null,'events.txt',true);dispatchEvent方法。加载我试图观察的页面。显然,不要将其保留原样,一旦创建了var / logs / events.txt,请还原它。肮脏的,是的。很快,是的。:)
B00MER 2013年

2
好,如果您希望观察者在一页上。但是要小心,有些事件应该发送,但可能不应该发送。用

在magento @FabianBlechschmidt中创建装运后,是否有任何事件被解雇
Kingshuk Deb

48

尽力而为grep 'Mage::dispatchEvent' app/ -rsn这将为您提供特定于安装的事件列表,因为事件列表可能会有所不同,具体取决于安装的Magento版本,自定义项和扩展名。


2
这是最好的建议,它将包括第三方模块事件。通常,当我想知道可以挂接到特定页面的事件时,会记录app:dispatchEvent参数。
Petar Dzhambazov

1
grep还会为您提供错误的信息:例如,它声称sales_order_place_after会发生这种情况,但是似乎将其触发的调用已被注释掉Checkout/Type/Onepage.php
kojiro 2013年

这是一个很差的答案,因为它完全错过了所有动态生成的事件,因此只会拾取一部分可用事件。@PetarDzhambazov提供了很好的建议,可以从调度程序登录,然后加载您感兴趣的页面。到目前为止,最佳答案是FabianBlechschmidt
Dom

26

我将其用作一个不错的备忘单http://www.nicksays.co.uk/magento-events-cheat-sheet-1-7/。它具有可以在1.7中调用的所有事件。


4
由于您已经很好地链接了内容,因此最好在此处也提供内容,以防尼克说“拧下Magento”并删除其页面:-)
benmarks

3
我不是这个列表的支持者,因为1:它是不完整的; 2:还有其他1231个有关Magento的博客,其中包含Magento中的“所有”事件(Magento上有一些Wiki页面)。
FlorinelChis

@benmarks猜测在
同一

9

我知道已经回答了这个问题,我在这里添加自己的方法:

  • 我准备要在浏览器中观察的页面
  • 我打开app / Mage.php
  • 对于public static function dispatchEvent(LN:〜446)在我添加开始时 //Mage::log($name, null, 'events.log', true);
  • 取消注释该行,
  • 刷新我所在的页面
  • 再次评论那条线

然后打开var / log / events.log(〜40kb),仅在该页面上看到很多事件!:)


2
这将丢失在合并存储配置之前触发的一些事件。
Benmarks 13-10-9

6

答案已经被接受,但我还是会在将来发布我的答案:

如果您想查看Magento拥有的事件列表,则有3个选项:

1)为此,有很多人编制了Magento活动列表

2)创建一个与controller_action_predispatch事件挂钩的模块,该事件是在调用任何其他事件之前调用的事件。在此模块内,您可以记录已调度的一些事件:

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

在yourmodule / Model / Observer中:

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

上面将记录调度的每个事件...

3)如果您具有SSH访问权限,则可以运行以下命令以获取所有事件(及其分发事件的文件)的概述:

cd /path/to/<magento-root>
grep -nris 'dispatchEvent' app/code/

1
抱歉-尽管#3不错,但答案中1和2中的信息确实不正确。1)以前发生过一些事件controller_action_predispatch,特别是controller_front_init_before。2)这种方法根本不会记录发送的每个事件,这是拼写错误还是不完整的部分?
benmarks

将其编辑为“最多”;)
肯尼(Kenny

2
抱歉,仍然不是很准确:-(-调度了太多事件(预调度,布局,渲染以及模型和集合加载)...
benmarks 2013年

将答案更新为“某些事件”。
肯尼,



4

我在Magento的核心Mage模块上做了一个grep,并编写了一个列表,

Magento活动的详尽清单

PS如前所述,可能包含在Magento不推荐使用的函数中的事件,因此在实现之前请检查文件和行引用。

公开征求意见!


1
您仍然缺少所有子类的魔术事件。不能被窃取。
benmarks 2014年

魔术事件在吗?哪些是动态的?您能详细说明一下plz @benmarks
huzefam 2014年


@benmarks我同意,我认为我们不需要为此明确准备一份清单
huzefam 2014年

因此,我的评论是基于“详尽”的使用而提出的
Benmarks 2014年

4
grep "::dispatchEvent" -R * | sort -u

grep "eventPrefix" -R * | sort -u

前面列出的grep命令将呈现重复项(很多),并且不包括理解动态生成的事件名称所需的事件前缀列表。这些命令仅使用唯一值来呈现两个列表。您可以像其他grep答案一样添加-n标志,并获得我想的行号。但是问题并没有问它们在代码中都在哪里。〜_〜


我们在这里有类似的答案。请参阅@TimBezhashvyly的答案
Rajeev K Tomy

.....前面列出的grep命令将呈现重复项(很多),并且不包括理解动态生成的事件名称所需的事件前缀列表。这些命令仅使用唯一值来呈现两个列表。您可以像其他grep答案一样添加-n标志,并获得我想的行号。但是问题并没有问它们在代码中都在哪里。
mprototype,2015年

您能否将此说明添加到您的答案中。然后您的答案就变得很酷……(我准备好了,然后准备发牢骚):-)
Rajeev K Tomy 2015年

有帮助吗?
mprototype,2015年

是。+1。:)
Rajeev K Tomy






By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.