catalog_product_save_after
事件上创建了一个观察者,但它似乎在运行applyAllRulesOnProduct()
方法的catalogrule观察者之前被调用。我需要在applyAllRulesOnProduct()
运行后调用我的观察者。这些观察者的顺序是如何选择的?catalog_product_save_after
事件上创建了一个观察者,但它似乎在运行applyAllRulesOnProduct()
方法的catalogrule观察者之前被调用。我需要在applyAllRulesOnProduct()
运行后调用我的观察者。这些观察者的顺序是如何选择的?答案像Magento中的许多问题一样复杂。您的特定情况可能涉及到两个可能的问题。这将会很长 - 跳到结尾获取无上下文的简短版本。
没有办法明确地设置观察者的排序顺序。Magento将按照它们合并到全局配置中的顺序运行事件。因此,虽然您无法特别控制事件的顺序,但是您可以通过在app/etc/modules
XML声明文件中使用<depends/>
标记来控制Magento加载和合并模块的顺序。
例如,在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_Core
和 Mage_Oauth
中定义的事件之后,将运行在 Mage_Api2
中定义的事件。<depends/>
节点,在模块加载的规则中有以下:
所有核心模块在非核心模块之前加载
其余模块按字母顺序加载。
Mage_CatalogRule
模块(其中定义了 applyAllRulesOnProduct
观察者方法)。然而,这不是必需的,因为所有核心模块都在非核心模块之前加载。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>
<!-- #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/>
节点。
我知道这是一个旧的帖子,但如果有人想要改变他们模块的加载顺序:
/etc/modules/* 文件夹按字母顺序加载,所以如果你的模块文件排在第一位(或最后一位),它会相应地按照那个顺序加载- 所以你可以将 /etc/modules/Namespace_Module.xml 重命名为 /etc/modules/ZZZNamespace_Module.xml,以便它最后被加载(假设没有其他以 ZZZZ... 开头的模块)
另外,需要澄清的是,你模块中的其他所有内容都可以保持不变(代码/文件和文件夹名称),你只需要更改这个文件的名称,它可以被命名为任何你选择的名称。
<depends/>
中使用Mage_CatalogRule
(大写“R”)。现在它完美地工作了。再次感谢! - Scruffy Paws