Magento观察者事件 - 操作顺序
-
16-10-2019 - |
题
我正在尝试将功能注入 catalog_model_product_duplicate
事件。该模块的一部分将是确保重复产品的库存状态也重复;目前不是。
我看到 CatalogInventory
观察此事件并设置一些标准库存信息。我可以确保在当地人面前解决核心事件吗?我可以依靠这里的操作顺序吗?
解决方案
派遣事件的顺序取决于将模块加载的顺序。由于您需要确保 CatalogInventory
模块的观察者在您的观察者发射之前,您需要做的就是简单地配置模块以依赖于 Mage_CatalogInventory
模块。您可以通过在您的代码中添加对代码的节点来做到这一点 app/etc/modules/My_Module.xml
文件:
<config>
<modules>
<My_Module>
<active>true</active>
<codePool>local</codePool>
<depends>
<Mage_CatalogInventory />
</depends>
</My_Module>
</modules>
</config>
这 depends
上面XML中的节点是这里的关键配置,因为它迫使Magento Core模块加载之前。
其他提示
派遣事件的顺序无法轻易保证。它们取决于加载模块的顺序。通常,所有核心事件观察者都会在社区和本地代码池观察者之前调用。
有一种方法可以通过“伪造”核心模块对本地或社区的依赖性来迫使洋红色观察者在自定义的观察者之后开火。在这里看看李的答案: 在现有的Magento观察者之前进行自定义观察者大火.
/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>
我个人不喜欢这种方法,因为我不知道迫使这种依赖性会产生什么后果。
对于您的用例,听起来您应该对数据/状态进行某种检测,以了解是否被触发。比试图强制事件顺序相比,在模型上检查数据/状态是可取的。
一般答案
观察者由 区域 首先,然后 模块加载顺序
这意味着,所有观察者都注册了 <global>
被执行 前 所有观察者都注册 <frontend>
或者 <adminhtml>
.
在一个区域内,观察者按照它们出现在合并的配置XML树中的顺序执行,这在技术上意味着已加载模块的顺序。
模块加载顺序如下确定:
依赖图是由
<depends>
定义在app/etc/modules/*.xml
. 。如果x取决于y,则在x之前加载y。通过依赖性订购后,核心模块优先于社区和本地模块
其他所有内容都按字母顺序加载。请注意,文件名
app/etc/modules
用于比较,而不是实际的模块名称。
因此,您有两个选择影响模块加载顺序的选项:
- 依靠另一个模块使您的观察者在其之后执行(或使另一个模块依赖于您的观察者以前执行它们)
- 重命名模块定义文件。您无需重命名模块本身,因为文件名除了加载顺序无关紧要。
(“ 3.将模块添加到核心代码池”不计数)
也可以看看:
只是一个建议,观察 catalog_model_product_duplicate
和 catalog_model_product_save_after
与Singleton观察者。在 catalog_model_product_duplicate
将库存数据设置为观察者数据,在 catalog_model_product_save_after
使用该数据填充复制产品的库存。