Ich versuche, einen Block von einer bestimmten Seite zu entfernen (sei es Frontend oder Backend), aber nur, wenn ein bestimmtes Konfigurationsflag auf gesetzt ist true
.
Nehmen wir ein Beispiel.
Ich möchte den Block mit dem Namen dashboard
aus dem Admin-Dashboard entfernen .
Der Block ist in definiert adminhtml_dashboard_index.xml
Datei aus dem Magento_Backend
Modul definiert:
<referenceContainer name="content">
<block class="Magento\Backend\Block\Dashboard" name="dashboard"/>
</referenceContainer>
Dank Adams Antwort kann ich das in deradminhtml_dashboard_index.xml
<body>
<referenceBlock name="dashboard" remove="true" />
</body>
Ich möchte es aber noch etwas genauer betrachten und diesen Block nur entfernen, wenn die Konfigurationseinstellung mit dem Pfad dashboard/settings/remove
den Wert hat1
.
Ein Layout-XML-Ansatz wäre fantastisch, aber ich werde auch einen Beobachteransatz wählen.
helper
Klasse teilnehmen möchten,Antworten:
Ich habe auch keinen Weg gefunden, dies mit Layout zu tun, aber hier ist ein Beispiel dafür, wie Sie es mit Beobachtern tun können (vorausgesetzt, sie erweitern den Template-Block) ...
Erstellen Sie Ihre events.xml in etc / events.xml
Erstellen Sie den Beobachter
Grundsätzlich prüft _toHtml, ob eine Vorlage vorhanden ist. Ist dies nicht der Fall, wird "" zurückgegeben.
BEARBEITEN
Nach einigem Nachgraben habe ich einen Weg gefunden, dies weiter die Kette hoch zu tun.
Und der Beobachter ...
quelle
Normalerweise sollte es mit
<action />
tag gemacht werden:EDIT:
Einziges Problem ist, dass unsetChild nur Alias akzeptiert. Sie können keinen Blocknamen verwenden.
Andere Lösung: Magento Framework neu schreiben, um ifconfig mit remove = "true" verwenden zu können
1- Erstellen Sie Ihr eigenes Modul.
2- eine neue Datei hinzufügen Magento - Framework außer Kraft zu setzen: (zB:
/Vendor/Module/Override/Magento/Framework/View/Layout/Reader/Block.php
)3- Fügen Sie die Datei di.xml hinzu, um die Magento-Datei zu überschreiben:
4- Jetzt können Sie ifconfig im Layout in Kombination mit remove verwenden:
Dieses Beispiel gilt für Block, aber Sie können dasselbe für container tun, wenn Sie die Methode containerReference () von /Magento/Framework/View/Layout/Reader/Container.php überschreiben
quelle
Mit dem Attribut "ifconfig" eines "Block" -Knotens im Layout können Sie einen Block mit einem Wert in der Geschäftskonfiguration verknüpfen.
"ifconfig" -Verarbeitung erfolgt in
\Magento\Framework\View\Layout\GeneratorPool::buildStructure
quelle
Aus den technischen Richtlinien :
Also hier ist eine Plugin-Lösung dafür:
Deklarieren Sie das Plugin:
Definiere das Plugin:
Wie in der Antwort von Smartie habe ich versucht, die Kette
\Magento\Framework\View\Layout\Builder::build
mit einerafterBuild()
Methode weiter zu erweitern, aber dies führt zu einer endlosen Rekursion, da\Magento\Framework\View\Layout::getBlock
und\Magento\Framework\View\Layout::unsetElement
beide\Magento\Framework\View\Layout\Builder::build
erneut aufrufen .quelle