Magento观察员事件-操作顺序


9

我正在尝试向catalog_model_product_duplicate事件注入功能。该模块的一部分将是确保复制的产品的库存状态也被复制;目前不是。

我看到CatalogInventory观察到此事件并设置了一些标准库存信息。我能否保证在当地人之前解决核心事件?我可以依靠这里的任何操作顺序吗?

Answers:


11

调度事件的顺序取决于模块的加载顺序。由于您需要确保CatalogInventory模块的观察者先执行,因此您只需将模块配置为依赖于Mage_CatalogInventory模块即可。您可以通过在app/etc/modules/My_Module.xml文件中的代码中添加一个depends节点来做到这一点:

<config>
    <modules>
        <My_Module>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_CatalogInventory />
            </depends>
        </My_Module>
    </modules>
</config>

depends上面XML中的节点是这里至关重要的配置,因为它迫使Magento核心模块先于您加载。


7

无法轻松保证事件的分派顺序。它们取决于模块的加载顺序。通常,所有核心事件观察者将在社区和本地代码池观察者之前被调用。

有一种方法可以通过“伪造”核心模块对本地模块或社区模块的依赖来强迫magento观察者在自定义模块之后触发。在这里查看Lee的答案:在现有的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>

我个人不喜欢这种方法,因为我不知道强迫这种依赖会带来什么后果。

对于您的用例,听起来您应该对数据/状态进行某种检测以了解其是否被触发。检查模型上的数据/状态比尝试强制事件顺序更可取。


但是,就我而言,如果库存项目尚不存在,我将无事可做。对以后的事件有什么想法,我可能会嗅到这是否是重复方法的结果?
philwinkle

5

一般答案

观察者首先按区域执行,然后按模块加载顺序执行

这意味着,所有观察员登记在<global>执行之前在登记的所有观察员<frontend><adminhtml>

在一个区域内,观察者按照它们出现在合并的config XML树中的顺序执行,从技术上讲,这意味着模块的加载顺序。

模块加载顺序确定如下:

  1. 依赖关系图是根据中的<depends>定义构建的app/etc/modules/*.xml。如果X取决于Y,则在X之前加载Y。

  2. 通过依赖性排序后,核心模块的优先级高于社区和本地模块

  3. 其他所有内容均按字母顺序加载。请注意,文件名in app/etc/modules用于比较,而不是实际的模块名。

因此,您有两个选项可以影响模块的加载顺序:

  1. 依赖另一个模块让您的观察者在之后执行(或使另一个模块依赖您的观察者在之前执行)
  2. 重命名模块定义文件。您不需要重命名模块本身,因为文件名与加载顺序无关。

(“ 3.将模块添加到核心代码池”不计算在内)

也可以看看:


1

只是一个建议,同时观察catalog_model_product_duplicatecatalog_model_product_save_after与单观察者。在catalog_model_product_duplicate集库存数据作为观察数据,并catalog_model_product_save_after使用这些数据来填充库存复制产品。


因此,您建议将一个属性保存到事件中提供给我的对象中,然后在catalog_model_product_save_after...上测试该属性是否可行。唯一的陷阱将是保留财产而无需致电save()...那里有什么想法吗?
philwinkle

您将保存库存模型,而不是产品,因此不应陷入循环之中。
Petar Dzhambazov
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.