Если вы посмотрите на инициируемые события, первое событие (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)
, которые можно (несколько хакерски) использовать, чтобы обернуть все, что вы хотите, вокруг вывода блока.
Предупреждение об этих подходах: добавляемый вывод не будет кэшироваться в блочном html-кэше.
Я хотел бы добавить еще одну вещь: если вам нужно настроить рендеринг на определенные области, вы всегда можете использовать событие full-action-name-automatic из метода Mage_Core_Controller_Varien_Action::renderLayout()
(Mage::dispatchEvent('controller_action_layout_render_before_'.$this->getFullActionName());
). Вы просто используете один и тот же класс для наблюдения за этим событием, вызываете его как одиночный для всех событий и устанавливаете флаг.
И, наконец, примечание об ошибке «Заголовки уже отправлены»: при типичном рендеринге Magento используется объект ответа, и к этому объекту ответа следует добавить вывод с помощью $response->appendBody('string');
.