如果正在呈现块,则添加布局更新

时间:2015-05-05 22:19:33

标签: magento

我创建了一个可以包含在任何页面上的小部件。它需要一些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_beforecontroller_action_layout_generate_blocks_after,但未成功。

如何有条件地在head中包含我的css / js,具体取决于请求中是否存在我的块?

1 个答案:

答案 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();
    }