Можно ли удалить элементы в макете страницы в 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>

Я дал все верхние категории этого макета страницы блоков каталога в админке.

Затем в основной макет ( design\frontend\Vendor\Name-of-theme\Magento_Theme\layout\default.xml) я добавил:

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

Таким образом, весь блок удаления будет удален со всеми вещами, которые я переместил сюда, в макете страницы. Это хорошо работает! Он достигает именно того, чего я хочу, но все это кажется мне немного хакерским.

Считается ли это хорошей практикой? Если нет, то что было бы хорошей альтернативой?

Изменить 1 : изменил remove-tag в моем вопросе с правильным, чтобы избежать путаницы.

Редактировать 2 : немного больше информации о файлах и местах расположения файлов.

11mb
источник

Ответы:

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 и есть веская причина, по которой вы не можете удалить блоки?
11
@ 11mb немного отличается от того, что вы сделали, так как в моем посте я создаю и ссылаюсь на контейнер в одном файле (макет страницы xml), тогда как в вашем вопросе вы используете блок и несколько файлов XML. Однако, это отличный вопрос, я не уверен, почему Magento не создал эту функцию в page_layouts
Рафаэль на Digital Pianism
@ 11mb, не стесняйтесь создавать проблему в репозитории Magento 2 GitHub для решения этой проблемы, это определенно интересная проблема, и я уверен, что есть веская причина для этого
Рафаэль на Digital Pianism
1
Я вижу, что вы сделали здесь. Я думаю, что это действительно лучший подход. Я проверю это и вернусь сюда.
11
6

Это лучшая практика для удаления любого блока или контейнера в magento 2. Вы можете перейти name attributeвнутрь nameв элементе ниже.

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

Вы можете искать внутри системы magento 2, вы найдете синтаксис многих мест такой же, как и выше.

Его рекомендация magento way.If атрибут remove = "true", а затем добавить элемент в список удалить из этого макета.

В magento 1 <remove> elementдействителен, но в Magento 2 вы должны установить синтаксис, как указано выше.

Ракеш Джесадия
источник
Спасибо! Я думаю, что я должен немного перефразировать вопрос. Можно ли использовать <referenceBlock name="block.name" remove="true" />(я был неправ в отношении removeтега) в макете страницы напрямую, поскольку referenceBlockэто тоже не разрешено. Мне все еще нужно moveдобавить элемент в «delete-container», а затем удалить его в основном файле макета. Что мне кажется странным.
11
referenceBlock используется, когда блок уже определен с именем. в противном случае это не полезно. ех. <block class="Magento\Framework\View\Element\Html\Links" name="top.links">В этом случае вы можете использовать<referenceBlock name="top.links" remove="true" />
Ракеш Джесадия
Я знаю, что блок должен существовать заранее. Но в макете страницы я не могу использовать все общие инструкции макета, как описано здесь: devdocs.magento.com/guides/v2.0/frontend-dev-guide/layouts/… . (Я отредактировал свой вопрос), поэтому я не могу использовать referenceBlock
11mb
на какой странице вы работаете сейчас и какой элемент хотите удалить?
Ракеш Джесадия
Я добавил еще немного информации в вопрос. Спасибо за вашу поддержку!
11
1

Макеты страниц должны использоваться только для создания каркаса / структуры страницы, а не для небольших изменений, таких как удаление блоков.

Чтобы удалить блок только для вашего нового макета, я думаю, что лучший способ - создать свой собственный дескриптор макета и внести в него изменения. Например, вы можете создать catalog_category_toplevel.xml, который использует ваш новый каркас / макет и удалить блоки там.

Поскольку это скорее внутренняя задача, я не чувствую себя достаточно комфортно, чтобы предоставить инструкции для этого извинения :( Эти две статьи от Alan Storm могут помочь вам в этом:

TL: DR

Если вы хотите сделать это и следовать рекомендациям, вам нужно создать новый маркер макета.

Бен Крук
источник