Así es como hacerlo correctamente y sin hacks.
No busqué el caso de uso de OP, pero necesitaba poder modificar los renderizadores dentro del carrito. El problema es que, como en el caso de OP, el Magento_Checkoutmódulo no proporciona nombres a los renderizadores, lo que significa que no se puede hacer referencia a ellos y que sus plantillas se cambian utilizando métodos tradicionales o documentados. Sin embargo, después de investigar un poco, descubrí cómo hacerlo utilizando las herramientas que Magento2 nos proporciona directamente en el diseño XML.
Tenga en cuenta que hay otros lugares donde funciona este mismo enfoque, como en el Magento\Sales\Block\Items\AbstractItemsbloque. Los módulos Magento_Checkouty Magento_Salesson los dos que más utilizan los renderizadores de elementos, por lo que cubre muchas de las consultas que llevarían a alguien a cambiar la plantilla de un bloque sin un nombre. La razón por la que esto se publicó se debe a la inevitabilidad de que otros busquen cómo modificar las plantillas de renderizador en los módulos de pago o ventas.
Primero voy a proporcionar la solución, y luego la explicaré en detalle para cualquiera que quiera saber por qué funciona.
Solución
Agregue lo siguiente al checkout_cart_index.xmlarchivo de diseño:
<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>
Tenga en cuenta que el nombre y la ruta del módulo deben modificarse para reflejar su base de código.
Explicación
Esto funciona aprovechando los overridden_templatesdatos del bloque, que no está definido por defecto.
En Magento_Checkout, el checkout_cart_index.xmlarchivo de diseño define el siguiente bloque:
<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>
Luego define un par de esos renderizadores en el checkout_cart_item_renderers.xmlarchivo de diseño:
<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>
Desafortunadamente, no pueden ser referenciados por sus alias defaulty simple, respectivamente.
Sin embargo, al observar el Magento\Checkout\Block\Cart\GridBloque, que se llama checkout.cart.formy es el padre de los renderizadores, se puede observar que hay una llamada al getItemHtmlmétodo en la plantilla asociada cart/form.phtml. Ese método luego llama getItemRenderer. Ambos métodos se definen en Gridla clase padre de AbstractBlock. Aquí es donde overridden_templatesse usan los datos:
/**
* 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);
}
Con este conocimiento, llenar el bloque con datos del diseño XML es sencillo utilizando la argumentssintaxis de Magento2 .