Magento 2:ブロックのテンプレートの変更


52

Magento 1では、モジュール開発者として、次のようなレイアウトXMLコードを使用してブロックのテンプレートを変更できます。

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

そして、テンプレートを基本テーマに追加します。

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

モジュール開発者として、Magento 2で同様のことを行うことは可能ですか?または、レイアウトXMLまたはPHPコードを使用して、興味のあるブロックを削除し、別のテンプレートで新しいブロックを挿入する必要があります(クラスは元のブロッククラスを拡張します)

テンプレートを置き換えるカスタムテーマを作成できることは知っていますが、デフォルトのテンプレートを変更するモジュールを作成したいのですが、それでもカスタムテーマでそのテンプレートを置き換えることができます。

回答:


60

もちろん、それは可能です:

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

あなたは実際に私は、システム構成に応じてaddtocart.phtmlファイルに追加を更新したいとも、この使用してカスタムモジュールを更新したい、どのように私は、レイアウトを変更できる手順を説明することができます
ディーパックMankotia

5
キャンディ・ソリューションは、私のために動作しませんでしたが、この1はい
csmarvz

ブロック名「customer_account_dashboard_top」<body> <referenceBlock name = "customer_account_dashboard_top"> <action method = "setTemplate"> <argument name = "template" xsi:type = "string"> Namespace_Modulename :: orderのテンプレートを変更しました/recentorder.phtml </ argument> </ action> </ referenceBlock> </ body>」が動作しないので、ご確認の上、ご意見をお聞かせください
-senthil

43

アクションノードは非推奨ですが、ブロック引数を使用できます

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

あなたは私がレイアウトを変更する方法の手順を説明することができ、実際に私はへの追加、更新したいaddtocart.phtmlシステム構成に応じてファイルをしても、この使用したカスタムモジュール更新したい
ディーパックMankotia


4
おかげで-バグレポートへの参照をここに残しますgithub.com/magento/magento2/issues/3356-この回答に掲載されている方法は、おそらく将来のやり方ではありますが、広告どおりには機能しません
Kristof Fooman

2
@KAndyあなたのコード例は100%正しいですか?私はそれを試してみましたが、どうにかすることはできません。@ Mage2.PRO(を使用する<action method='setTemplate'>)からの他の答えは問題なく動作します。
maginfortis

1
これは機能しません。しかし、受け入れられた答えはそうします。
ミラノシメック

29

<arguments>との違いを理解するには<action>、Magento 2オブジェクトのコンストラクターがどのように機能するかを理解する必要があります。Magentoでコンストラクターをオーバーライドすると、常に$data-parameter配列を取得します。これは、XMLファイルで提供され、次の内部$_data-arrayに変換されたデータです\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;
}

ただし、テンプレートの場合setTemplate()、が疑似コンストラクター(_construct()、単一のアンダースコア)で使用されている場合、これは$dataXMLで設定されているかどうかに関係なく、がオーバーライドされることを意味します。

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

このシナリオで<action>は、コンストラクターと疑似コンストラクターの後に実行されるため、が優先されます。

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

10

以下は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>

注:カスタムモジュールを使用してコアのテンプレートを変更し、以前のコードが機能しないために怒っている場合は、変更しようとしているコアモジュール(module.xml)の後にモジュールがロードされていることを確認してください。実行されたbin/magento setup:upgrade:)


これは私の意見では最もクリーンな方法です。
ベン・クルック

2

理由はわかりませんが、この方法が最高だと思います。

<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"/>

これは、setTemplateメソッドを使用する前にブロックが上書きされなかった場合にのみ機能します。Magento 2.2.x以降。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.