Magento:使用controller_action_postdispatch事件观察者

时间:2015-05-19 14:32:48

标签: magento

我正在尝试使用自定义事件观察器来观察controller_action_postdispatch事件,并通过将开头标记替换为+我的自定义块内容来直接修改响应体。重要的是我要确保它是一个实际的HTML页面响应,而不是AJAX请求时的JSON或部分HTML。我想使用controller_action_layout_render_before事件来确定头块是否存在,设置一个标志,前面提到的观察者方法将在修改响应之前检查。

用例是在每个页面的head标签内安全地添加我的自定义块,优先于其他头部内容,如元标记和脚本标记。

这就是我现在所处的位置(不远处,有点迷失)......

config.xml中

<?xml version="1.0"?>
<config>
    ...
    <global>
        ...
        <events>
            <controller_action_postdispatch>
                <observers>
                    <intercept_response>
                        <class>module/observer</class>
                        <method>interceptResponse</method>
                    </intercept_response>
                </observers>
            </controller_action_postdispatch>
            <controller_action_layout_render_before>
                <observers>
                    <check_response>
                        <class>module/observer</class>
                        <method>checkResponse</method>
                    </check_response>
                </observers>
            </controller_action_layout_render_before>
        </events>
    </global>
    ...
</config>

型号/ Observer.php

class My_Module_Model_Observer {

    protected $_isHead = FALSE;

    public function checkResponse() {
        if ( Mage::app()->getLayout()->getBlock('head')) {
            $_isHead = true;
        }
    }

    public function interceptResponse(Varien_Event_Observer $observer) {
        $block = $observer->getBlock();
    }

}

1 个答案:

答案 0 :(得分:0)

我可能会采用比拦截输出更标准的方法来解决问题。您可以通过在布局中附加子块并使用主题中的自定义模板文件输出它来执行您想要的操作。

<强> $主题/布局/那个local.xml

<default>
    <reference name="head">
        <!-- If you need a custom block, just swap in the type -->
        <block type="core/template" name="prepend-head" template="page/html/prepend-head.phtml"/>
    </reference>
</default>

$主题/模板/页/ HTML / head.phtml

靠近文件顶部的某处只需添加<?php echo $this->getChildHtml('prepend-head') ?>