Pertanyaan ini adalah tentang mengikuti praktik terbaik Magento2.
Saya harus menulis ulang metode \ Magento \ Theme \ Block \ Html \ Topmenu :: _ addSubMenu () untuk menambahkan beberapa pembungkus di sekitar elemen. Sekarang, karena ini adalah metode yang dilindungi, pemahaman saya adalah bahwa saya harus menggunakan fitur preferensi:
<preference for="Magento\Theme\Block\Html\Topmenu" type="MyCompany\Theme\Block\Html\Topmenu" />
dan tambahkan kelas dengan penulisan ulang saya:
<?php
namespace MyCompany\Theme\Block\Html;
class Topmenu extends \Magento\Theme\Block\Html\Topmenu
{
protected function _addSubMenu($child, $childLevel, $childrenWrapClass, $limit)
{
// my stuff
}
}
Meskipun kelas default ditulis ulang, pada halaman berikutnya memuat ulang saya mendapat kesalahan berikut:
main.CRITICAL: File template tidak valid: 'html / topmenu.phtml' dalam modul: 'MyCompany_Theme' nama blok: 'catalog.topnav' [] []
Magento sedang mencoba menemukan html / topmenu.phtml di bawah ekstensi saya dan bukan di bawah Magento_Theme. Saya mengerti bahwa ini adalah perilaku yang benar, tetapi saya berpikir tentang aspek praktis dari ini. Apakah ini berarti bahwa setiap kali kita menulis ulang blok, kita perlu menulis ulang templatnya juga, bahkan jika kita tidak perlu menyentuh apa pun yang terkait dengan HTML?
Salah satu caranya adalah dengan menulis ulang metode _toHtml () juga, seperti ini:
protected function _toHtml()
{
$this->setModuleName($this->extractModuleName('Magento\Theme\Block\Html\Topmenu'));
return parent::_toHtml();
}
Sekarang, Magento sedang mencari ke modul Magento_Theme untuk file templat lagi. Tapi, ini seperti retasan bagi saya.
Jadi, pertanyaan saya adalah: apa rekomendasi dalam situasi ini? Haruskah kita selalu menyalin template yang relevan ketika menulis ulang kelas blok, atau solusinya baik-baik saja? Apakah ada pendekatan yang lebih baik untuk ini?
Magento_Theme::
, tetapi mereka tidak github.com/magento/magento2/blob/develop/app/code/Magento/Theme/… Saya benar-benar bertanya-tanya sekarang apakah ini dengan sengajaJawaban:
Karena ada diskusi seputar solusi yang diusulkan dalam permintaan tarik ( https://github.com/magento/magento2/pull/1895 ), sementara itu Anda hanya perlu "menyematkan" templat asli ketika melakukan perubahan nama kelas blok asli:
sumber
Catalog\Block\Product\View
). Saya pikir saran OP masih merupakan solusi terbaik untuk contoh itu.Anda hanya perlu menambahkan satu kode di file ini
dengan:
dan tambahkan kode di bawah ini dalam nama file modul override Anda:
kode:
Tambah
Topmenu.php
file dalam File:app/code/Company_name/Override/Block/Html/Topmenu.php
Anda dapat menambahkan fungsi apa pun yang ingin Anda timpa.Terima kasih
sumber