Я пытаюсь удалить блок с определенной страницы (будь то интерфейс или бэкэнд), но только если установлен определенный флаг конфигурации true
.
Давайте возьмем пример.
Я хочу удалить блок с именем dashboard
из панели администратора.
Блок определяется в adminhtml_dashboard_index.xml
файле из Magento_Backend
модуля:
<referenceContainer name="content">
<block class="Magento\Backend\Block\Dashboard" name="dashboard"/>
</referenceContainer>
Благодаря ответу Адама я могу сделать это вadminhtml_dashboard_index.xml
<body>
<referenceBlock name="dashboard" remove="true" />
</body>
Но я хочу взять его на себя и удалить этот блок только в том случае, если значение параметра config с путем dashboard/settings/remove
имеет значение 1
.
Подход макета xml был бы замечательным, но я также буду подходить наблюдателем.
helper
классом, см. Https://stackoverflow.com/questions/47237179/magento-2-i-want-to-add-ifconfig-in-override-block-xml?rq=1Ответы:
Я не смог найти способ сделать это с помощью макета, но вот пример того, как вы можете сделать это с наблюдателями (при условии, что они расширяют блок Template) ...
Создайте ваш файл events.xml в etc / events.xml
Создать наблюдателя
В основном _toHtml проверяет, есть ли шаблон. Если нет, он возвращает ''.
РЕДАКТИРОВАТЬ
После еще нескольких копаний я нашел способ сделать это дальше по цепочке.
И наблюдатель ...
источник
Обычно это должно быть сделано с
<action />
тегом:РЕДАКТИРОВАТЬ :
Единственная проблема - unsetChild принимает только псевдоним. Вы не можете использовать имя блока.
Другое решение: переписать Magento Framework, чтобы иметь возможность использовать ifconfig с remove = "true"
1- Создайте свой собственный модуль.
2 Добавить новый файл , чтобы переопределить Magento Framework (например:
/Vendor/Module/Override/Magento/Framework/View/Layout/Reader/Block.php
)3- Добавьте файл di.xml для переопределения файла magento:
4- Теперь вы можете использовать ifconfig в макете в сочетании с remove:
Этот пример для блока, но вы можете сделать то же самое для контейнера, если вы переопределите метод containerReference () из /Magento/Framework/View/Layout/Reader/Container.php
источник
Из технического руководства :
Вот плагин для этого:
Объявите плагин:
Определите плагин:
Как и в ответ от Smartie я попытался дальше плагин вверх по цепочке в
\Magento\Framework\View\Layout\Builder::build
сafterBuild()
методом , но это приведет к бесконечной рекурсии , потому что\Magento\Framework\View\Layout::getBlock
и\Magento\Framework\View\Layout::unsetElement
оба вызова\Magento\Framework\View\Layout\Builder::build
снова.источник
Атрибут «ifconfig» узла «блок» в макете позволяет связать блок со значением в конфигурации магазина.
обработка ifconfig происходит в
\Magento\Framework\View\Layout\GeneratorPool::buildStructure
источник