Tambahkan blok ke tata letak secara dinamis di pengamat acara

8

Saya ingin tahu cara menggunakan layout.xml dengan pengamat acara.

Saya ingin menampilkan pesan di footer ketika pembayaran berhasil dilakukan.

Saya tahu saya harus menggunakan acara ini checkout_onepage_controller_success_action

Bagaimana cara menggunakan controller atau layout.xml dengan pengamat acara?

Rahul Chaurasia
sumber

Jawaban:

13

Acara checkout_onepage_controller_success_actiondipicu tepat sebelum tata letak ditampilkan, sehingga Anda masih dapat memanipulasinya.

Pengamat hanya menerima id pesanan sebagai parameter, jadi Anda harus mendapatkan tata letak melalui model aplikasi:

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

Sekarang Anda dapat melakukan perubahan secara terprogram, seperti ini:

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

Jika Anda menggunakan controller_action_layout_load_beforeacara tersebut, Anda juga dapat memuat pegangan tata letak khusus seperti ini, jika pada halaman sukses:

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

yang bisa Anda definisikan dalam 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>

Pembaruan: Blok footer di-cache, jadi kami harus memastikan bahwa versi yang berbeda diambil dari cache jika ada pesan. Sebagai contoh:

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

bagaimana cara mengirimkan data genated ke file phtml? yang saya tunjukkan

Referensi blok Anda dengan nama dan gunakan setData(). Sebagai contoh:

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

Dan di templat:

echo $this->getData('message');
Fabian Schmengler
sumber
1
Saya tidak yakin ini berfungsi untuk blok footer. Ini akan berfungsi untuk hampir semua blok lain, tetapi ketika cache diaktifkan, footer di-cache dan mungkin tidak menampilkan pesan.
Marius
Poin bagus @Marius, jika mungkin saya akan mencoba menggunakan before_body_endyang tidak di-cache
Fabian Schmengler
Yap, itu seharusnya berhasil.
Marius
Jika harus footerkarena alasan desain, saya menambahkan solusi yang mengubah kunci cache.
Fabian Schmengler
itu sebabnya saya juga bingung karena dalam tata letak tidak disebutkan terkait dengan pengamat. yang saya temukan sebelum mengajukan pertanyaan di sini
Rahul Chaurasia