Magento的.OnBlockToHtml之前

Jev*_*nov 2 magento

在magento有2个事件:

core_block_abstract_to_html_before core_block_abstract_to_html_after

每次调用toHtml方法时都会调用它们.我想要的是回显输出一些有价值的数据,但我得到以下错误:

HEADERS ALREADY SENT
Run Code Online (Sandbox Code Playgroud)

那么有没有办法追加输出?

ben*_*rks 5

如果查看被触发的事件,第一个event(core_block_abstract_to_html_before)会将块实例作为参数接收.第二个event(core_block_abstract_to_html_after)接收块和传输对象,您可以从中提取渲染的内容(这是该传输对象的主要特征,因为渲染的字符串是该方法的局部变量).您可以在调度第二个事件之前的行中看到接收渲染字符串的传输对象:

self::$_transportObject->setHtml($html);
Run Code Online (Sandbox Code Playgroud)

如何添加到块输出取决于您要执行的操作.如果你需要包装输出并且你的前导码需要使用该..._before事件,你应该在模块中该事件的观察者的块上设置一个参数,例如

public function coreBlockAbstractToHtmlBefore($observer)
{
    $arg = 'Whatever you are doing';
    $observer->getBlock()->setYourCustomParam($arg); //e.g. using Magento setter method
}
Run Code Online (Sandbox Code Playgroud)

然后,在您的...after事件观察者中,您可以评估自定义参数并将其添加到输出中,如下所示:

public function coreBlockAbstractToHtmlAfter($observer)
{
    $argBefore = $observer->getBlock()->getYourCustomParam();
    $argAfter = 'Whatever you are doing afterwards';

    //get output from _toHtml()
    $normalOutput = $observer->getTransport()->getHtml();

    //change the output; assume that both args are strings for this ex....
    $observer->getTransport()->setHtml( $argBefore . $normalOutput . $argAfter )
}
Run Code Online (Sandbox Code Playgroud)

也就是说,不要忘记你有很多选择,包括$block->setFrameTag($open,$close)哪些可以(有点hackishly)用于包装你想要的块输出.

关于这些方法的警告:正在添加的输出不会缓存在块html缓存中.

我还想补充一点,如果你需要将渲染定位到特定的范围,你总是可以使用Mage_Core_Controller_Varien_Action::renderLayout()method(Mage::dispatchEvent('controller_action_layout_render_before_'.$this->getFullActionName());)中的full-action-name-automatic事件.您只需使用相同的类来观察此事件,将其作为所有事件的单例调用,并设置标志.

最后,关于"Headers already sent"错误的注释:典型的Magento渲染使用响应对象,并且输出应该通过添加到该响应对象$response->appendBody('string');.