我正在尝试向catalog_model_product_duplicate
事件注入功能。该模块的一部分将是确保复制的产品的库存状态也被复制;目前不是。
我看到CatalogInventory
观察到此事件并设置了一些标准库存信息。我能否保证在当地人之前解决核心事件?我可以依靠这里的任何操作顺序吗?
我正在尝试向catalog_model_product_duplicate
事件注入功能。该模块的一部分将是确保复制的产品的库存状态也被复制;目前不是。
我看到CatalogInventory
观察到此事件并设置了一些标准库存信息。我能否保证在当地人之前解决核心事件?我可以依靠这里的任何操作顺序吗?
Answers:
调度事件的顺序取决于模块的加载顺序。由于您需要确保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核心模块先于您加载。
无法轻松保证事件的分派顺序。它们取决于模块的加载顺序。通常,所有核心事件观察者将在社区和本地代码池观察者之前被调用。
有一种方法可以通过“伪造”核心模块对本地模块或社区模块的依赖来强迫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>
我个人不喜欢这种方法,因为我不知道强迫这种依赖会带来什么后果。
对于您的用例,听起来您应该对数据/状态进行某种检测以了解其是否被触发。检查模型上的数据/状态比尝试强制事件顺序更可取。
观察者首先按区域执行,然后按模块加载顺序执行
这意味着,所有观察员登记在<global>
执行之前在登记的所有观察员<frontend>
或<adminhtml>
。
在一个区域内,观察者按照它们出现在合并的config XML树中的顺序执行,从技术上讲,这意味着模块的加载顺序。
依赖关系图是根据中的<depends>
定义构建的app/etc/modules/*.xml
。如果X取决于Y,则在X之前加载Y。
通过依赖性排序后,核心模块的优先级高于社区和本地模块
其他所有内容均按字母顺序加载。请注意,文件名in app/etc/modules
用于比较,而不是实际的模块名。
(“ 3.将模块添加到核心代码池”不计算在内)
只是一个建议,同时观察catalog_model_product_duplicate
并catalog_model_product_save_after
与单观察者。在catalog_model_product_duplicate
集库存数据作为观察数据,并catalog_model_product_save_after
使用这些数据来填充库存复制产品。
catalog_model_product_save_after
...上测试该属性是否可行。唯一的陷阱将是保留财产而无需致电save()
...那里有什么想法吗?