É assim que se faz corretamente e sem hacks.
Não procurei o caso de uso do OP, mas precisava modificar os renderizadores no carrinho. O problema é que, como no caso do OP, o Magento_Checkout
módulo não fornece nomes para os renderizadores, o que significa que eles não podem ser referenciados e seus modelos alterados usando métodos tradicionais ou documentados. No entanto, após algumas investigações, descobri como fazê-lo usando as ferramentas que o Magento2 nos fornece diretamente no XML do layout.
Observe que existem outros lugares onde essa mesma abordagem funciona, como no Magento\Sales\Block\Items\AbstractItems
bloco. Os módulos Magento_Checkout
e Magento_Sales
são os dois que mais utilizam os representantes de itens, portanto, isso abrange muitas das consultas que levariam alguém a alterar o modelo de um bloco sem um nome. A razão pela qual isso foi publicado é devido à inevitabilidade de outras pessoas procurarem como modificar modelos de renderizador nos módulos de pagamento ou vendas.
Vou fornecer a solução primeiro e depois explicá-la em detalhes para quem quiser saber por que ela funciona.
Solução
Adicione o seguinte ao checkout_cart_index.xml
arquivo de layout:
<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>
Observe que o nome e o caminho do módulo precisam ser modificados para refletir sua base de código.
Explicação
Isso funciona aproveitando os overridden_templates
dados do bloco, que não são definidos por padrão.
Em Magento_Checkout
, o checkout_cart_index.xml
arquivo de layout define o seguinte bloco:
<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>
Em seguida, define alguns desses renderizadores no checkout_cart_item_renderers.xml
arquivo de layout:
<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>
Infelizmente, eles não podem ser referenciados por seus aliases default
e simple
, respectivamente.
No entanto, olhando para o Magento\Checkout\Block\Cart\Grid
bloco, que é nomeado checkout.cart.form
e é o pai dos representantes, pode-se notar que há uma chamada para o getItemHtml
método no modelo associado cart/form.phtml
. Esse método então chama getItemRenderer
. Ambos os métodos são definidos na Grid
classe pai de AbstractBlock
. É aqui que os overridden_templates
dados são usados:
/**
* 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);
}
Com esse conhecimento, o preenchimento do bloco com dados do XML de layout é simples, usando a arguments
sintaxe do Magento2 .