Adicionar bloco ao layout dinamicamente no observador de eventos

8

Quero saber como usar o layout.xml com o observador de eventos.

Quero mostrar uma mensagem no rodapé quando o pagamento foi efetuado com sucesso.

Eu sei que tenho que usar o evento checkout_onepage_controller_success_action

Como usar controller ou layout.xml com observador de eventos?

Rahul Chaurasia
fonte

Respostas:

13

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_beforeevento, 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');
Fabian Schmengler
fonte
11
Não tenho certeza se isso funciona para o bloco de rodapé. Funcionaria para quase qualquer outro bloco, mas quando o cache está ativado, o rodapé é armazenado em cache e pode não exibir a mensagem.
Marius
Bom ponto @Marius, se possível eu tentaria uso before_body_endque não está em cache
Fabian Schmengler
Sim, isso deve funcionar.
Marius
Se for necessário, footerpor motivos de design, adicionei uma solução que altera a chave de cache.
Fabian Schmengler
é por isso que também estou confuso, porque no layout nada se refere ao observador. que eu era encontrar antes de enviar pergunta aqui
Rahul Chaurasia