并不是所有的自定义布局都能通过扩展现有布局来实现。如果自定义的量很大时,可以覆盖所需的布局文件。这就意味着你在主题中新建的布局文件将被用来代替默认的主题布局文件。

在这篇文章中,页面布局,页面配置和通用布局被称为布局文件,它们的覆盖是一样的。

这类覆盖了默认或父主题的布局文件被称为覆盖布局文件。

关于自定义覆盖布局的例子

  • 抑制方法调用(如果块里有取消原始调用的方法,覆盖就没有必要了。这种情况下,你可以通过在取消方法调用的位置添加布局文件来自定义布局。)
  • 修改方法参数
  • 使用remove属性取消块/容器的输出
  • 为块和容器设置XML属性
  • 移除块参数
  • 修改并抑制句柄包容
  • 移除所有句柄指令,通过声明一个空句柄覆盖布局文件

如何覆盖一个布局

覆盖base布局

在如下位置放置一个同名的布局文件:

<theme_dir>
  |__/<Namespace_Module>
    |__/layout
      |__/override
         |__/base
           |--<layout1>.xml
           |--<layout2>.xml

这些文件覆盖如下布局:

  • <module_dir>/view/frontend/layout/<layout1>.xml
  • <module_dir>/view/frontend/layout/<layout2>.xml

覆盖主题布局

在如下位置放置一个同名的布局文件:

<theme_dir>
  |__/<Namespace_Module>
    |__/layout
      |__/override
         |__/theme
            |__/<Parent_Vendor>
               |__/<parent_theme>
                  |--<layout1>.xml
                  |--<layout2>.xml

这些文件覆盖如下布局:

  • <parent_theme_dir>/<Namespace>_<Module>/layout/<layout1>.xml
  • <parent_theme_dir>/<Namespace>_<Module>/layout/<layout1>.xml

注意:要覆盖页面布局文件时将文件名'layout'替换为'page_layout'

自定义错误

虽然布局覆盖机制提供了极大的定制灵活性,它也可以进行逻辑相关的改变。我们强烈建议你不要做以下修改:

  • 更改块名或别名。块的名字不应该被修改,块的别名也应该与父元素中的保持一致。
  • 更改句柄继承。例如,你不应该修改页面类型的父句柄。