Cara mengganti template yang memiliki tata letak ALIAS.
Jawaban ini adalah contoh yang mungkin, Anda dapat mengikuti ini untuk mengganti template ALIAS.
Saya telah membuat dua contoh modul, Vendor_Module
memiliki tata letak dengan templat alias, Kami mengganti alias ini dengan Vendortwo_Moduletwo
modul.
Asumsikan Anda tahu langkah-langkah untuk membuat modul, saya tidak memposting seluruh pembuatan modul.
Modul 1
\ app \ code \ Vendor \ Module \ etc \ frontend \ routes.xml
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/App/etc/routes.xsd">
<router id="standard">
<route id="module" frontName="module">
<module name="Vendor_Module" />
</route>
</router>
</config>
\ app \ code \ Vendor \ Module \ view \ frontend \ layout \ module_test_test.xml
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="2columns-left" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd">
<body>
<referenceContainer name="content">
<block class="Vendor\Module\Block\Test\Test" name="test_test" template="test/test.phtml">
<block class="Vendor\Module\Block\Test\Test" as="testali" template="test/testali.phtml"/>
</block>
</referenceContainer>
</body>
</page>
Modul 2
\ app \ code \ Vendortwo \ Moduletwo \ etc \ frontend \ routes.xml
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/App/etc/routes.xsd">
<router id="standard">
<route id="moduletwo" frontName="moduletwo">
<module name="Vendortwo_Moduletwo" />
</route>
</router>
</config>
\ app \ code \ Vendortwo \ Moduletwo \ view \ frontend \ layout \ default.xml
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<referenceBlock name="test_test">
<block class="Vendortwo\Moduletwo\Block\Two\Two" as="testali" template="two/twoalias.phtml"/>
</referenceBlock>
</page>
Setelah menghapus cache, saya jalankan http: // localhost / magento210 / module / test / test
Templat alias ditimpa oleh Vendortwo_Moduletwo
two/twoalias.phtml
Ini adalah cara melakukannya dengan benar, dan tanpa peretasan.
Saya tidak mencari use case OP, tetapi saya harus dapat memodifikasi renderers di dalam troli. Masalahnya adalah, seperti dalam kasus OP, the
Magento_Checkout
modul tidak memberikan nama kepada penyaji, yang berarti mereka tidak dapat direferensikan dan template mereka diubah menggunakan metode tradisional atau terdokumentasi. Namun, setelah melakukan sleuthing, saya menemukan cara melakukannya menggunakan alat yang disediakan Magento2 secara langsung dalam tata letak XML.Perhatikan bahwa ada tempat lain di mana pendekatan yang sama ini bekerja, seperti di
Magento\Sales\Block\Items\AbstractItems
blok. TheMagento_Checkout
danMagento_Sales
modul adalah dua yang membuat sebagian besar menggunakan penyaji item, sehingga mencakup ini banyak pertanyaan yang akan mengakibatkan seseorang untuk mengubah template blok tanpa nama. Alasan ini diposkan adalah karena tidak terhindarkannya orang lain yang mencari cara memodifikasi templat renderer di checkout atau modul penjualan.Saya akan memberikan solusinya terlebih dahulu, dan kemudian menjelaskannya secara terperinci bagi siapa saja yang ingin tahu mengapa itu bekerja.
Larutan
Tambahkan berikut ini ke
checkout_cart_index.xml
file tata letak:Perhatikan bahwa nama modul dan jalur perlu dimodifikasi untuk mencerminkan basis kode Anda.
Penjelasan
Ini berfungsi dengan memanfaatkan
overridden_templates
data blok, yang tidak didefinisikan secara default.Di
Magento_Checkout
,checkout_cart_index.xml
file layout mendefinisikan blok berikut:Itu kemudian mendefinisikan beberapa renderers dalam
checkout_cart_item_renderers.xml
file tata letak:Sayangnya, mereka tidak dapat dirujuk oleh alias mereka,
default
dansimple
, masing-masing.Namun, melihat ke dalam
Magento\Checkout\Block\Cart\Grid
Blok, yang dinamaicheckout.cart.form
, dan merupakan induk dari penyaji, dapat dicatat bahwa ada panggilan kegetItemHtml
metode dalam templat terkaitcart/form.phtml
,. Metode itu kemudian memanggilgetItemRenderer
. Kedua metode ini didefinisikan dalamGrid
kelas indukAbstractBlock
,. Di sinilahoverridden_templates
data digunakan:Dengan pengetahuan ini, mengisi blok dengan data dari tata letak XML secara langsung menggunakan
arguments
sintaks Magento2 .sumber
Solusi saya tidak universal, ini adalah "hack kotor" tetapi dapat bermanfaat dalam kasus-kasus tertentu. Sampel saya adalah untuk renderer frontend, bukan untuk adminhtml (saya kira itu harus sama).
Setup break point
\Magento\Framework\Data\Structure::getChildId
dengan syarat " $ parentId == 'checkout.cart.item.renderers' " (ini adalah nama untuk blok induk seperti yang Anda lihat dalamcheckout_cart_item_renderers.xml
tata letak). Semua blok anak memiliki nama (dihitung) sendiri:Gunakan nama ini di pembaruan tata letak modul Anda:
sumber
Silakan lihat jawaban saya di sini: https://magento.stackexchange.com/a/239387/14403
Saya percaya itu adalah solusi yang akan bekerja paling baik untuk Anda. Solusinya termasuk mengganti semua blok / templat yang tidak memiliki nama alias saja.
sumber