是否可以在Magento2中删除页面布局中的元素?


8

当我阅读有关页面布局的文档(http://devdocs.magento.com/guides/v2.0/frontend-dev-guide/layouts/layout-types.html#layout-types-page)时,允许以下XML文档中的说明:

  • <container>
  • <referenceContainer>
  • <move>
  • <update>

由于<referenceBlock name="block.name" remove="true" />不是允许的指令之一,我如何才能删除特定页面布局中的某个元素?

我想要的顶级类别是整个其他页面设计。我不需要某些容器和块来进行此设计。对于这些类别,我只想显示子类别,而不是产品。

我现在要做的是,在页面布局中添加了以下几行:(在中design\frontend\Vendor\Name-of-theme\Magento_Theme\page_layout\catalog-blocks.xml

<move element="category.image" destination="delete"></move>
<move element="category.description" destination="delete"></move>
<move element="category.products" destination="delete"></move>
<move element="page.main.title" destination="delete"></move>

design\frontend\Vendor\Name-of-theme\Magento_Theme\layouts.xml我补充说:

<layout id="catalog-blocks">
    <label translate="true">Catalog Blocks</label>
</layout>

我在admin中为所有顶级类别提供了此目录块页面布局。

然后在主布局(design\frontend\Vendor\Name-of-theme\Magento_Theme\layout\default.xml)中添加:

<referenceBlock name="delete" remove="true" />

因此,整个删除块都将被删除,而所有我搬到这里的东西都将在页面布局中删除。这很好用!它完全达到了我想要的目的,但是整个事情在我看来似乎有些破绽。

这被认为是一种好习惯吗?如果没有,那么什么是不错的选择?

编辑1:更改了remove我的问题中的-tag,使用了正确的标签以避免混淆。

编辑2:有关文件和文件位置的更多信息。

Answers:


12

关于什么:

  • 创建一个新的容器(而不是一个块)
  • 将您的块移动到容器
  • 取出容器

像这样:

<container name="delete" htmlTag="div" htmlClass="delete"/>

<move element="category.image" destination="delete"></move>
<move element="category.description" destination="delete"></move>
<move element="category.products" destination="delete"></move>
<move element="page.main.title" destination="delete"></move>

<referenceContainer name="delete" remove="true" />

是的,这正是我所做的。我的观点是:这感觉很奇怪。这是唯一的解决方法吗?Magento为什么没有将此功能内置到page_layouts中,并且有充分的理由无法删除块?
11mb

@ 11mb与我在我的文章中创建并引用一个容器(页面布局xml)的容器中的操作稍有不同,而在您的问题中,您正在使用一个块和多个XML文件。但是,这是一个很大的问题,我不确定为什么Magento不能在page_layouts中建立此功能
Raphael在Digital Pianism上

@ 11mb随时可以在Magento 2 GitHub存储库上创建一个问题来解决该问题,这绝对是一个有趣的问题,我相信背后有很好的理由
Raphael在Digital Pianism

1
我看到你在这里做了什么。我认为这确实是一种更好的方法。我将对其进行测试,然后返回此处。
11MB

6

这是删除在Magento 2.任何块或容器可以传递的最佳实践name attribute内部name在下文元件。

<referenceBlock name="block.name" remove="true" />

您可以在magento 2系统内部进行搜索,您会发现许多地方与上面的语法相同。

其magento推荐方法。如果属性remove =“ true”,则将元素添加到从该布局中移除的列表。

在magento 1 <remove> element中有效,但在Magento 2中,您必须设置与上面相同的语法。


谢谢!我想我必须改一下这个问题。是否可以直接在页面布局中使用<referenceBlock name="block.name" remove="true" />(我对remove标记有误),因为referenceBlock两者都不被允许。我仍然应该move将元素添加到“删除容器”,然后在主布局文件中将其删除。这对我来说似乎很奇怪。
11MB

如果已使用名称定义块,则使用referenceBlock。否则它没有用。例如 <block class="Magento\Framework\View\Element\Html\Links" name="top.links">,在这种情况下,您可以使用<referenceBlock name="top.links" remove="true" />
Rakesh Jesadiya

我知道该块应该事先存在。但是在页面布局中,我不能使用此处描述的所有通用布局说明:devdocs.magento.com/guides/v2.0/frontend-dev-guide/layouts/…。(我编辑我的问题),所以我不能使用referenceBlock
11MB

您现在在哪个页面上工作,以及要删除哪个元素wnat?
Rakesh Jesadiya'5

我在问题中添加了更多信息。谢谢您的支持!
11MB

1

页面布局仅应用于创建页面的线框/结构,而不用于较小的修改(例如删除块)。

要删除仅用于新布局的块,我认为最好的方法是创建自己的布局句柄并在其中进行修改。例如,您可以创建使用新线框/布局的catalog_category_toplevel.xml并删除其中的块。

由于这更多是一项后端任务,我对此感到很不舒服,无法为抱歉的问题提供说明:(Alan Storm的这两篇文章可能会帮助您:

TL:DR

如果您希望这样做并遵循最佳实践,则需要创建一个新的布局手柄。

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.