在magento中有2个事件:
core_block_abstract_to_html_before core_block_abstract_to_html_after
每次调用toHtml方法时都会调用它们。我想要的是回显输出一些有价值的数据,但我得到以下错误:
HEADERS ALREADY SENT
那么有没有办法追加到输出?
答案 0 :(得分:5)
如果查看被触发的事件,第一个事件(core_block_abstract_to_html_before
)将接收块实例作为参数。第二个事件(core_block_abstract_to_html_after
)接收块和传输对象,您可以从中提取呈现的内容(这是该传输对象的主要特征,因为呈现的字符串是该方法的局部变量,否则) 。您可以在派遣第二个事件之前的行中看到接收渲染字符串的传输对象:
self::$_transportObject->setHtml($html);
如何添加到块输出取决于您要执行的操作。如果您需要将输出和包含在前导需要以使用..._before
事件,则应在该事件的模块中的观察者的块上设置一个参数,例如
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)
,可以(有点hackishly)用来包装你想要的块输出。
关于这些方法的警告:正在添加的输出不会缓存在块html缓存中。
我还想添加的一件事是,如果您需要将渲染定位到特定范围,则始终可以使用Mage_Core_Controller_Varien_Action::renderLayout()
方法中的full-action-name-automatic事件({{1} })。您只需使用相同的类来观察此事件,将其作为所有事件的单例调用,并设置标志。
最后,关于“Headers already sent”错误的说明:典型的Magento渲染使用响应对象,并且应通过Mage::dispatchEvent('controller_action_layout_render_before_'.$this->getFullActionName());
将输出添加到该响应对象。
答案 1 :(得分:0)
您可以编辑正在渲染的模板。或者添加另一个模板文件并从正在渲染的模板文件中调用它(在将新的模板文件添加到布局文件之后)。