Saya mencoba untuk menghapus blok dari halaman tertentu (baik itu frontend atau backend) tetapi hanya jika flag konfigurasi tertentu disetel ke true
.
Mari kita ambil contoh.
Saya ingin menghapus blokir dengan nama dashboard
dari dasbor admin.
Blok didefinisikan dalam adminhtml_dashboard_index.xml
file dari Magento_Backend
modul:
<referenceContainer name="content">
<block class="Magento\Backend\Block\Dashboard" name="dashboard"/>
</referenceContainer>
Berkat jawaban Adam saya bisa melakukan ini diadminhtml_dashboard_index.xml
<body>
<referenceBlock name="dashboard" remove="true" />
</body>
Tapi saya ingin mengambilnya takik dan menghapus blok ini hanya jika pengaturan konfigurasi dengan path dashboard/settings/remove
memiliki nilai 1
.
Pendekatan tata letak xml akan luar biasa, tapi saya akan mengambil pendekatan pengamat juga.
helper
kelas, lihat /programming/47237179/magento-2-i-want-to-add-ifconfig-in-override-block-xml?rq=1Jawaban:
Saya tidak dapat menemukan cara untuk melakukan ini dengan tata letak baik tetapi di sini adalah contoh cara Anda dapat melakukannya dengan pengamat (asalkan mereka memperpanjang blok Templat) ...
Buat events.xml Anda di etc / events.xml
Buat pengamat
Pada dasarnya _toHtml memeriksa apakah ada templat. Jika tidak, ia mengembalikan ''.
EDIT
Setelah menggali lagi saya telah menemukan cara untuk melakukan ini lebih jauh ke atas rantai.
Dan pengamat ...
sumber
Biasanya itu harus dilakukan dengan
<action />
tag:EDIT:
Satu-satunya masalah adalah unsetChild hanya menerima alias. Anda tidak dapat menggunakan nama blokir.
Solusi lain: tulis ulang Magento Framework untuk dapat menggunakan ifconfig dengan remove = "true"
1- Buat modul Anda sendiri.
2- Menambahkan file baru untuk menimpa Magento Kerangka: (misalnya:
/Vendor/Module/Override/Magento/Framework/View/Layout/Reader/Block.php
)3- Tambahkan file di.xml untuk mengganti file magento:
4- Sekarang Anda dapat menggunakan ifconfig dalam tata letak dikombinasikan dengan hapus:
Contoh ini untuk Block, tetapi Anda bisa melakukan hal yang sama untuk kontainer jika Anda mengganti metode containerReference () dari /Magento/Framework/View/Layout/Reader/Container.php
sumber
Dari pedoman teknis :
Jadi di sini adalah solusi plugin untuk ini:
Deklarasikan plugin:
Tentukan plugin:
Seperti dalam jawaban dari Smartie, saya mencoba plugin lebih jauh ke rantai
\Magento\Framework\View\Layout\Builder::build
denganafterBuild()
metode tetapi ini akan menyebabkan rekursi yang tak ada habisnya\Magento\Framework\View\Layout::getBlock
dan karena\Magento\Framework\View\Layout::unsetElement
keduanya menelepon\Magento\Framework\View\Layout\Builder::build
lagisumber
Atribut "ifconfig" dari simpul "blok" dalam tata letak memungkinkan Anda untuk menautkan blok ke nilai dalam konfigurasi toko.
pemrosesan "ifconfig" terjadi di
\Magento\Framework\View\Layout\GeneratorPool::buildStructure
sumber