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_CheckoutModul , 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\AbstractItemsBlock. Die Module Magento_Checkoutund Magento_Salessind 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.xmlLayoutdatei 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_Checkoutder checkout_cart_index.xmldefinierten 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.xmlLayoutdatei 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 defaultbzw. referenziert werden simple.
Wenn Sie sich jedoch den Magento\Checkout\Block\Cart\GridBlock ansehen, der benannt checkout.cart.formist und das übergeordnete Element der Renderer ist, können Sie feststellen, dass die getItemHtmlMethode in der zugehörigen Vorlage aufgerufen wird cart/form.phtml. Diese Methode ruft dann auf getItemRenderer. Beide Methoden sind in Gridder übergeordneten Klasse definiert AbstractBlock. Hier werden die overridden_templatesDaten 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- argumentsSyntax unkompliziert .