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_Checkout
module 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\AbstractItems
bloc. Les modules Magento_Checkout
et Magento_Sales
sont 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.xml
fichier 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_templates
données de bloc, qui ne sont pas définies par défaut.
Dans Magento_Checkout
, le checkout_cart_index.xml
fichier 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.xml
fichier 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 default
et simple
respectivement.
Cependant, en regardant dans le Magento\Checkout\Block\Cart\Grid
bloc, qui est nommé checkout.cart.form
, et est le parent des équarrisseurs, on peut noter qu'il ya un appel à la getItemHtml
méthode dans le modèle associé, cart/form.phtml
. Cette méthode appelle ensuite getItemRenderer
. Sont définis ces deux méthodes dans Grid
la classe parente de », AbstractBlock
. C'est là que les overridden_templates
donné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 arguments
syntaxe de Magento2 .