Agregar bloque al diseño dinámicamente en el observador de eventos

8

Quiero saber cómo usar layout.xml con el observador de eventos.

Quiero mostrar un mensaje en el pie de página cuando el pago se realizó con éxito.

Sé que tengo que usar el evento checkout_onepage_controller_success_action

¿Cómo usar controller o layout.xml con el observador de eventos?

Rahul Chaurasia
fuente

Respuestas:

13

El evento checkout_onepage_controller_success_actionse activa justo antes de que se procese el diseño, por lo que aún puede manipularlo.

El observador solo recibe la identificación de la orden como parámetro, por lo que debe obtener el diseño a través del modelo de aplicación:

$layout = Mage::app()->getLayout();

Ahora puede hacer sus cambios mediante programación, así:

$messageBlock = $layout->createBlock('core/template', 'payment_message_block');
$messageBlock->setTemplate('payment_message.phtml');
$layout->getBlock('footer')->append($messageBlock);

Si usa el controller_action_layout_load_beforeevento, también puede cargar un controlador de diseño personalizado como este, si está en la página de éxito:

if ($observer->getAction()->getFullActionName() === 'checkout_onepage_success') {
    $layout = $observer->getLayout();
    $layout->getUpdate()->addHandle('custom_layout_handle');
}

que puedes definir en 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>

Actualización: el bloque de pie de página se almacena en caché, por lo que debemos asegurarnos de que se obtenga una versión diferente del caché si el mensaje está presente. Por ejemplo:

$footer = $layout->getBlock('footer');
$footer->setCacheKey(sha1($footer->getCacheKey() . '-payment-message');

¿Cómo pasar datos generados al archivo phtml? que estoy mostrando

Haz referencia a tu bloque por nombre y uso setData(). Por ejemplo:

$block = $layout->getBlock('payment_message_block')->setData('messsage', 'Hello');

Y en la plantilla:

echo $this->getData('message');
Fabian Schmengler
fuente
1
No estoy seguro de que esto funcione para el bloque de pie de página. Funcionaría para casi cualquier otro bloque, pero cuando la caché está habilitada, el pie de página se almacena en caché y es posible que no muestre el mensaje.
Marius
Buen punto @Marius, si es posible, trataría de usar el before_body_endque no está en caché
Fabian Schmengler
Sí, eso debería funcionar.
Marius
Si debe estar dentro footerpor razones de diseño, agregué una solución que cambia la clave de caché.
Fabian Schmengler
Es por eso que también estoy confundido porque en el diseño no se menciona nada relacionado con el observador. que encontré antes de enviar una pregunta aquí
Rahul Chaurasia