【问题标题】:Magento: Delaying Head Block from loading until my event has firedMagento:延迟加载头块直到我的事件触发
【发布时间】: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


【解决方案1】:

在调度catalog_block_product_list_collection 事件时,head 已经被输出,所以实际上没有什么可以改变它(或者实际上,这取决于列表块的放置位置,但几乎在所有情况下它将在头部之后)。

在渲染头部之前,您必须直接处理布局和列表块以从集合中检索数据,但执行方式取决于您是否要将代码应用于所有列表块,或者只是类别的(知道块也可以从CMS内容中调用,因此在相应的页面/块本身输出之前可能不存在)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    相关资源
    最近更新 更多