Magento的布局系统在Magento 2中得到了极大的改进,使其更易于访问,更强大,更精简。但是,由于某些原因,在Magento 2 Admin(更确切地说,分类布局XML更新)中只提供了非常小的布局函数子集。在这篇博客中,我们将展示一个绕过这种讨厌的限制的非常简单的方法。

Magento 2 Admin中的布局更新限制

为了保持示例简单明了,假设我们要从特定类别中删除页面标题元素。在Magento 2 admin中,在类别布局更新XML字段中,我们添加以下行。

<referenceBlock name="page.main.title" remove="true" />

当我们点击保存时,我们收到以下错误:

Please correct the XML data and try again. Element ‘referenceBlock’: This element is not expected. Expected is one of (referenceContainer, container, update, move ). Line: 1

要注意的是,如果在主题中使用XML文件,则此XML将是有效的。看来,在Magento 2后台和主题布局文件中适用不同的标准。

因此,只允许以下XML:

  • referenceContainer - 我们可以引用现有的容器
  • 容器 - 我们可以创建新的容器
  • 更新 - 我们可以包含各种布局句柄
  • 移动 - 我们可以移动现有的块

此信息将帮助我们绕过限制。

绕过布局更新限制

我们可以通过 在referenceContainer  代码中包装referenceBlock代码  来绕过这个限制但是我们需要找到包含页面标题元素的容器。通过在IDE中进行简单搜索,我们找到以下代码段。

<referenceContainer name="columns.top">
<!-- ... -->
    <block class="Magento\Theme\Block\Html\Title" name="page.main.title" template="html/title.phtml"/>
            <container name="page.messages" htmlTag="div" htmlClass="page messages">
                <block class="Magento\Framework\View\Element\Template" name="ajax.message.placeholder" template="Magento_Theme::html/messages.phtml"/>
                <block class="Magento\Framework\View\Element\Messages" name="messages" as="messages" template="Magento_Theme::messages.phtml"/>
            </container>
<!-- ... -->
</referenceContainer>

我们使用columns.top容器并在Admin中的Layout Update XML中引用它并将其包装在我们的初始代码中。

<referenceContainer name="columns.top">
    <referenceBlock name="page.main.title" remove="true" />
</referenceContainer>

保存此配置时,我们不会在Admin中的类别页面上出现任何错误,并且会删除该特定类别的页面标题栏。