Magento 2:如何设置核心块的自定义模板


15

我正在尝试覆盖模块中的register.phtml,但似乎存在一些配置问题,这些问题使Magento无法使用我的自定义模板覆盖核心模块中的模板。我检查了代码,但找不到问题。有人可以帮忙吗?提前致谢。module.xml:

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="Namespace_ModuleName" setup_version="0.0.2">
        <sequence>
            <module name="Magento_Customer"/>
        </sequence>
    </module>
</config>

命名空间\模块名称\视图\前端\布局下的customer_account_create.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="customer_form_register">
        <arguments>

            <argument name="template" xsi:type="string">Namespace_ModuleName::form/register.phtml</argument>

        </arguments>
    </referenceBlock>
</layout>

composer.json:

{
  "name": "namespace/module-modulename",
  "description": "modulename",
  "type": "magento2-module",
  "version": "0.0.2",
  "license": [
    "OSL-3.0",
    "AFL-3.0"
  ],
  "require": {
    "php": "~5.5.0|~5.6.0",
    "magento/framework": "~0.42",
    "magento/magento-composer-installer": "*",
    "magento/module-customer": "*"
  },
  "extra": {
    "map": [
      [
        "*",
        "Namespace/ModuleName"
      ]
    ]
  }
}

Answers:


18

只需引用必要的块并将模板设置为referenceBlock节点的属性即可:

<?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="customer_form_register" template="VendorName_ModuleName::form/register.phtml"/>
    </body>
</page>

替代语法:

<referenceBlock name="customer_form_register">
    <action method="setTemplate">
        <argument name="template" xsi:type="string">VendorName_ModuleName::form/register.phtml</argument>
    </action>
</referenceBlock>

此外,如果你使用的是企业版,请务必把Magento_CustomerCustomAttributessequencemodule.xml,因为它也将覆盖此模板,可能会覆盖更改。


1
感谢Alex,但这对我不起作用。我想知道我是否错过了一些重要的细节,例如配置文件或错字。
Ricky.C 2015年

只是尝试将这样的布局句柄放到Captcha模块上(它依赖于Customer模块,因此像您的自定义模块一样在其后被加载),并且对我有用。Magento完全认可您的模块吗?当然,请记住在刷新页面之前先清除缓存。尝试使用Captcha进行此操作,只是为了了解问题是否出在模块或布局声明上。
Alex Paliarush 2015年

@ Ricky.C查看最新答案,尤其是关于EE。
Alex Paliarush 2015年

我尝试了替代语法,该语法可在最新的Community Magento 2.0上使用。非常感谢。
Ricky.C 2015年

1

在您的布局文件中使用以下代码:

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="1column" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <referenceBlock name="customer_form_register">
            <arguments>
                <argument name="template" xsi:type="string">Namespace_ModuleName::form/register.phtml</argument>
            </arguments>
        </referenceBlock>
    </body>
</page>

它将“布局”替换为“页面”,并添加正文标签

编辑:第二种替代方法是删除原始块,并添加具有所需模板的新块

<referenceBlock name="customer_form_register" remove="true"/>
<referenceContainer name="content">
    <block class="Magento\Customer\Block\Form\Register" name="my_customer_form_register" template="Namespace_ModuleName::form/register.phtml">
        <container name="form.additional.info" as="form_additional_info"/>
        <container name="customer.form.register.fields.before" as="form_fields_before" label="Form Fields Before" htmlTag="div" htmlClass="customer-form-before"/>
    </block>
</referenceContainer>

感谢您的回答,我已经尝试过但仍然失败
Ricky.C 2015年

尝试第二种解决方案。顺便说一句,您的模板文件在Namespace / ModuleName / view / frontend / templates / form / register.phtml中吗?
csmarvz 2015年

我认为这仍然失败了,因为我正在使用adminhtml模板。因此,我尝试了另一种替代方法:将模板复制到我自己的模块中,然后重写Block来调用该setTemplate方法,然后该方法在同一模块中找到模板。非常肮脏的解决方案,但对我有用的唯一方法!
雅克

0

您在<page>标签之后缺少<body>标签,请尝试:

<?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="customer_form_register">
        <arguments>

            <argument name="template" xsi:type="string">Namespace_ModuleName::form/register.phtml</argument>

        </arguments>
    </referenceBlock>
</body>
</page>

1
感谢您的回答,这对我也不起作用。
Ricky.C 2015年

您是否将<layout>标签更改为<page>标签?
法师解决方案

是的,我只是复制了您的代码并更改了Namespace_ModuleName
Ricky.C 2015年

0

覆盖setTemplate方法对我来说是最好的。

/ **
 *销售订单项目名称列渲染器
 * /
班级名称 
扩展\ Magento \ Sales \ Block \ Adminhtml \ Items \ Column \ Name
{

    公共功能setTemplate($ template){
        返回parent :: setTemplate('Magento_Sales ::'。$ template);
    }

    / **
     *添加换行符并截断值
     *
     * @参数字符串$ value
     * @返回数组
     * /
    公共函数getFormattedOption($ value)
    {
        $ remainder ='';
        $ value = $ this-> truncateString(
                 str_replace(';',';
',$ value), 1024,'',$剩余 ); return ['value'=> nl2br($ value), 'remainder'=> nl2br($ remainder)]; } }

0

我知道这很古老,但是如果可以帮助某人,

这个github问题magento2 / issues / 3356指出,与不建议使用的工作方法相反,referenceBlockarguments方法(在问题中提及)遭受了一个bug:

<referenceBlock name="customer_form_login">
    <action method="setTemplate">
        <argument name="template" xsi:type="string">
            VendorName_ModuleName::form/login.phtml
        </argument>
    </action>
</referenceBlock>

文档(设置块模板)不能反映事物的实际状态。


1
是的,新方法并不总是有效,因此必须使用不推荐使用的方法
TheKitMurkit
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.