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 Module Magento_Checkout
und Magento_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 :
<referenceBlock name="checkout.cart.form">
<arguments>
<argument name="overridden_templates" xsi:type="array">
<item name="default" xsi:type="string">LinusShops_Moneymaker::Magento_Checkout/cart/item/default.phtml</item>
<item name="simple" xsi:type="string">LinusShops_Moneymaker::Magento_Checkout/cart/item/simple.phtml</item>
<item name="configurable" xsi:type="string">LinusShops_Moneymaker::Magento_Checkout/cart/item/configurable.phtml</item>
</argument>
</arguments>
</referenceBlock>
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
der checkout_cart_index.xml
definierten Layout - Datei den folgenden Block:
<block class="Magento\Checkout\Block\Cart\Grid" name="checkout.cart.form" as="cart-items" template="cart/form.phtml" after="cart.summary">
<block class="Magento\Framework\View\Element\RendererList" name="checkout.cart.item.renderers" as="renderer.list"/>
<block class="Magento\Framework\View\Element\Text\ListText" name="checkout.cart.order.actions"/>
</block>
Anschließend werden einige dieser Renderer in der checkout_cart_item_renderers.xml
Layoutdatei definiert:
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<update handle="checkout_item_price_renderers"/>
<body>
<referenceBlock name="checkout.cart.item.renderers">
<block class="Magento\Checkout\Block\Cart\Item\Renderer" as="default" template="cart/item/default.phtml">
<block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions" name="checkout.cart.item.renderers.default.actions" as="actions">
<block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Edit" name="checkout.cart.item.renderers.default.actions.edit" template="Magento_Checkout::cart/item/renderer/actions/edit.phtml"/>
<block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Remove" name="checkout.cart.item.renderers.default.actions.remove" template="Magento_Checkout::cart/item/renderer/actions/remove.phtml"/>
</block>
</block>
<block class="Magento\Checkout\Block\Cart\Item\Renderer" as="simple" template="cart/item/default.phtml">
<block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions" name="checkout.cart.item.renderers.simple.actions" as="actions">
<block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Edit" name="checkout.cart.item.renderers.simple.actions.edit" template="Magento_Checkout::cart/item/renderer/actions/edit.phtml"/>
<block class="Magento\Checkout\Block\Cart\Item\Renderer\Actions\Remove" name="checkout.cart.item.renderers.simple.actions.remove" template="Magento_Checkout::cart/item/renderer/actions/remove.phtml"/>
</block>
</block>
</referenceBlock>
</body>
</page>
Leider können sie nicht durch ihre Aliase default
bzw. referenziert werden simple
.
Wenn Sie sich jedoch den Magento\Checkout\Block\Cart\Grid
Block ansehen, der benannt checkout.cart.form
ist und das übergeordnete Element der Renderer ist, können Sie feststellen, dass die getItemHtml
Methode in der zugehörigen Vorlage aufgerufen wird cart/form.phtml
. Diese Methode ruft dann auf getItemRenderer
. Beide Methoden sind in Grid
der übergeordneten Klasse definiert AbstractBlock
. Hier werden die overridden_templates
Daten verwendet:
/**
* Retrieve item renderer block
*
* @param string|null $type
* @return \Magento\Framework\View\Element\Template
* @throws \RuntimeException
*/
public function getItemRenderer($type = null)
{
if ($type === null) {
$type = self::DEFAULT_TYPE;
}
$rendererList = $this->_getRendererList();
if (!$rendererList) {
throw new \RuntimeException('Renderer list for block "' . $this->getNameInLayout() . '" is not defined');
}
$overriddenTemplates = $this->getOverriddenTemplates() ?: [];
$template = isset($overriddenTemplates[$type]) ? $overriddenTemplates[$type] : $this->getRendererTemplate();
return $rendererList->getRenderer($type, self::DEFAULT_TYPE, $template);
}
Mit diesem Wissen ist das Auffüllen des Blocks mit Daten aus Layout-XML mithilfe der Magento2- arguments
Syntax unkompliziert .