Magento 马根托。OnBlockToHtml前后

Magento 马根托。OnBlockToHtml前后,magento,Magento,在magento中有两个事件: 核心\u块\u抽象\u到\u html\u之前 核心\u块\u抽象\u到\u html\u之后 每次调用toHtml方法时都会调用它们。我想要的是回显以输出一些有价值的数据,但我得到以下错误: HEADERS ALREADY SENT 那么,有什么方法可以附加到输出中吗?您可以编辑正在渲染的模板。或者添加另一个模板文件,并从正在渲染的模板文件调用它(在将新模板添加到布局文件之后)。如果查看正在触发的事件,则第一个事件(core_block_abstract_to

在magento中有两个事件:

核心\u块\u抽象\u到\u html\u之前 核心\u块\u抽象\u到\u html\u之后

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

HEADERS ALREADY SENT

那么,有什么方法可以附加到输出中吗?

您可以编辑正在渲染的模板。或者添加另一个模板文件,并从正在渲染的模板文件调用它(在将新模板添加到布局文件之后)。

如果查看正在触发的事件,则第一个事件(
core_block_abstract_to_html_before
)将块实例作为参数接收。第二个事件(
core\u block\u abstract\u to\u html\u after
)接收块和传输对象,您可以从中提取渲染内容(这是该传输对象的主要功能,因为渲染字符串是方法的局部变量)。您可以在紧接第二个事件分派之前的行中看到传输对象接收渲染字符串:

self::$_transportObject->setHtml($html);
如何添加到块输出取决于您尝试执行的操作。如果您需要包装您的输出,并且您的前导需要在事件之前使用
…\u,您应该在模块中该事件的观察者的块上设置一个参数,例如

public function coreBlockAbstractToHtmlBefore($observer)
{
    $arg = 'Whatever you are doing';
    $observer->getBlock()->setYourCustomParam($arg); //e.g. using Magento setter method
}
然后,在
…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 )
}
这就是说,不要忘记您有许多可供选择的选项,包括
$block->setFrameTag($open,$close)
,它可以(有点黑客味地)用于围绕块输出包装您想要的任何内容

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

我还想补充的一点是,如果需要将渲染定位到特定范围,则始终可以使用来自
Mage\u Core\u Controller\u Varien\u action::renderLayout()
方法(
Mage::dispatchEvent(
Controller\u action\u layou render\u before.$this->getFullActionName();
)的完整动作名称自动事件。您只需使用同一个类来观察该事件,将其作为所有事件的单例调用,并设置一个标志


最后,关于“Headers ready sent”错误的说明:典型的Magento渲染使用响应对象,应该通过
$response->appendBody('string')将输出添加到该响应对象中

这不是解决方案。我想向渲染的每个模板添加数据。如果我更改了内核中的renderView函数,那么一切都可以正常工作。但问题是我不想触及核心,模型覆盖在这种特殊情况下不起作用$observer->getTransport()->setHtml($argBefore.$normalOutput.$argAfter);这正是我想要的。投票-1。你对这两件事做了非常清楚的解释。但是你没有回答这个问题。这就是为什么当我们使用该事件时会出现服务器错误?。或者更好的是,我们如何解决这个问题?从我的角度来看,这基本上是一个具体的案例。在我的magento中,存在配置问题。试图注册不存在模型的单例。起初我认为它指的是那个事件的用法。这可能会导致问题,因为它调用的次数太多。发现我不是唯一一个犯这种错误的人。我认为这是指内存不足或服务器配置。本马克斯,我道歉,我想取消我的否决票,因为现在我明白了这没有什么魔力。你能编辑你的帖子来取消我的投票吗?