Apakah kami terpaksa menulis ulang templat di Magento2 saat menulis ulang blokir?

8

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?

mstojanov
sumber
Tidak punya waktu untuk menjawab sekarang, tetapi saya sarankan Anda melihat pertanyaan ini dan jawabannya mungkin membantu Anda memahami konsep: magento.stackexchange.com/q/112749/2380
Raphael di Digital Pianism
1
menarik. Template masih dapat dimuat dari modul asli jika belum diawali Magento_Theme::, tetapi mereka tidak github.com/magento/magento2/blob/develop/app/code/Magento/Theme/… Saya benar-benar bertanya-tanya sekarang apakah ini dengan sengaja
David Verholen
@RaphaelatDigitalPianism Terima kasih. Utas yang Anda tautkan adalah tentang plugin. Skenario saya berbeda.
mstojanov
Ya itulah yang akhirnya saya temukan setelah saya mengerti apa masalah Anda. Jelas tidak benar terdengar seperti bug bagi saya
Raphael di Digital Pianism
Saya telah membuat masalah pada GitHub untuk mengatasi masalah ini: github.com/magento/magento2/issues/4564 menunggu jawaban dari tim dev dan akan membuat PR jika akhirnya menjadi bug.
Raphael di Digital Pianism

Jawaban:

4

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:

<referenceBlock name="catalog.topnav" class="***" template="Magento_Theme::html/topmenu.phtml"/>
Vitalii K
sumber
Ini adalah saran yang bagus, meskipun untuk blok tertentu itu tidak praktis karena paling baik digunakan di banyak tata letak ( Catalog\Block\Product\View). Saya pikir saran OP masih merupakan solusi terbaik untuk contoh itu.
Erfan
3

Anda hanya perlu menambahkan satu kode di file ini

app/design/frontend/chop/misty/Magento_Theme/layout/default.xml

dengan:

<referenceBlock name="catalog.topnav" class="Company_name\Override\Block\Html\Topmenu" template="Magento_Theme::html/topmenu.phtml"/>

dan tambahkan kode di bawah ini dalam nama file modul override Anda:

app/code/Aims/Override/etc/di.xml

kode:

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../lib/internal/Magento/Framework/ObjectManager/etc/config.xsd">
    <preference for="Magento\Theme\Block\Html\Topmenu" type="Company_name\Override\Block\Html\Topmenu" />
    <preference for="Magento\Paypal\Model\Config" type="Company_name\Override\Model\Paypal\Config" />
</config>

Tambah Topmenu.phpfile dalam File: app/code/Company_name/Override/Block/Html/Topmenu.php Anda dapat menambahkan fungsi apa pun yang ingin Anda timpa.

Terima kasih

anant prajapati
sumber