【发布时间】:2013-07-10 16:51:37
【问题描述】:
我有两个观察者:
<events>
<controller_action_layout_load_before>
<observers>
<QuBit_UniversalVariable_Model_Page_Observer>
<type>singleton</type>
<class>universal_variable_main/observer</class>
<method>setUniversalVariable</method>
</QuBit_UniversalVariable_Model_Page_Observer>
</observers>
</controller_action_layout_load_before>
<catalog_block_product_list_collection>
<observers>
<QuBit_UniversalVariable_Model_Page_Observer>
<type>singleton</type>
<class>universal_variable_main/observer</class>
<method>setCatalogProductListing</method>
</QuBit_UniversalVariable_Model_Page_Observer>
</observers>
</catalog_block_product_list_collection>
</events>
我想要一个包含 javascript 的 Block 加载到我的 Head 中,但需要用 Observer 中收集的数据填充它。我的问题是块在事件触发之前加载。我添加了一些日志来证明这一点。
2013-07-12T07:18:44+00:00 DEBUG (7): loading setUniversalVariable
2013-07-12T07:18:44+00:00 DEBUG (7): loading template
2013-07-12T07:18:48+00:00 DEBUG (7): loading setCatalogProductListing
目前我正在使用布局 XML 添加块,我是否需要在 setCatalogProductListing 中以编程方式创建它,或者是否有其他方法可以防止它被加载,直到所有数据都可用?
甚至可以在这里以编程方式创建它,还是此时头部已经完成?
提前致谢
【问题讨论】:
-
是的,头部已经被输出,因为
catalog_block_product_list_collection事件在Mage_Catalog_Block_Product_List::_beforeToHtml()中被触发(因此,当产品列表被呈现时)。你真的需要在头部填充你的脚本吗? -
是的,它是 QuBit Opentag 标签管理脚本将调用的通用变量 javascript 对象。这些可以注入 DOM 中的任何位置,其次我想对 git 项目进行拉取请求,以便它与主存储库合并,以便它在所有场景中都能正常工作。当您说头部已经输出时,您的意思是即使以编程方式添加块也会失败?我对你开始评论时的“是”有点困惑。
-
在上面的基础上,将块渲染到缓冲区中,然后在构建整个页面时发送该缓冲区,或者在渲染时将它们作为输出发送。如果它们被渲染到缓冲区中,有没有办法抓住这个缓冲区来将其作为字符串进行操作?
-
编辑:好的,已经阅读了linkAlans 关于块生命周期的优秀帖子我想我现在明白发生了什么,@blmage 我相信你的评论实际上是一个答案 - 事件永远不会得到到实际渲染的 Head 块。如果您想将您的评论粘贴到答案中,我会排除它。
-
抱歉回答晚了! “是”是指在调度事件时,头部已经输出,因此即使您在其中添加了一个块,也无法真正改变它。
标签: magento events block observers load-order