O evento checkout_onepage_controller_success_action
é acionado logo antes da renderização do layout, para que você ainda possa manipulá-lo.
O observador recebe apenas o ID do pedido como parâmetro, portanto, é necessário obter o layout via modelo de aplicativo:
$layout = Mage::app()->getLayout();
Agora você pode fazer suas alterações programaticamente, desta forma:
$messageBlock = $layout->createBlock('core/template', 'payment_message_block');
$messageBlock->setTemplate('payment_message.phtml');
$layout->getBlock('footer')->append($messageBlock);
Se você usar o controller_action_layout_load_before
evento, também poderá carregar um identificador de layout personalizado como este, se na página de sucesso:
if ($observer->getAction()->getFullActionName() === 'checkout_onepage_success') {
$layout = $observer->getLayout();
$layout->getUpdate()->addHandle('custom_layout_handle');
}
que você pode definir em XML:
<layout>
<custom_layout_handle>
<reference name="footer">
<block type="core/template" name="payment_message_block" template="payment_message.phtml" />
</reference>
</custom_layout_handle>
</layout>
Atualização: o bloco de rodapé é armazenado em cache, portanto, precisamos garantir que uma versão diferente seja buscada no cache se a mensagem estiver presente. Por exemplo:
$footer = $layout->getBlock('footer');
$footer->setCacheKey(sha1($footer->getCacheKey() . '-payment-message');
como passar dados genrados para arquivo phtml? o que eu estou mostrando
Faça referência ao seu bloco por nome e uso setData()
. Por exemplo:
$block = $layout->getBlock('payment_message_block')->setData('messsage', 'Hello');
E no modelo:
echo $this->getData('message');
before_body_end
que não está em cachefooter
por motivos de design, adicionei uma solução que altera a chave de cache.