Magento 2: ब्लॉक के टेम्प्लेट को बदलना


52

Magento 1 में, मॉड्यूल डेवलपर के रूप में लेआउट एक्सएमएल कोड का उपयोग करके ब्लॉक के टेम्पलेट को बदलना संभव है

<reference name="block_to_change">
    <action method="setTemplate">
        <param>/path/to/template.phtml</param>
    </action>
</reference>

और फिर अपने टेम्पलेट को बेस थीम से जोड़ रहे हैं।

app/design/frontend/base/default/template/path/to/template.phtml

क्या यह संभव है, एक मॉड्यूल डेवलपर के रूप में, मैगेंटो 2 में कुछ ऐसा ही करने के लिए? या मुझे जिस ब्लॉक में दिलचस्पी है उसे हटाने के लिए लेआउट एक्सएमएल या पीएचपी कोड का उपयोग करना होगा , और एक अलग टेम्पलेट के साथ एक नया ब्लॉक सम्मिलित करना होगा (जिसका वर्ग मूल ब्लॉक वर्ग का विस्तार करता है)

मुझे पता है कि मैं एक कस्टम थीम बना सकता हूं जो एक टेम्पलेट को बदलता है, लेकिन मैं एक मॉड्यूल बनाने में दिलचस्पी रखता हूं जो डिफ़ॉल्ट टेम्पलेट को बदलता है, लेकिन फिर भी एक कस्टम थीम को उस टेम्पलेट को बदलने की अनुमति देता है।

जवाबों:


59

बेशक, यह संभव है:

<referenceBlock name="copyright">
    <action method="setTemplate">
        <argument name="template" xsi:type="string">Dfr_Backend::page/copyright.phtml</argument>
    </action>
</referenceBlock>

क्या आप चरणों को समझा सकते हैं कि मैं लेआउट को कैसे बदल सकता हूं, वास्तव में मैं सिस्टम कॉन्फ़िगरेशन के अनुसार addtocart.phtml फ़ाइल में अपडेट अपडेट करना चाहता हूं और कस्टम मॉड्यूल का उपयोग करके इसे अपडेट भी करना चाहता हूं
दीपक मनकोटिया

5
KAndy समाधान मेरे लिए काम नहीं किया, लेकिन यह एक हाँ
csmarvz

मैंने ब्लॉक नाम "customer_account_dashboard_top" <body> <referenceBlock name = "customer_account_dashboard_top"> <क्रिया विधि = "setTemplate"> "तर्क नाम =" टेम्पलेट "प्रकार =" स्ट्रिंग "> Namespace_Modulename :: क्रम का नाम बदल दिया है। /recentorder.phtml </ तर्क> </ कार्रवाई> </ संदर्भBlock> </ body> "लेकिन इसका काम नहीं हो रहा है, कृपया जांच करें और मुझे अपनी टिप्पणी दें
प्रेषित

43

एक्शन नोड को हटा दिया गया है, लेकिन आप ब्लॉक तर्कों का उपयोग कर सकते हैं

<referenceBlock name="block_to_change">
    <arguments>
        <argument name="template" xsi:type="string">[Vendor]_[Module]::/path/to/template.phtml</argument>
    </arguments>
</referenceBlock>

क्या आप चरणों की व्याख्या कर सकते हैं कि मैं लेआउट को कैसे बदल सकता हूं, वास्तव में मैं addtocart.phtmlसिस्टम कॉन्फ़िगरेशन के अनुसार फाइल को जोड़ने के लिए अपडेट करना चाहता हूं और कस्टम मॉड्यूल का उपयोग करके भी इसे अपडेट करना चाहता हूं
दीपक मनकोटिया


4
धन्यवाद - मैं सिर्फ एक बग रिपोर्ट यहाँ के लिए एक संदर्भ छोड़ देंगे github.com/magento/magento2/issues/3356 - विधि इस उत्तर में तैनात है, जबकि संभवतः काम करने के भविष्य भी तरह से, अभी तक के रूप में विज्ञापित काम नहीं करता है
क्रिस्टोफ फोमन

2
क्या आपका कोड 100% सही है? मैंने कोशिश की है और मैं इसे किसी भी तरह से काम करने के लिए नहीं कर सकता। @ Mage2.PRO (जो उपयोग करता है <action method='setTemplate'>) से अन्य जवाब समस्याओं के बिना काम करता है।
मैजिनफोर्टिस

1
यह काम नहीं करता है। स्वीकृत जवाब हालांकि करता है।
मिलन सिमिक

29

के बीच के अंतर को समझने के लिए <arguments>और <action>आपको समझना चाहिए कि मैगेंटो 2 ऑब्जेक्ट्स के निर्माता कैसे काम करते हैं। यदि आप Magento में एक कंस्ट्रक्टर को ओवरराइड करते हैं, तो आपको हमेशा $data-parameterएक एरे मिलेगा । यह एक्सएमएल फाइलों में उपलब्ध कराए गए डेटा है और इसका आंतरिक अनुवाद किया गया $_data-arrayहै \Magento\Framework\DataObject:

<referenceBlock name="catalog.topnav">
    <arguments>
        <argument name="template" xsi:type="string">Foo_Bar::buzz.phtml</argument>
    </arguments>
</referenceBlock>    

...

public function __construct(array $data = [])
{
    // $_data is populated with the arguments from XML:
    // so $_data['template'] is now 'Foo_Bar::buzz.phtml'
    $this->_data = $data;
}

हालाँकि, टेम्पलेट के मामले में, यदि setTemplate()इसका उपयोग छद्म निर्माता ( _construct(), एकल अंडरस्कोर) में किया $dataजाता है, तो इसका मतलब यह है कि यह ओवरराइड है, चाहे वह XML में सेट हो।

public function _construct()
{
    $this->setTemplate('foo/bar.phtml');
}

उस परिदृश्य में, <action>पसंद किया जाता है, क्योंकि यह कंस्ट्रक्टर और छद्म कंस्ट्रक्टर के बाद निष्पादित किया जाता है।

<referenceBlock name="catalog.topnav">
    <action method="setTemplate">
        <argument name="template" xsi:type="string">Foo_Bar::buzz.phtml</argument>
    </action>
</referenceBlock> 

10

निम्नलिखित मेरे लिए Magento EE 2.2.3 में काम किया

<?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">
    <body>
        <referenceBlock name="core.module.block.name" template="[Vendor]_[Module]::path/to/your/template.phtml" />
    </body>
</page>

नोट: यदि आप किसी कोर के टेम्प्लेट को बदलने के लिए कस्टम मॉड्यूल का उपयोग कर रहे हैं और आप पागल हो रहे हैं क्योंकि पिछले कोड का स्निप काम नहीं करता है, सुनिश्चित करें कि आप जिस मॉड्यूल को बदलने का प्रयास कर रहे हैं, उसके बाद आपका मॉड्यूल लोड हो गया है (मॉड्यूल.xml) और आप निष्पादित bin/magento setup:upgrade:)


यह मेरी राय में सबसे साफ तरीका है।
बेन क्रुक

2

मुझे पता नहीं क्यों, लेकिन मुझे इस तरह से सबसे अच्छा लगता है:

<referenceBlock name="sales.order.items.renderers.default" template="Foo_Bar::sales/order/items/renderer/default.phtml"/>

1
<referenceBlock name="sales.order.items.renderers.default" template="Foo_Bar::sales/order/items/renderer/default.phtml"/>

यह केवल तभी काम करेगा जब setTemplateविधि का उपयोग करने से पहले आपके ब्लॉक को ओवरराइट नहीं किया गया था । Magento 2.2.x और उच्चतर।

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