So überschreiben Sie eine Vorlage mit Layout-ALIAS.
Diese Antwort ist ein mögliches Beispiel. Sie können dies befolgen, um die ALIAS-Vorlage zu überschreiben.
Ich habe zwei Beispielmodule erstellt, Vendor_Module
hat ein Layout mit Alias-Vorlage. Wir überschreiben diesen Alias nach Vendortwo_Moduletwo
Modul.
Angenommen, Sie kennen die Schritte zum Erstellen eines Moduls. Ich veröffentliche nicht die gesamte Modulerstellung.
Modul 1
\ app \ code \ Vendor \ Module \ etc \ frontend \ route.xml
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/App/etc/routes.xsd">
<router id="standard">
<route id="module" frontName="module">
<module name="Vendor_Module" />
</route>
</router>
</config>
\ app \ code \ Vendor \ Module \ view \ frontend \ layout \ module_test_test.xml
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="2columns-left" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd">
<body>
<referenceContainer name="content">
<block class="Vendor\Module\Block\Test\Test" name="test_test" template="test/test.phtml">
<block class="Vendor\Module\Block\Test\Test" as="testali" template="test/testali.phtml"/>
</block>
</referenceContainer>
</body>
</page>
Modul 2
\ app \ code \ Vendortwo \ Moduletwo \ etc \ frontend \ route.xml
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/App/etc/routes.xsd">
<router id="standard">
<route id="moduletwo" frontName="moduletwo">
<module name="Vendortwo_Moduletwo" />
</route>
</router>
</config>
\ app \ code \ Vendortwo \ Moduletwo \ view \ frontend \ layout \ default.xml
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<referenceBlock name="test_test">
<block class="Vendortwo\Moduletwo\Block\Two\Two" as="testali" template="two/twoalias.phtml"/>
</referenceBlock>
</page>
Nach dem Entfernen des Cache starte ich http: // localhost / magento210 / module / test / test
Die Alias-Vorlage wird von überschrieben Vendortwo_Moduletwo
two/twoalias.phtml
So geht's richtig und ohne Hacks.
Ich habe den Anwendungsfall von OP nicht nachgeschlagen, aber ich musste in der Lage sein, die Renderer im Warenkorb zu ändern. Das Problem ist, dass das
Magento_Checkout
Modul , wie im Fall von OP, keine Namen für die Renderer bereitstellt, was bedeutet, dass sie nicht referenziert und ihre Vorlagen mit herkömmlichen oder dokumentierten Methoden geändert werden können. Nach einigem Hin und Her entdeckte ich jedoch, wie man es mit den Tools macht, die Magento2 uns direkt im Layout-XML zur Verfügung stellt.Beachten Sie, dass es andere Stellen gibt, an denen der gleiche Ansatz funktioniert, z. B. im
Magento\Sales\Block\Items\AbstractItems
Block. Die ModuleMagento_Checkout
undMagento_Sales
sind die beiden, die Element-Renderer am häufigsten verwenden. Daher werden viele der Abfragen behandelt, die dazu führen würden, dass jemand die Vorlage eines Blocks ohne Namen ändert. Der Grund, warum dies veröffentlicht wurde, liegt in der Unvermeidlichkeit anderer, die nach Möglichkeiten zum Ändern von Renderer-Vorlagen in den Checkout- oder Verkaufsmodulen suchen.Ich werde zuerst die Lösung bereitstellen und sie dann jedem ausführlich erklären, der wissen möchte, warum sie funktioniert.
Lösung
Fügen Sie der
checkout_cart_index.xml
Layoutdatei Folgendes hinzu :Beachten Sie, dass der Modulname und der Pfad geändert werden müssen, um Ihre Codebasis widerzuspiegeln.
Erläuterung
Dies funktioniert durch Nutzung der Blockdaten
overridden_templates
, die nicht standardmäßig definiert sind.In
Magento_Checkout
dercheckout_cart_index.xml
definierten Layout - Datei den folgenden Block:Anschließend werden einige dieser Renderer in der
checkout_cart_item_renderers.xml
Layoutdatei definiert:Leider können sie nicht durch ihre Aliase
default
bzw. referenziert werdensimple
.Wenn Sie sich jedoch den
Magento\Checkout\Block\Cart\Grid
Block ansehen, der benanntcheckout.cart.form
ist und das übergeordnete Element der Renderer ist, können Sie feststellen, dass diegetItemHtml
Methode in der zugehörigen Vorlage aufgerufen wirdcart/form.phtml
. Diese Methode ruft dann aufgetItemRenderer
. Beide Methoden sind inGrid
der übergeordneten Klasse definiertAbstractBlock
. Hier werden dieoverridden_templates
Daten verwendet:Mit diesem Wissen ist das Auffüllen des Blocks mit Daten aus Layout-XML mithilfe der Magento2-
arguments
Syntax unkompliziert .quelle
Meine Lösung ist nicht universell, es ist ein "schmutziger Hack", aber es kann in bestimmten Fällen nützlich sein. Mein Beispiel ist für den Frontend-Renderer, nicht für adminhtml (ich nehme an, es sollte dasselbe sein).
Richten Sie den Haltepunkt
\Magento\Framework\Data\Structure::getChildId
mit der Bedingung " $ parentId == 'checkout.cart.item.renderers' " ein (dies ist ein Name für den übergeordneten Block, wie Sie imcheckout_cart_item_renderers.xml
Layout sehen können). Alle untergeordneten Blöcke haben eigene (berechnete) Namen:Verwenden Sie diese Namen in der Layoutaktualisierung Ihres Moduls:
quelle
Bitte sehen Sie meine Antwort hier: /magento//a/239387/14403
Ich glaube, das ist die Lösung, die am besten für Sie funktioniert. Die Lösung umfasst das Überschreiben von Blöcken / Vorlagen, die keinen Alias nur für Namen haben.
quelle