यह है कि इसे ठीक से कैसे करें, और बिना हैक के।
मैंने ओपी के उपयोग के मामले को नहीं देखा, लेकिन मुझे गाड़ी के भीतर रेंडरर्स को संशोधित करने में सक्षम होने की आवश्यकता थी। समस्या यह है कि, ओपी के मामले की तरह, Magento_Checkout
मॉड्यूल रेंडरर्स को नाम प्रदान नहीं करता है, जिसका अर्थ है कि उन्हें संदर्भित नहीं किया जा सकता है और पारंपरिक या प्रलेखित विधियों का उपयोग करके उनके टेम्पलेट बदल गए हैं। हालांकि, कुछ स्लीथिंग के बाद, मुझे पता चला कि टूल का उपयोग करना कैसे करना है Magento2 हमें लेआउट XML में सीधे प्रदान करता है।
ध्यान दें कि ऐसे अन्य स्थान हैं जहां यह वही दृष्टिकोण काम करता है, जैसे कि Magento\Sales\Block\Items\AbstractItems
ब्लॉक में। Magento_Checkout
और Magento_Sales
मॉड्यूल, दो कि आइटम दाता के सबसे इस्तेमाल कर रहे हैं, ताकि प्रश्नों है कि एक नाम के बिना एक ब्लॉक के टेम्पलेट बदलने के कोई नेतृत्व करेंगे के कई इस कवर। इसका कारण यह पोस्ट किया गया था क्योंकि चेकआउट या बिक्री मॉड्यूल में रेंडरर टेम्प्लेट को संशोधित करने के तरीके की तलाश करने वाले अन्य लोगों की अनिवार्यता है।
मैं पहले समाधान प्रदान करने जा रहा हूं, और फिर इसे किसी के लिए भी विस्तार से बताऊंगा जो जानना चाहता है कि यह क्यों काम करता है।
समाधान
checkout_cart_index.xml
लेआउट फ़ाइल में निम्नलिखित जोड़ें :
<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>
ध्यान दें कि मॉड्यूल नाम और पथ को आपके कोडबेस को प्रतिबिंबित करने के लिए संशोधित करने की आवश्यकता है।
व्याख्या
यह overridden_templates
ब्लॉक डेटा का लाभ उठाकर काम करता है , जिसे डिफ़ॉल्ट रूप से परिभाषित नहीं किया गया है।
में Magento_Checkout
, checkout_cart_index.xml
लेआउट फ़ाइल निम्नलिखित ब्लॉक को परिभाषित करती है:
<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>
यह तब checkout_cart_item_renderers.xml
लेआउट फ़ाइल में उन रेंडरर्स के एक जोड़े को परिभाषित करता है :
<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>
दुर्भाग्य से, उन्हें क्रमशः अपने उपनामों default
और simple
, द्वारा संदर्भित नहीं किया जा सकता है।
हालाँकि, Magento\Checkout\Block\Cart\Grid
ब्लॉक में, जिसे नाम दिया गया है checkout.cart.form
, और रेंडरर्स के माता-पिता हैं, यह ध्यान दिया जा सकता है कि getItemHtml
संबंधित टेम्पलेट में विधि के लिए कॉल है cart/form.phtml
। वह विधि फिर पुकारती है getItemRenderer
। इन तरीकों में से दोनों में परिभाषित कर रहे हैं Grid
, के माता पिता वर्ग AbstractBlock
। यह वह जगह है जहाँ overridden_templates
डेटा का उपयोग किया जाता है:
/**
* 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);
}
इस ज्ञान के साथ, ब्लॉक XML को लेआउट से डेटा के साथ पॉप करना सीधे Magento2 के arguments
सिंटैक्स का उपयोग करके किया जाता है ।