Magento. OnBlockToHtml До-После - PullRequest
2 голосов
/ 29 ноября 2011

В magento есть 2 события:

core_block_abstract_to_html_before core_block_abstract_to_html_after

Они вызываются каждый раз, когда вызывается метод toHtml. То, что я хочу, это выводить некоторые ценные данные, но я получаю следующую ошибку:

HEADERS ALREADY SENT

Так есть ли способ добавить к выводу?

Ответы [ 2 ]

5 голосов
/ 29 ноября 2011

Если вы посмотрите на инициируемые события, первое событие (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');.

0 голосов
/ 29 ноября 2011

Вы можете редактировать шаблон, который он отображает.Или добавьте другой файл шаблона и вызовите его из файла шаблона, который отображается (после добавления нового в файл макета).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...