Voici comment le faire correctement et sans piratage.
Je n'ai pas recherché le cas d'utilisation d'OP, mais j'avais besoin de pouvoir modifier les moteurs de rendu dans le panier. Le problème est que, comme dans le cas d'OP, le Magento_Checkoutmodule ne fournit pas de noms aux moteurs de rendu, ce qui signifie qu'ils ne peuvent pas être référencés et leurs modèles modifiés à l'aide de méthodes traditionnelles ou documentées. Cependant, après quelques recherches, j'ai découvert comment le faire en utilisant les outils que Magento2 nous fournit directement dans la mise en page XML.
Notez qu'il existe d'autres endroits où cette même approche fonctionne, comme dans le Magento\Sales\Block\Items\AbstractItemsbloc. Les modules Magento_Checkoutet Magento_Salessont les deux qui utilisent le plus les rendus d'élément, donc cela couvre la plupart des requêtes qui conduiraient quelqu'un à changer le modèle d'un bloc sans nom. La raison pour laquelle cela a été publié est à cause de l'inévitabilité de ceux qui cherchent à modifier les modèles de rendu dans les modules de paiement ou de vente.
Je vais d'abord fournir la solution, puis l'expliquer en détail à tous ceux qui veulent savoir pourquoi cela fonctionne.
Solution
Ajoutez ce qui suit au checkout_cart_index.xmlfichier de mise en page:
<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>
Notez que le nom et le chemin du module doivent être modifiés pour refléter votre base de code.
Explication
Cela fonctionne en exploitant les overridden_templatesdonnées de bloc, qui ne sont pas définies par défaut.
Dans Magento_Checkout, le checkout_cart_index.xmlfichier de mise en page définit le bloc suivant:
<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>
Il définit ensuite quelques-uns de ces moteurs de rendu dans le checkout_cart_item_renderers.xmlfichier de disposition:
<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>
Malheureusement, ils ne peuvent pas être référencés par leurs alias defaultet simplerespectivement.
Cependant, en regardant dans le Magento\Checkout\Block\Cart\Gridbloc, qui est nommé checkout.cart.form, et est le parent des équarrisseurs, on peut noter qu'il ya un appel à la getItemHtmlméthode dans le modèle associé, cart/form.phtml. Cette méthode appelle ensuite getItemRenderer. Sont définis ces deux méthodes dans Gridla classe parente de », AbstractBlock. C'est là que les overridden_templatesdonnées sont utilisées:
/**
* 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);
}
Avec ces connaissances, le remplissage du bloc avec des données provenant de la mise en page XML est simple en utilisant la argumentssyntaxe de Magento2 .