Magento 2 में वर्चुअल टाइप क्लास को कैसे ओवरराइड करें


14

Magento 2 में VirtualType ब्लॉक को कैसे ओवरराइड करें, मैं अपने खुद के ब्लॉक के साथ वर्चुअल टाइप ब्लॉक के बाद ओवरराइड करना चाहता हूं,

<virtualType name="Magento\CatalogSearch\Block\SearchResult\ListProduct" type="Magento\Catalog\Block\Product\ListProduct">
   <arguments>
       <argument name="catalogLayer" xsi:type="object">Magento\Catalog\Model\Layer\Search</argument>
   </arguments>
</virtualType>

इसलिए मैंने इसे अपने कस्टम मॉड्यूल से di.xmlइस तरह से ओवरराइड करने की कोशिश की ,

<preference for="Magento\Catalog\Block\Product\ListProduct" type="My\Vendor\Block\Product\ListProductSearch" />

लेकिन यह काम नहीं करता है।

तो, Magento 2 में एक आभासी प्रकार वर्ग को ओवरराइड करने का उचित तरीका क्या है?

जवाबों:


14

आपको उपयोग करना होगा:

<preference for="Magento\CatalogSearch\Block\SearchResult\ListProduct" type="Vendor\Module\Block\Product\ListProductSearch" />

जैसा कि राफेल ने उल्लेख किया है।

इस एकवचन ब्लॉक को ठीक से काम करने के लिए, आपको view/frontend/layout/catalogsearch_result_index.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">
<body>
    <referenceBlock name="search_result_list">
        <action method="setTemplate">
            <argument name="template" xsi:type="string">Magento_Catalog::product/list.phtml</argument>
        </action>
    </referenceBlock>
</body>


1
एक जादू की तरह काम करता है!
15

आप क्यों कहते हैं कि आपको setTemplateकार्रवाई की आवश्यकता है? मुझे विश्वास नहीं होता कि यह सच है। वर्चुअल प्रकार के लिए प्राथमिकता निर्धारित करना कोर लेआउट XML में पहले से परिभाषित टेम्पलेट सेटिंग को प्रभावित नहीं करना चाहिए।
स्कॉट बुकानन

1
@ScottBuchanan जहाँ तक टेम्पलेट प्रदान किया गया है, उसमें मॉड्यूल शामिल है। इस सवाल का जवाब देते समय इस ब्लॉक में टेम्पलेट था, product/list.phtmlइसलिए वरीयता बदलकर टेम्पलेट का उपयोग किया गयाVendor_Module::product/list.phtml
बार्टोलोमिएज ज़ुबर्ट

आह, समझ में आता है।
स्कॉट बुकानन

8

यदि आप अपने उदाहरण में आभासी प्रकार को ओवरराइड करना चाहते हैं, तो आपको उपयोग करने की आवश्यकता है:

<preference for="Magento\CatalogSearch\Block\SearchResult\ListProduct" type="My\Vendor\Block\Product\ListProductSearch" />

के बजाय:

<preference for="Magento\Catalog\Block\Product\ListProduct" type="My\Vendor\Block\Product\ListProductSearch" />

आपके उदाहरण में, आप मूल प्रकार को ओवरराइड करते हैं और वर्चुअल प्रकार को नहीं, यही कारण है कि यह काम नहीं कर रहा है।


आपके उत्तर के लिए धन्यवाद, अब मैंने आपके द्वारा बताए गए तरीके की कोशिश की है, लेकिन यह अभी भी काम नहीं करता है।
नुवॉस

@ विष्णु दिलचस्प है, आपका di.xmlस्थित कहाँ है ?
राफेल डिजिटल पियानोवाद

my-plugin-dir / etc / di.xml
nuwaus

@ अगर आप इसे स्थानांतरित करने के लिए etc/frontend/di.xmlक्या?
राफेल डिजिटल पियानोवाद

यह अभी भी काम नहीं करता है :(
nuwaus

4

मुझे यकीन नहीं है कि वास्तव में xml कॉन्फ़िगरेशन कैसे मर्ज और सॉर्ट किए जाते हैं, लेकिन इस प्रकार की समस्या आमतौर पर लोड किए गए मॉड्यूल के अनुक्रम के लिए नीचे आती है।

मैं आपके लिए अनुक्रम जोड़ने की कोशिश करूंगा module.xml:

<sequence>
        <module name="Magento_CatalogSearch"/>
</sequence>

ऊपर राफेल द्वारा वर्णित वरीयता मेरे लिए ठीक काम कर रही है।

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