J'essaie de supprimer un bloc d'une certaine page (que ce soit le frontend ou le backend) mais uniquement si un certain indicateur de configuration est défini sur true
.
Prenons un exemple.
Je veux supprimer le bloc avec le nom dashboard
du tableau de bord d'administration.
Le bloc est défini dans le adminhtml_dashboard_index.xml
fichier du Magento_Backend
module:
<referenceContainer name="content">
<block class="Magento\Backend\Block\Dashboard" name="dashboard"/>
</referenceContainer>
Grâce à la réponse d'Adam, je peux le faire dans leadminhtml_dashboard_index.xml
<body>
<referenceBlock name="dashboard" remove="true" />
</body>
Mais je veux prendre un cran et supprimer ce bloc uniquement si le paramètre de configuration avec le chemin dashboard/settings/remove
a la valeur 1
.
Une approche de mise en page XML serait géniale, mais je prendrai également une approche d'observateur.
helper
classe, voir /programming/47237179/magento-2-i-want-to-add-ifconfig-in-override-block-xml?rq=1Réponses:
Je n'ai pas non plus trouvé de moyen de le faire avec la mise en page, mais voici un exemple de façon de le faire avec des observateurs (à condition qu'ils étendent le bloc Template) ...
Créez votre events.xml dans etc / events.xml
Créer l'observateur
Fondamentalement, le _toHtml vérifie s'il existe un modèle. S'il n'y en a pas, il revient ''.
ÉDITER
Après avoir creusé un peu plus, j'ai trouvé un moyen de le faire plus haut dans la chaîne.
Et l'observateur ...
la source
Normalement, cela devrait être fait avec la
<action />
balise:ÉDITER :
Seul problème est unsetChild n'accepte que l'alias. Vous ne pouvez pas utiliser de nom de bloc.
Autre solution: réécrire Magento Framework pour pouvoir utiliser ifconfig avec remove = "true"
1- Créez votre propre module.
2- Ajouter un nouveau fichier pour remplacer Framework Magento: (par exemple:
/Vendor/Module/Override/Magento/Framework/View/Layout/Reader/Block.php
)3- Ajouter un fichier di.xml pour remplacer le fichier magento:
4- Vous pouvez maintenant utiliser ifconfig dans la mise en page combinée avec remove:
Cet exemple concerne le bloc, mais vous pouvez faire de même pour le conteneur si vous remplacez la méthode containerReference () de /Magento/Framework/View/Layout/Reader/Container.php
la source
D'après les directives techniques :
Voici donc une solution de plugin pour cela:
Déclarez le plugin:
Définissez le plugin:
Comme dans la réponse de Smartie, j'ai essayé de plugin plus loin dans la chaîne
\Magento\Framework\View\Layout\Builder::build
avec uneafterBuild()
méthode mais cela conduira à une récursivité sans fin car\Magento\Framework\View\Layout::getBlock
et les\Magento\Framework\View\Layout::unsetElement
deux appellent à\Magento\Framework\View\Layout\Builder::build
nouveau.la source
L'attribut "ifconfig" d'un nœud "bloc" dans la disposition vous permet de lier le bloc à la valeur dans la configuration du magasin.
le traitement "ifconfig" se produit dans
\Magento\Framework\View\Layout\GeneratorPool::buildStructure
la source