Estoy tratando de eliminar un bloque de una determinada página (ya sea frontend o backend) pero solo si un determinado indicador de configuración está configurado en true
.
Tomemos un ejemplo.
Quiero eliminar el bloque con el nombre dashboard
del panel de administración.
El bloque se define en el adminhtml_dashboard_index.xml
archivo del Magento_Backend
módulo:
<referenceContainer name="content">
<block class="Magento\Backend\Block\Dashboard" name="dashboard"/>
</referenceContainer>
Gracias a la respuesta de Adam puedo hacer esto en eladminhtml_dashboard_index.xml
<body>
<referenceBlock name="dashboard" remove="true" />
</body>
Pero quiero llevarlo a un nivel superior y eliminar este bloque solo si la configuración con la ruta dashboard/settings/remove
tiene el valor 1
.
Un enfoque de diseño xml sería increíble, pero también adoptaré un enfoque de observador.
helper
clase, consulte /programming/47237179/magento-2-i-want-to-add-ifconfig-in-override-block-xml?rq=1Respuestas:
Tampoco pude encontrar una manera de hacer esto con el diseño, pero aquí hay un ejemplo de una forma en que puede hacerlo con observadores (siempre que extiendan el bloque de Plantilla) ...
Crea tu events.xml en etc / events.xml
Crea el observador
Básicamente, el _toHtml verifica si hay una plantilla. Si no lo hay, vuelve ''.
EDITAR
Después de un poco más de excavación, he encontrado una manera de hacer esto más arriba en la cadena.
Y el observador ...
fuente
Normalmente se debe hacer con la
<action />
etiqueta:EDITAR:
El único problema es unsetChild solo acepta alias. No puedes usar el nombre del bloque.
Otra solución: reescribir Magento Framework para poder usar ifconfig con remove = "true"
1- Crea tu propio módulo.
2- Agregue un nuevo archivo para anular Magento Framework: (ej .
/Vendor/Module/Override/Magento/Framework/View/Layout/Reader/Block.php
:)3- Agregue el archivo di.xml para anular el archivo magento:
4- Ahora puedes usar ifconfig en el diseño combinado con eliminar:
Este ejemplo es para Block, pero puede hacer lo mismo para container si anula el método containerReference () de /Magento/Framework/View/Layout/Reader/Container.php
fuente
De las pautas técnicas :
Así que aquí hay una solución de complemento para esto:
Declara el complemento:
Defina el complemento:
Al igual que en la respuesta de Smartie Traté de plugin de más arriba en la cadena en
\Magento\Framework\View\Layout\Builder::build
con unafterBuild()
método, pero esto conducirá a una recursión infinita porque\Magento\Framework\View\Layout::getBlock
, y\Magento\Framework\View\Layout::unsetElement
tanto la llamada\Magento\Framework\View\Layout\Builder::build
de nuevo.fuente
El atributo "ifconfig" de un nodo "bloque" en el diseño le permite vincular el bloque al valor en la configuración de la tienda.
el procesamiento "ifconfig" ocurre en
\Magento\Framework\View\Layout\GeneratorPool::buildStructure
fuente