Magento 2: Bir Bloğun Şablonunu Değiştirme


52

Magento 1'de, modül geliştiricisi olarak, yerleşim XML kodunu kullanarak bir bloğun şablonunu bunun gibi bir şeyle değiştirmek mümkündür.

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

ve ardından şablonunuzu temel temaya ekleyin.

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

Bir modül geliştiricisi olarak, Magento 2'de benzer bir şey yapmak mümkün mü? Veya ilgilendiğim bloğu kaldırmak için mizanpaj XML veya PHP kodunu kullanmam gerekecek ve farklı bir şablona (sınıfı orijinal blok sınıfını genişleten) yeni bir blok ekleyeceğim

Bir şablonu değiştiren özel bir tema oluşturabileceğimi biliyorum, ancak varsayılan şablonu değiştiren bir modül oluşturmakla ilgileniyorum, ancak yine de özel bir temanın o şablonu değiştirmesine izin veriyor.

Yanıtlar:


59

Tabii ki mümkün:

<referenceBlock name="copyright">
    <action method="setTemplate">
        <argument name="template" xsi:type="string">Dfr_Backend::page/copyright.phtml</argument>
    </action>
</referenceBlock>

Düzeni nasıl değiştirebileceğimin adımlarını açıklayabilir misiniz, Aslında sistem yapılandırmasına göre addtocart.phtml dosyasına yapılan eki güncellemek istiyorum ve ayrıca özel modülü kullanarak güncellemek istiyorum
Deepak Mankotia

5
KAndy çözümü benim için işe yaramadı ama bu bir evet
csmarvz

"Customer_account_dashboard_top" blok adı şablonunu değiştirdim <body> <referenceBlock name = "customer_account_dashboard_top"> <eylem yöntemi = "setTemplate"> <bağımsız değişken adı = "şablon" xsi: type = "string"> Namespace_Modulename :: order /recentorder.phtml </argument> </action> </referenceBlock> </body> "ama işe yaramazsa, nazikçe kontrol et ve yorumlarınızı bana bildirin
senthil

43

Eylem düğümü kullanımdan kaldırıldı, ancak blok argümanlarını kullanabilirsiniz

<referenceBlock name="block_to_change">
    <arguments>
        <argument name="template" xsi:type="string">[Vendor]_[Module]::/path/to/template.phtml</argument>
    </arguments>
</referenceBlock>

Düzeni nasıl değiştirebileceğimin adımlarını açıklayabilir misiniz, aslında addtocart.phtmlsisteme göre dosya
ekini


4
Teşekkürler - Burada sadece bir hata raporuna referans bırakacağım: github.com/magento/magento2/issues/3356 - bu cevapta verilen yöntem, muhtemelen gelecekteki iş yapmanın yolu henüz reklamı yapılmayan bir şekilde çalışmaz
Kristof Fooman'da

2
@KAndy Kodunuz% 100 doğru mu? Bunu denedim ve hiçbir şekilde çalışmasını sağlayamıyorum. @ Mage2.PRO'nun (kullandığı <action method='setTemplate'>) gelen diğer cevap sorunsuz çalışır.
maginfortis

1
Bu işe yaramıyor. Kabul edilen cevap olsa da.
Milan Simek

29

Arasındaki farkı anlamak için <arguments>ve <action>size Magento 2 nesnelerin kurucular nasıl çalıştığını anlamak gerekir. Magento'da bir kurucuyu geçersiz kılarsanız, her zaman $data-parameterbir dizi olanı elde edersiniz . Bu iç XML dosyalarında sağlanan ve tercüme olarak veridir $_data-arrayait \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;
}

Bununla birlikte, bir şablonda, setTemplate()sözde kurucuda kullanılıyorsa ( _construct(), tek alt çizgi), bu $data, XML'de ayarlanmış olursa olsun, geçersiz kılındığı anlamına gelir .

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

Bu senaryoda, <action>yapıcı ve sözde yapıcıdan sonra yürütüldüğü için tercih edilir.

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

10

Aşağıdakiler benim için Magento EE 2.2.3’de çalıştı

<?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>

Not: Bir çekirdeğin şablonunu değiştirmek için özel bir modül kullanıyorsanız ve önceki kodun çalışmaması nedeniyle çıldırıyorsanız, modülün değiştirmeye çalıştığınız çekirdek modülün (modül.xml) ardından yüklendiğinden ve sizden idam bin/magento setup:upgrade:)


Bu bence en temiz yol.
Ben Crook

2

Nedenini bilmiyorum, ama en iyisini bu şekilde buluyorum:

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

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

Bu, yalnızca setTemplateyöntemi kullanmadan önce bloğunuzun üzerine yazılmadığında işe yarar . Magento 2.2.x ve üstü.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.