Aggiungi il blocco al layout in modo dinamico nell'osservatore di eventi


8

Voglio sapere come usare layout.xml con l'osservatore di eventi.

Voglio mostrare un messaggio a piè di pagina quando il pagamento viene eseguito correttamente.

So che devo usare l'evento checkout_onepage_controller_success_action

Come utilizzare controller o layout.xml con l'osservatore di eventi?

Risposte:


13

L'evento checkout_onepage_controller_success_actionviene attivato subito prima del rendering del layout, quindi è ancora possibile modificarlo.

L'osservatore riceve l'ID dell'ordine solo come parametro, quindi devi ottenere il layout tramite il modello dell'app:

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

Ora puoi apportare le modifiche a livello di codice, in questo modo:

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

Se si utilizza l' controller_action_layout_load_beforeevento, è anche possibile caricare un handle di layout personalizzato come questo, se nella pagina di successo:

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

che puoi definire in 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>

Aggiornamento: il blocco piè di pagina viene memorizzato nella cache, quindi dobbiamo assicurarci che una versione diversa venga recuperata dalla cache se il messaggio è presente. Per esempio:

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

come passare i dati generati al file phtml? che sto mostrando

Fai riferimento al tuo blocco per nome e utilizzo setData(). Per esempio:

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

E nel modello:

echo $this->getData('message');

1
Non sono sicuro che funzioni per il footer block. Funzionerebbe per quasi tutti gli altri blocchi, ma quando la cache è abilitata, il piè di pagina viene memorizzato nella cache e potrebbe non visualizzare il messaggio.
— Marius

Buon punto @ Mario, se possibile proverei a usare ciò before_body_endche non è memorizzato nella cache
— Fabian Schmengler

Sì, dovrebbe funzionare.
— Marius

Se deve essere presente footerper motivi di progettazione, ho aggiunto una soluzione che modifica la chiave della cache.
— Fabian Schmengler,

questo è il motivo per cui sono anche confuso perché nel layout niente menzione relativa all'osservatore. che sono stato trovato prima di inviare la domanda qui
— Rahul Chaurasia,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.