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代码来删除我感兴趣的块,然后使用其他模板插入新块(其类扩展了原始块类的类)

我知道我可以创建一个替换模板的自定义主题,但是我对创建一个可以更改默认模板的模块感兴趣,但是仍然允许自定义主题来替换该模板。

Answers:


59

当然,有可能:

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

您能解释一下如何更改布局的步骤吗,实际上我想根据系统配置更新添加到addtocart.phtml文件,并且还想使用自定义模块进行更新
Deepak Mankotia 2015年

5
KAndy解决方案对我不起作用,但是这个对我
有用

我已更改块名称为“ 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>”,但无法正常工作,请检查并告知您您的评论
sendhil

43

不建议使用操作节点,但可以使用块参数

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

您能解释一下如何更改布局的步骤吗?实际上,我想addtocart.phtml根据系统配置更新添加到文件,并且还想使用自定义模块来更新此文件
Deepak Mankotia 2015年


4
谢谢-我就离开这里的bug报告的引用github.com/magento/magento2/issues/3356 -张贴在这个答案的方法,同时可能做事的未来之路,还没有像宣传工作
克里斯托夫在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(),单个下划线)中使用,则意味着$data无论xml中是否设置了,都将覆盖。

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

仅在使用setTemplatemethod 之前未覆盖您的块的情况下才有效。Magento 2.2.x及更高版本。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.