Я хочу удалить блок из макета в magento 2, который объявлен в стороннем расширении, но у блока нет имени.
Могу ли я сделать это?
Блок объявлен так
<referenceContainer name="before.body.end">
<block class="Magento\Backend\Block\Template" template="[Vendor_Module]::template.phtml"/>
</referenceContainer>
Я не могу использовать
<referenceBlock name="..." remove="true" />
потому что, как вы видите, на нем нет имени.
magento2
magento-2.1
layout
blocks
Мариус
источник
источник
[Vendor_Module]::template.phtml
Ответы:
Я нашел эту проблему в классе
Magento\Framework\View\Layout\ScheduledStructure\Helper
Есть функция
_generateAnonymousName
:Это вызов из
scheduleStructure
функции:В этом случае имя блока может быть:
before.body.end_schedule_block1
before.body.end_schedule_block2
Я думаю, что вы должны определить итоговый блок без имени в контейнере, а имя блока заказа нужно удалить в контейнере.
источник
body.before.end
контейнере в разном порядке.$name = $this->_generateAnonymousName($parentNode->getElementName() . '_schedule_block');
, Должен ли класс и шаблон передаваться параметру?Я действительно даю тебе плохую идею.
Здесь идея не остановить вывод вашего блока
Использование события
view_block_abstract_to_html_after
И с помощью этого наблюдателя отключите вывод вашего блока
источник
Я получил идею из ответа Амита и в результате получил рабочее решение, которое не выглядит слишком навязчивым и не является излишним, поскольку мой код выполняется только один раз.
Я создал наблюдателя на событие
layout_generate_blocks_after
, которое выполняется после загрузки макетов и генерации блоков.Это может иметь недостаток, потому что блок, который я пытаюсь удалить, все еще создается, но в моем случае мне просто нужно было удалить его со страницы.
Итак, у меня есть файл
etc/adminhtml/events.xml
и мой класс наблюдателя:
источник