Estou tentando remover um bloco de uma determinada página (seja front-end ou back-end), mas apenas se um determinado sinalizador de configuração estiver definido como true
.
Vamos dar um exemplo.
Quero remover o bloco com o nome dashboard
do painel do administrador.
O bloco é definido no adminhtml_dashboard_index.xml
arquivo do Magento_Backend
módulo:
<referenceContainer name="content">
<block class="Magento\Backend\Block\Dashboard" name="dashboard"/>
</referenceContainer>
Graças à resposta de Adam, posso fazer isso noadminhtml_dashboard_index.xml
<body>
<referenceBlock name="dashboard" remove="true" />
</body>
Mas quero aumentar um pouco e remover esse bloco apenas se a configuração do caminho dashboard/settings/remove
tiver o valor 1
.
Uma abordagem de layout xml seria incrível, mas também adotarei uma abordagem de observador.
helper
classe, consulte /programming/47237179/magento-2-i-want-to-add-ifconfig-in-override-block-xml?rq=1Respostas:
Também não consegui encontrar uma maneira de fazer isso com o layout, mas aqui está um exemplo de como você pode fazer isso com observadores (desde que eles estendam o bloco Template) ...
Crie seu events.xml em etc / events.xml
Crie o observador
Basicamente, o _toHtml verifica se há um modelo. Se não houver, retorna ''.
EDITAR
Depois de mais algumas escavações, encontrei uma maneira de fazer isso ainda mais na cadeia.
E o observador ...
fonte
Normalmente isso deve ser feito com a
<action />
tag:EDIT:
O único problema é unsetChild aceita apenas alias. Você não pode usar o nome do bloco.
Outra solução: reescreva o Magento Framework para poder usar o ifconfig com remove = "true"
1- Crie seu próprio módulo.
2- Adicione um novo arquivo para substituir Magento quadro: (por exemplo:
/Vendor/Module/Override/Magento/Framework/View/Layout/Reader/Block.php
)3- Adicione o arquivo di.xml para substituir o arquivo magento:
4- Agora você pode usar o ifconfig no layout combinado com remove:
Este exemplo é para Block, mas você pode fazer o mesmo para container se substituir o método containerReference () de /Magento/Framework/View/Layout/Reader/Container.php
fonte
Nas diretrizes técnicas :
Então, aqui está uma solução de plug-in para isso:
Declare o plugin:
Defina o plugin:
Como na resposta de Smartie Eu tentei o plugin mais acima na cadeia em
\Magento\Framework\View\Layout\Builder::build
com umafterBuild()
método, mas isso vai levar a uma recursão infinita porque\Magento\Framework\View\Layout::getBlock
e\Magento\Framework\View\Layout::unsetElement
ambos chamada\Magento\Framework\View\Layout\Builder::build
novamente.fonte
O atributo "ifconfig" de um nó "bloco" no layout permite vincular o bloco ao valor na configuração da loja.
O processamento "ifconfig" ocorre em
\Magento\Framework\View\Layout\GeneratorPool::buildStructure
fonte