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?

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

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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.