gpt4 book ai didi

magento - 您如何在 Magento 中设置事件观察者的排序顺序?

转载 作者:行者123 更新时间:2023-12-03 11:15:22 25 4
gpt4 key购买 nike

我在 catalog_product_save_after 上创建了一个观察者事件,但它似乎在运行 applyAllRulesOnProduct() 的目录规则观察者之前被调用方法。我需要在 applyAllRulesOnProduct() 之后给我打电话运行。这些观察者的顺序是如何选择的?

最佳答案

与 Magento 中的许多人一样,答案很复杂。还有两个 您的具体情况可能涉及的可能问题。这会很长——跳到最后看无上下文的简短版本。
模块加载顺序
没有办法明确 设置观察者排序顺序。 Magento 将按照它们的顺序运行事件 merged into the global configuration .因此,虽然您无法具体控制事件的顺序,但您 可以使用 <depends/> 控制 Magento 加载和合并模块的顺序在您的 app/etc/modules 中添加标签XML 声明文件。
例如,在 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_CoreMage_Oauth模块。这意味着 Mage_Api2config.xml文件将被合并 之后 config.xml Mage_Core 的文件和 Mage_Oauth .这意味着 Mage_Api2 中定义的事件将在 Mage_Core 中定义的事件之后运行和 Mage_Oauth .
缺少 <depends/>节点,模块加载的规则是
  • 全部 核心 模块在非核心模块之前加载
  • 其余模块按字母顺序加载。

  • 让您的模块依赖于 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/> 节点内)。这意味着观察者将在 中运行两个 frontendadminhtml Magento 的区域。但是,也可以 限制 您的事件所在的区域。例如, catalogrule您提到的事件在 adminhtml 中定义区域
    <!-- #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模块,并将您的事件观察器配置移动到 <adminhtml/>模块的 config.xml 中的节点.

    关于magento - 您如何在 Magento 中设置事件观察者的排序顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15934553/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com