Magento 2: Mengubah Template Blok

52

Di Magento 1, sebagai pengembang modul dimungkinkan untuk mengubah template blok menggunakan layout XML code seperti ini

<reference name="block_to_change">
    <action method="setTemplate">
        <param>/path/to/template.phtml</param>
    </action>
</reference>

dan kemudian menambahkan templat Anda ke tema dasar.

app/design/frontend/base/default/template/path/to/template.phtml

Apakah mungkin, sebagai pengembang modul, untuk melakukan hal serupa di Magento 2? Atau apakah saya perlu menggunakan layout XML atau kode PHP untuk menghapus blok yang saya minati, dan menyisipkan blok baru dengan template yang berbeda (yang kelasnya memperpanjang kelas blok asli)

Saya tahu saya bisa membuat tema khusus yang menggantikan templat, tapi saya tertarik membuat modul yang mengubah templat default, tetapi masih mengizinkan tema khusus untuk kemudian mengganti templat itu.

Alan Storm
sumber

Jawaban:

60

Tentu saja mungkin:

<referenceBlock name="copyright">
    <action method="setTemplate">
        <argument name="template" xsi:type="string">Dfr_Backend::page/copyright.phtml</argument>
    </action>
</referenceBlock>
Mage2.PRO
sumber
Bisakah Anda menjelaskan langkah-langkah bagaimana cara mengubah tata letak, Sebenarnya saya ingin memperbarui file add toocart.phtml sesuai dengan konfigurasi sistem dan juga ingin memperbarui ini menggunakan modul khusus
Deepak Mankotia
5
Solusi KAndy tidak bekerja untuk saya tetapi yang ini ya
csmarvz
Saya telah mengubah templat nama blok "customer_account_dashboard_top" <body> <referenceBlock name = "customer_account_dashboard_top"> <metode tindakan = "setTemplate"> <argumen nama = "templat" xsi: type = "string"> Namespace_Modulename :: order /recentorder.phtml </argument> </action> </referenceBlock> </body> "tetapi tidak berhasil, silakan periksa dan beri tahu saya komentar Anda
senthil
43

Node tindakan sudah usang, tetapi Anda bisa menggunakan argumen blok

<referenceBlock name="block_to_change">
    <arguments>
        <argument name="template" xsi:type="string">[Vendor]_[Module]::/path/to/template.phtml</argument>
    </arguments>
</referenceBlock>
KAndy
sumber
Bisakah Anda menjelaskan langkah-langkah bagaimana saya dapat mengubah tata letak, Sebenarnya saya ingin memperbarui add to addtocart.phtmlfile sesuai dengan konfigurasi sistem dan juga ingin memperbarui ini menggunakan modul khusus
Deepak Mankotia
4
Terima kasih - Saya hanya akan meninggalkan referensi ke laporan bug di sini github.com/magento/magento2/issues/3356 - metode yang diposting dalam jawaban ini, sementara mungkin cara masa depan dalam melakukan sesuatu, belum berfungsi seperti yang diiklankan
Kristof di Fooman
2
@KAndy Apakah contoh kode Anda 100% benar? Saya mencobanya dan saya tidak bisa membuatnya bekerja dengan cara apa pun. Jawaban lain dari @ Mage2.PRO (yang menggunakan <action method='setTemplate'>) berfungsi tanpa masalah.
maginfortis
1
Ini tidak berfungsi. Jawaban yang diterima tidak.
Milan Simek
29

Untuk memahami perbedaan antara <arguments>dan <action>Anda harus memahami bagaimana konstruktor objek Magento 2 bekerja. Jika Anda mengganti konstruktor di Magento, Anda akan selalu mendapatkan $data-parameteryang merupakan array. Ini adalah data yang disediakan dalam file XML dan diterjemahkan ke internal $_data-arraydari \Magento\Framework\DataObject:

<referenceBlock name="catalog.topnav">
    <arguments>
        <argument name="template" xsi:type="string">Foo_Bar::buzz.phtml</argument>
    </arguments>
</referenceBlock>    

...

public function __construct(array $data = [])
{
    // $_data is populated with the arguments from XML:
    // so $_data['template'] is now 'Foo_Bar::buzz.phtml'
    $this->_data = $data;
}

Namun, dalam kasus templat, jika setTemplate()digunakan dalam konstruktor semu ( _construct(), garis bawah tunggal), ini berarti bahwa $dataditimpa, tidak peduli apakah itu diatur dalam XML.

public function _construct()
{
    $this->setTemplate('foo/bar.phtml');
}

Dalam skenario itu, <action>lebih disukai, karena ini dijalankan setelah konstruktor & konstruktor semu.

<referenceBlock name="catalog.topnav">
    <action method="setTemplate">
        <argument name="template" xsi:type="string">Foo_Bar::buzz.phtml</argument>
    </action>
</referenceBlock> 
Giel Berkers
sumber
10

Berikut ini berhasil bagi saya di Magento EE 2.2.3

<?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">
    <body>
        <referenceBlock name="core.module.block.name" template="[Vendor]_[Module]::path/to/your/template.phtml" />
    </body>
</page>

Catatan: jika Anda menggunakan modul khusus untuk mengubah template inti dan Anda menjadi gila karena kode sebelumnya tidak berfungsi, pastikan modul Anda dimuat setelah modul inti yang Anda coba ubah (module.xml) dan Anda dieksekusi bin/magento setup:upgrade:)

diazwatson
sumber
Ini adalah cara terbersih menurut saya.
Ben Crook
2

Saya tidak tahu mengapa, tetapi saya menemukan cara ini untuk menjadi yang terbaik:

<referenceBlock name="sales.order.items.renderers.default" template="Foo_Bar::sales/order/items/renderer/default.phtml"/>
Aivoris
sumber
1
<referenceBlock name="sales.order.items.renderers.default" template="Foo_Bar::sales/order/items/renderer/default.phtml"/>

Ini hanya akan berfungsi jika blok Anda tidak ditimpa sebelum menggunakan setTemplatemetode. Magento 2.2.x dan lebih tinggi.

AleksLi
sumber