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.