Ecco come farlo correttamente e senza hack.
Non ho cercato il caso d'uso di OP, ma dovevo essere in grado di modificare i renderer nel carrello. Il problema è che, come nel caso di OP, il Magento_Checkout
modulo non fornisce nomi ai renderer, il che significa che non possono essere referenziati e che i loro modelli possono essere cambiati usando metodi tradizionali o documentati. Tuttavia, dopo un po 'di investigazione, ho scoperto come farlo utilizzando gli strumenti che Magento2 ci fornisce direttamente nel layout XML.
Nota che ci sono altri posti in cui funziona lo stesso approccio, come nel Magento\Sales\Block\Items\AbstractItems
blocco. I moduli Magento_Checkout
e Magento_Sales
sono i due che utilizzano maggiormente i renderer di elementi, quindi questo copre molte delle query che porterebbero qualcuno a cambiare il modello di un blocco senza un nome. Il motivo per cui questo è stato pubblicato è a causa dell'inevitabilità di altri che cercano come modificare i modelli di rendering nei moduli di pagamento o di vendita.
Prima fornirò la soluzione e poi la spiegherò in dettaglio a chiunque voglia sapere perché funziona.
Soluzione
Aggiungi quanto segue al checkout_cart_index.xml
file di 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>
Nota che il nome e il percorso del modulo devono essere modificati per riflettere la tua base di codice.
Spiegazione
Funziona sfruttando i overridden_templates
dati del blocco, che non è definito per impostazione predefinita.
In Magento_Checkout
, il checkout_cart_index.xml
file di layout definisce il seguente blocco:
<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>
Definisce quindi un paio di quei renderer nel checkout_cart_item_renderers.xml
file di 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>
Sfortunatamente, non possono essere referenziati dai loro alias default
e simple
, rispettivamente.
Tuttavia, esaminando la Magento\Checkout\Block\Cart\Grid
Block, che prende il nome checkout.cart.form
, ed è la madre delle renderer, si può notare che c'è una chiamata al getItemHtml
metodo nel modello associato, cart/form.phtml
. Quel metodo chiama quindi getItemRenderer
. Entrambi questi metodi sono definiti nella Grid
classe genitore 's, AbstractBlock
. Qui è dove overridden_templates
vengono utilizzati i dati:
/**
* 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 questa conoscenza, la compilazione del blocco con i dati dal layout XML è semplice usando la arguments
sintassi di Magento2 .