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?

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');

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.