如何通过Magento2中的模块覆盖模板


9

我正在创建一个模块,想要覆盖模板app/code/Magento/Catalog/view/adminhtml/templates/catalog/product/edit/options.phtml

是否可以在模块(不是主题)中进行

不幸的是,通过布局XML更改模块名称似乎并不容易,因为这是在https://github.com/magento/magento2/blob/develop/app/code/Magento/Catalog/Block中进行硬编码设置的/Adminhtml/Product/Edit/Tab/Options.php#L21



Answers:


10

添加模块文件的布局文件夹[Vendor] / [ModuleName] /view/adminhtml/layout/catalog_product_options.xml

<?xml version="1.0"?>
<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/layout_generic.xsd">
    <referenceBlock name="admin.product.options">
        <arguments>
            <argument name="template" xsd:type="string">[Vendor]/[ModuleName]::product_options.phtml</argument>
        </arguments>
    </referenceBlock>
</layout>

还需要在这行中添加到模块xml中,以便在编目后加载布局

<sequence>
        <module name="Magento_Catalog"/>
</sequence>

admin.product.options从哪里得到名字的?
亚历克斯(Alex)

只需按布局文件搜索\ Magento \ Catalog \ Block \ Adminhtml \ Product \ Edit \ Tab \ Options并在Magento / Catalog / view / adminhtml / layout / catalog_product_options.xml中查找声明
KAndy 2015年

1
不是Vendor_ModuleName::product_options.phtml吗?
Giel Berkers,

是的,谢谢你的
发言

2
仅当在Block.php文件中设置了原始模板时,此解决方案才有效。如果在layout.xml上设置了原始模板,则此解决方案将不起作用。更好的方法是始终使用<action method="setTemplate">而不是<arguments>。该解决方案在所有情况下均适用。
Jalogut

3
  1. 在模块中创建相应的布局文件:

[供应商] / [模块名称] /view/adminhtml/layout/catalog_product_options.xml

  1. 设置自定义模板配置
<layout xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/layout_generic.xsd">
    <referenceBlock name="admin.product.options">
        <action method="setTemplate">
            <argument name="template" xsi:type="string">[Vendor]_[ModuleName]::product_options.phtml</argument>
        </action>
    </referenceBlock>
</layout>

注意:使用<action method="setTemplate">而不是非常重要<arguments><arguments>仅当该块在xml声明中未指定其他模板时才有效。在任何其他情况下,您都需要<action method="setTemplate">覆盖现有模板。最好使用<action method="setTemplate">它,因为它始终有效。


0

是的,您可以从自定义模块的应用程序/代码覆盖模板文件。但是,请记住,在Magento的继承概念中,来自应用程序/设计的文件(模板,布局,静态文件)会覆盖应用程序/代码中的文件。就像子主题覆盖父主题一样。

因此,我认为最好为您的自定义模块创建一个自定义主题,并在app / design中添加所有phtml,xml,css,js,字体和图像文件。

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.