Magento 2: Ändern einer Blockvorlage

52

In Magento 1 ist es als Modulentwickler möglich, die Vorlage eines Blocks mit Layout-XML-Code zu ändern

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

und fügen Sie dann Ihre Vorlage zum Basisthema hinzu.

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

Kann man als Modulentwickler in Magento 2 etwas Ähnliches tun? Oder muss ich Layout-XML oder PHP-Code verwenden, um den gewünschten Block zu entfernen und einen neuen Block mit einer anderen Vorlage einzufügen (deren Klasse die der ursprünglichen Blockklasse erweitert)?

Ich weiß, dass ich ein benutzerdefiniertes Design erstellen kann, das eine Vorlage ersetzt. Ich möchte jedoch ein Modul erstellen, das die Standardvorlage ändert, es jedoch weiterhin zulässt, dass ein benutzerdefiniertes Design diese Vorlage ersetzt.

Alan Storm
quelle

Antworten:

59

Natürlich ist es möglich:

<referenceBlock name="copyright">
    <action method="setTemplate">
        <argument name="template" xsi:type="string">Dfr_Backend::page/copyright.phtml</argument>
    </action>
</referenceBlock>
Mage2.PRO
quelle
Können Sie die Schritte erläutern , wie kann ich das Layout ändern, Eigentlich mag ich das Add zu addtocart.phtml Datei aktualisieren nach Systemkonfiguration und will auch diese mit benutzerdefinierten Modul aktualisieren
Deepak Mankotia
5
KAndy-Lösung hat bei mir nicht funktioniert, aber dieses yes
csmarvz
Ich habe die Vorlage des Blocknamens "customer_account_dashboard_top" <body> <referenceBlock name = "customer_account_dashboard_top"> <action method = "setTemplate"> <argument name = "template" xsi: type = "string"> Namespace_Modulename :: order geändert /recentorder.phtml </ argument> </ action> </ referenceBlock> </ body> "aber es wird nicht funktionieren, bitte überprüfen Sie und lassen Sie mich Ihre Kommentare wissen
senthil
43

Aktionsknoten ist veraltet, aber Sie können Blockargumente verwenden

<referenceBlock name="block_to_change">
    <arguments>
        <argument name="template" xsi:type="string">[Vendor]_[Module]::/path/to/template.phtml</argument>
    </arguments>
</referenceBlock>
KAndy
quelle
Können Sie die Schritte erläutern , wie kann ich das Layout ändern, Eigentlich mag ich das Add aktualisieren addtocart.phtmlDatei nach Systemkonfiguration und will auch diese mit benutzerdefinierten Modul aktualisieren
Deepak Mankotia
4
Danke - ich werde hier nur einen Verweis auf einen Fehlerbericht hinterlassen. Github.com/magento/magento2/issues/3356 - die in dieser Antwort gepostete Methode funktioniert, obwohl die zukünftige Vorgehensweise möglicherweise noch nicht wie angekündigt funktioniert
Kristof um Fooman
2
@KAndy Ist Ihr Codebeispiel zu 100% korrekt? Ich habe es versucht und ich kann es in keiner Weise zum Laufen bringen. Die andere Antwort von @ Mage2.PRO (die verwendet <action method='setTemplate'>) funktioniert ohne Probleme.
Maginfortis
1
Das geht nicht. Akzeptierte Antwort tut es jedoch.
Milan Simek
29

Um den Unterschied zwischen <arguments>und zu verstehen <action>, müssen Sie verstehen, wie die Konstruktoren von Magento 2-Objekten funktionieren. Wenn Sie einen Konstruktor in Magento überschreiben, erhalten Sie immer $data-parameterein Array. Dies sind die Daten in Bezug auf den internen in den XML - Dateien und übersetzte zur Verfügung gestellt $_data-arrayvon \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;
}

Bei einer Vorlage, setTemplate()die im Pseudokonstruktor ( _construct()einzelner Unterstrich) verwendet wird, bedeutet dies jedoch, dass die $dataüberschrieben wird, unabhängig davon, ob sie im XML festgelegt ist.

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

In diesem Szenario <action>wird bevorzugt, da nach dem Konstruktor & Pseudo-Konstruktor ausgeführt wird dies.

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

Folgendes funktionierte für mich in 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>

Hinweis: Wenn Sie ein benutzerdefiniertes Modul verwenden, um die Vorlage eines Cores zu ändern, und verrückt werden, weil der zuvor abgeschnittene Code nicht funktioniert, stellen Sie sicher, dass Ihr Modul geladen ist, nachdem Sie das zu ändernde Core-Modul (module.xml) und Sie hingerichtet bin/magento setup:upgrade:)

Diazwatson
quelle
Dies ist meiner Meinung nach der sauberste Weg.
Ben Crook
2

Ich weiß nicht warum, aber ich finde diesen Weg der Beste zu sein:

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

Dies funktioniert nur, wenn Ihr Block vor der Verwendung der setTemplateMethode nicht überschrieben wurde . Magento 2.2.x und höher.

AleksLi
quelle