我创建了一个可以包含在任何页面上的小部件。它需要一些css / js才能正常工作。
每当使用块时,我想包含一个自定义布局句柄。然后在我的布局xml文件中,我可以将我的文件添加到头部。
例如,加载块时
$this->getLayout()->getUpdate()->addHandle('namespace_module_widget');
然后在app/design/frontend/base/default/layout/namespace/module.xml
:
<layout>
<namespace_module_widget>
<reference name="head">
<action method="addCss">
<stylesheet>namespace/module/css/module.css</stylesheet>
</action>
</reference>
</namespace_module_widget>
</layout>
问题在于时机。当我的块被渲染时,head
已经被渲染。我已经尝试添加块_construct()
和_afterToHtml()
中的布局,但都没有效果。
我也尝试过使用观察者,我会使用Mage_Core_Model_Layout::getAllBlocks()
查看我的块。我尝试过活动controller_action_layout_load_before
和controller_action_layout_generate_blocks_after
,但未成功。
如何有条件地在head
中包含我的css / js,具体取决于请求中是否存在我的块?
答案 0 :(得分:2)
事实证明,在生成块之后,您无法添加句柄,因为即使在生成布局XML和块之前,也会首先加载更新。但是,您可以在窗口小部件块的_prepareLayout方法中获取头部块。在widget块类中,从Mage_Core_Block_Abstract覆盖_prepareLayout方法。然后获取头部块并添加您需要的内容:
class Namespace_Module_Block_Widget extends Mage_Core_Block_Template implements Mage_Widget_Block_Interface
{
protected function _prepareLayout() {
$layout = $this->getLayout();
$head = $layout->getBlock('head');
$head->addCss('namespace/module/css/module.css');
parent::_prepareLayout();
}