Magento 2: "नाम" के बिना किसी ब्लॉक का टेम्प्लेट कैसे बदलें


10

मैं अपने कस्टम टेम्पलेट के साथ ब्लॉक के खाके को ओवरराइड करने के लिए बदलना चाहता हूं। लेकिन इसका "नाम" नहीं है, इसमें केवल "जैसा" है। जिसे मैं ओवरराइड करना चाहता हूं वह है:

<block class="Magento\Sales\Block\Adminhtml\Order\View\Items\Renderer\DefaultRenderer"
       as="default"
       template="order/view/items/renderer/default.phtml"/>

जवाबों:


8

लेआउट ALIAS वाले टेम्प्लेट को ओवरराइड कैसे करें।

यह उत्तर एक संभावित उदाहरण है, आप ALIAS टेम्पलेट को ओवरराइड करने के लिए इसका अनुसरण कर सकते हैं।

मैंने दो उदाहरण मॉड्यूल बनाए हैं, Vendor_Moduleउर्फ टेम्पलेट के साथ लेआउट है, हम Vendortwo_Moduletwoमॉड्यूल द्वारा इस उपनाम को ओवरराइड कर रहे हैं ।

मान लें कि आप मॉड्यूल बनाने के चरणों को जानते हैं, मैं संपूर्ण मॉड्यूल निर्माण पोस्ट नहीं कर रहा हूं।

मॉड्यूल 1

\ एप्लिकेशन \ कोड \ विक्रेता \ मॉड्यूल \ आदि \ दृश्यपटल \ routes.xml

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/App/etc/routes.xsd">
    <router id="standard">
        <route id="module" frontName="module">
            <module name="Vendor_Module" />
        </route>
    </router>
</config>

\ एप्लिकेशन \ कोड \ विक्रेता \ मॉड्यूल \ दृश्य \ दृश्यपटल \ लेआउट \ module_test_test.xml

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="2columns-left" xsi:noNamespaceSchemaLocation="../../../../../../../lib/internal/Magento/Framework/View/Layout/etc/page_configuration.xsd">
     <body>     
        <referenceContainer name="content">         
            <block class="Vendor\Module\Block\Test\Test" name="test_test" template="test/test.phtml">
                <block class="Vendor\Module\Block\Test\Test" as="testali" template="test/testali.phtml"/>
            </block>
        </referenceContainer>      
    </body>
</page>

मॉड्यूल 2

\ एप्लिकेशन \ कोड \ Vendortwo \ Moduletwo \ आदि \ दृश्यपटल \ routes.xml

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../lib/internal/Magento/Framework/App/etc/routes.xsd">
    <router id="standard">
        <route id="moduletwo" frontName="moduletwo">
            <module name="Vendortwo_Moduletwo" />
        </route>
    </router>
</config>

\ एप्लिकेशन \ कोड \ Vendortwo \ Moduletwo \ दृश्य \ दृश्यपटल \ लेआउट \ default.xml

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
        <referenceBlock name="test_test">
            <block class="Vendortwo\Moduletwo\Block\Two\Two" as="testali" template="two/twoalias.phtml"/>
        </referenceBlock>
</page>

कैश निकालने के बाद, मैं http: // localhost / magento210 / मॉड्यूल / परीक्षण / परीक्षण चलाता हूं

उपनाम टेम्पलेट ओवरराइड है Vendortwo_Moduletwo two/twoalias.phtml

यहां छवि विवरण दर्ज करें


तो, क्या यह अपने उपनाम द्वारा ब्लॉक को ओवरराइड कर रहा है? क्या होगा अगर मैं इसे ओवरराइड नहीं करना चाहता, लेकिन इसके बाद एक और ब्लॉक जोड़ें?
जानिस एल्मरिस

3

यह है कि इसे ठीक से कैसे करें, और बिना हैक के।

मैंने ओपी के उपयोग के मामले को नहीं देखा, लेकिन मुझे गाड़ी के भीतर रेंडरर्स को संशोधित करने में सक्षम होने की आवश्यकता थी। समस्या यह है कि, ओपी के मामले की तरह, 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सिंटैक्स का उपयोग करके किया जाता है ।


1
इसे सही समाधान के रूप में स्वीकार किया जाना चाहिए। सरल और प्रभावी। उचित Magento2 रास्ता। महान व्याख्या। धन्यवाद!
इव

2

मेरा समाधान सार्वभौमिक नहीं है, यह एक "गंदा हैक" है, लेकिन यह कुछ मामलों में उपयोगी हो सकता है। मेरा नमूना फ्रंटएंड रेंडरर के लिए है, एडमिनबुक के लिए नहीं (मुझे लगता है कि यह समान होना चाहिए)।

\Magento\Framework\Data\Structure::getChildIdस्थिति " $ parentId == 'checkout.cart.item.renderers' के साथ सेटअप विराम बिंदु (यह मूल ब्लॉक का एक नाम है जैसा कि आप checkout_cart_item_renderers.xmlलेआउट में देख सकते हैं )। सभी बच्चे ब्लॉक के अपने (गणना) नाम हैं:

यहां छवि विवरण दर्ज करें

अपने मॉड्यूल के लेआउट अपडेट में इस नाम का उपयोग करें:

    <referenceBlock name="checkout.cart.item.renderers_schedule_block4">
        <action method="setTemplate">
            <argument name="template" xsi:type="string">Vendor_Module::cart/item/default.phtml</argument>
        </action>
    </referenceBlock>

2
इसे देखने वाले किसी के लिए, यह ध्यान रखें कि यह गिर जाएगा यदि आप इसे केवल एक अलॉफ स्टेयर देते हैं। कार्ड के साथ अपने घर का निर्माण न करें। उन नंबरों की गारंटी नहीं है।
२०

0

कृपया मेरा उत्तर यहाँ देखें: https://magento.stackexchange.com/a/239387/14403

मुझे विश्वास है कि वह समाधान है जो आपके लिए सबसे अच्छा काम करेगा। समाधान में किसी भी ब्लॉक / टेम्प्लेट को ओवरराइड करना शामिल है जिसमें केवल एक उपनाम नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.