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_Checkout
mó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\AbstractItems
bloque. Los módulos Magento_Checkout
y Magento_Sales
son 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.xml
archivo 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_templates
datos del bloque, que no está definido por defecto.
En Magento_Checkout
, el checkout_cart_index.xml
archivo 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.xml
archivo 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 default
y simple
, respectivamente.
Sin embargo, al observar el Magento\Checkout\Block\Cart\Grid
Bloque, que se llama checkout.cart.form
y es el padre de los renderizadores, se puede observar que hay una llamada al getItemHtml
método en la plantilla asociada cart/form.phtml
. Ese método luego llama getItemRenderer
. Ambos métodos se definen en Grid
la clase padre de AbstractBlock
. Aquí es donde overridden_templates
se 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 arguments
sintaxis de Magento2 .