我已经在catalog_product_save_after事件上创建了一个观察器,但是它似乎在运行applyAllRulesOnProduct()方法的catalogrule观察器之前被调用。我需要在applyAllRulesOnProduct()运行后调用我的。如何选择这些观察员的顺序?
catalog_product_save_after
applyAllRulesOnProduct()
jjjwad0x1#
这个问题的答案和Magento中的许多问题一样,很复杂。还有两个可能的问题,你的具体情况可能涉及。这将是一个长-跳到最后的无上下文的简短版本。
没有办法显式地设置观察者排序顺序。Magento将按照事件合并到全局配置中的顺序运行这些事件。所以,虽然你不能具体控制事件的顺序,但你可以通过使用app/etc/modules XML声明文件中的<depends/>标记来控制Magento加载和合并模块的顺序。例如,在Mage_Api2.xml文件中
app/etc/modules
<depends/>
Mage_Api2.xml
<!-- File: app/etc/modules/Mage_Api2.xml --> <config> <modules> <Mage_Api2> <active>true</active> <codePool>core</codePool> <depends> <Mage_Core /> <Mage_Oauth /> </depends> </Mage_Api2> </modules> </config>
作者指出Mage_Api2模块 * 依赖于Mage_Core和Mage_Oauth模块。这意味着Mage_Api2的config.xml文件将在Mage_Core和Mage_Oauth的config.xml文件之后合并**。这意味着Mage_Api2中定义的事件将在Mage_Core和Mage_Oauth中定义的事件之后运行。如果没有<depends/>节点,则模块加载规则如下1.所有核心模块在非核心模块之前加载1.其余模块将按顺序加载。让你的模块依赖于Mage_CatalogRule模块(其中定义了applyAllRulesOnProduct观察者方法)是一种很好的形式。但是,这应该不是必需的,因为所有核心模块都在非核心模块之前加载。这是因为在事件观察器方法的运行顺序中还有另一个因素。
Mage_Api2
Mage_Core
Mage_Oauth
config.xml
Mage_CatalogRule
applyAllRulesOnProduct
除了模块顺序,你还需要考虑你的事件观察器是在哪个区域定义的。也就是说,当您在Magento中创建一个事件观察器时,您会放入一些config.xml,如下所示
<config> <!-- ... --> <global> <!-- ... --> <events> <catalog_product_save_after> <observers> <abc_abc> <class>abc_abc/observer</class> <method>test</method> </abc_abc> </observers> </catalog_product_save_after> </events> </global> </config>
在上面的例子中,这个事件观察者已经在global区域中定义(因为它在<global/>节点内部)。这意味着观察者将在Magento的frontend和adminhtml区域中运行。但是,也可以限制您的活动运行的区域。例如,您提到的catalogrule事件在adminhtml区域中定义
global
<global/>
frontend
adminhtml
catalogrule
<!-- #File: app/code/core/Mage/CatalogRule/etc/config.xml --> <config> <!-- ... --> <adminhtml> <!-- ... --> <events> <!-- ... --> <catalog_product_save_after> <observers> <catalogrule> <class>catalogrule/observer</class> <method>applyAllRulesOnProduct</method> </catalogrule> </observers> </catalog_product_save_after> </events> </adminhtml> </config>
这意味着这个事件观察器将只运行在Magento的后端adminhtml区域。换句话说,它只在您在后端管理控制台中保存事件时运行。
这就是我认为你的问题所在,因为在Magento的现代版本(可能还有旧版本)中,来自<global/>节点的事件观察器总是在<adminhtml/>节点的事件观察器之前运行。我猜你的事件在<global/>节点上。尝试将其移动到<adminhtml/>节点。简短版本:确保您的模块<depends/>位于Mage_CatalogRule模块上,并将事件观察器配置移动到模块config.xml中的<adminhtml/>节点。
<adminhtml/>
nfzehxib2#
我知道这是一个旧的线程,但如果有人想改变他们的模块的加载顺序:/etc/modules/* 文件夹是按顺序加载的,所以如果你的模块的文件是第一个(或最后一个),它会相应地按顺序加载-所以你可以把/etc/modules/ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ另外,为了澄清,模块中的其他所有内容都可以保持不变(代码/文件和文件夹名称),您只需更改这一个文件,该文件可以命名为任何您选择的名称。
2条答案
按热度按时间jjjwad0x1#
这个问题的答案和Magento中的许多问题一样,很复杂。还有两个可能的问题,你的具体情况可能涉及。这将是一个长-跳到最后的无上下文的简短版本。
模块加载顺序
没有办法显式地设置观察者排序顺序。Magento将按照事件合并到全局配置中的顺序运行这些事件。所以,虽然你不能具体控制事件的顺序,但你可以通过使用
app/etc/modules
XML声明文件中的<depends/>
标记来控制Magento加载和合并模块的顺序。例如,在
Mage_Api2.xml
文件中作者指出
Mage_Api2
模块 * 依赖于Mage_Core
和Mage_Oauth
模块。这意味着Mage_Api2
的config.xml
文件将在Mage_Core
和Mage_Oauth
的config.xml
文件之后合并**。这意味着Mage_Api2
中定义的事件将在Mage_Core
和Mage_Oauth
中定义的事件之后运行。如果没有
<depends/>
节点,则模块加载规则如下1.所有核心模块在非核心模块之前加载
1.其余模块将按顺序加载。
让你的模块依赖于
Mage_CatalogRule
模块(其中定义了applyAllRulesOnProduct
观察者方法)是一种很好的形式。但是,这应该不是必需的,因为所有核心模块都在非核心模块之前加载。这是因为在事件观察器方法的运行顺序中还有另一个因素。
区域顺序
除了模块顺序,你还需要考虑你的事件观察器是在哪个区域定义的。也就是说,当您在Magento中创建一个事件观察器时,您会放入一些
config.xml
,如下所示在上面的例子中,这个事件观察者已经在
global
区域中定义(因为它在<global/>
节点内部)。这意味着观察者将在Magento的frontend
和adminhtml
区域中运行。但是,也可以限制您的活动运行的区域。例如,您提到的catalogrule
事件在adminhtml
区域中定义这意味着这个事件观察器将只运行在Magento的后端
adminhtml
区域。换句话说,它只在您在后端管理控制台中保存事件时运行。这就是我认为你的问题所在,因为在Magento的现代版本(可能还有旧版本)中,来自
<global/>
节点的事件观察器总是在<adminhtml/>
节点的事件观察器之前运行。我猜你的事件在<global/>
节点上。尝试将其移动到<adminhtml/>
节点。简短版本:确保您的模块
<depends/>
位于Mage_CatalogRule
模块上,并将事件观察器配置移动到模块config.xml
中的<adminhtml/>
节点。nfzehxib2#
我知道这是一个旧的线程,但如果有人想改变他们的模块的加载顺序:
/etc/modules/* 文件夹是按顺序加载的,所以如果你的模块的文件是第一个(或最后一个),它会相应地按顺序加载-所以你可以把/etc/modules/ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ
另外,为了澄清,模块中的其他所有内容都可以保持不变(代码/文件和文件夹名称),您只需更改这一个文件,该文件可以命名为任何您选择的名称。