Jadi, saya ingin menambahkan pegangan tata letak khusus untuk semua halaman tampilan kategori .. pegangan yang seharusnya dimuat tergantung pada parameter kategori tertentu, sehingga pegangan perlu ditambahkan secara programatik dengan $page->addPageLayoutHandles()
Tampak mudah ..? Sepertinya tidak
Magento 2 menyediakan sistem Plugin yang bagus yang secara alami akan saya gunakan, cukup tentukan afterExecute()
plugin yang akan dijalankan setelah kategori asli execute()
dan dorong setiap pembaruan ke objek Halaman dari sana.
Sayangnya itu tidak berfungsi seperti itu .. alasannya adalah bahwa execute()
metode asli (pada akhir) akan mengeksekusi $page->getConfig()->addBodyClass()
- panggilan ke metode ini secara otomatis akan memaksa tata letak untuk dimuat dan dihasilkan sepenuhnya, sehingga setiap upaya berikutnya untuk menambah baru pegangan tata letak untuk Halaman sama sekali tidak berguna. Saya mencari-cari cara yang tidak terlalu elegan untuk mencapai hal yang sama (masih menggunakan plugin) .. tidak menemukan.
Saya akhirnya menjalankan controller saya sendiri untuk tampilan kategori, namun saya tidak akan memilih untuk meninggalkannya seperti itu.
Jadi pertanyaan saya adalah .. bagaimana saya bisa menambahkan pegangan tata letak halaman baru (secara terprogram) untuk tampilan kategori? dan melakukannya dengan elegan.
sumber
$page->getConfig()->addBodyClass()
memuat dan menghasilkan tata letak Anda? Saya memiliki tugas yang sama saat ini, hanya dengan halaman CMS.Jawaban:
Cara XML
Cara yang mudah adalah dengan membuat file berikut di folder modul Anda:
view/frontend/layout/catalog_category_view.xml
dengan konten berikut:Tidak lebih atau kurang elegan dari cara PHP dan menurut apa yang Anda temukan lebih aman.
Cara PHP
Sayangnya dalam kasus Anda, sepertinya PHP adalah satu-satunya cara untuk mencapai secara dinamis membuat pegangan berdasarkan parameter yang dimilikinya.
Melalui plugin
Alih-alih membuat plugin pada
execute()
metode kelas tindakan Anda, Anda bisa langsung membuat plugin padaaddPageLayoutHandles()
metodeMagento\Framework\View\Result\Page
Masalah utama adalah bahwa itu akan dipanggil setiap kali metode ini dipanggil dan Anda harus menambahkan beberapa kondisi dalam kode plugin Anda untuk memastikan Anda berada di halaman tampilan kategori.
Melalui preferensi
Cara lain untuk melakukannya adalah dengan menggunakan preferensi untuk kelas tindakan tampilan kategori:
Kemudian di kelas kontroler kustom Anda, Anda hanya menimpa
execute()
metode dengan menyalin / menempel metode asli dan menambahkan modifikasi Anda langsung dalam metode ini.Masalah utama adalah bahwa ketika Anda akan meningkatkan instalasi Magento Anda, jika perubahan ditambahkan ke kelas aksi Magento asli asli, itu tidak akan tercermin dalam kelas tindakan kustom Anda.
sumber
Saya punya masalah serupa. untuk kategori yang tidak menampilkan daftar produk, saya memerlukan pegangan ekstra. setelah gagal menambahkan pegangan melalui Custom Layout XML kategori, saya akhirnya menambahkannya di pengamat pada
layout_load_before
acara tersebut:ada hit kinerja kecil yang terlibat sebagai pengamat dipanggil untuk setiap tampilan halaman. Sayangnya, semua acara terkait 'category_view' tampaknya terlalu dini (kategori belum dimuat) atau terlambat (tata letak sudah diproses).
sumber
\Magento\Cms\Controller\Page\View::execute()
dan\Magento\Framework\View\Result\Page::addPageLayoutHandles() or render()
tidak berhasil. Solusi terakhir ini adalah satu-satunya solusi yang bekerja untuk saya.Mari kita coba amati tata letak acara_load_before. Menjalankan fungsi akan sama seperti ini:
Semoga ini bisa membantu
sumber