मैं Magento 1 में एक ब्लॉक वर्ग को कैसे ओवरराइड / फिर से लिखूँ?


12

नोट: यह एक विहित प्रश्न के रूप में अभिप्रेत है जो पूरी तरह से बताता है कि ब्लॉक पुनर्लेखन कैसे काम करता है और इसका उपयोग डुप्लिकेट लक्ष्य के रूप में अधिक विशिष्ट "मैं कैसे ब्लॉक एक्स को ओवरराइड करता हूं" या "मेरे फिर से लिखना काम नहीं करता" प्रश्नों के लिए क्यों किया जा सकता है।

इसे भी देखें: Magento 1 के बारे में विहित प्रश्नों की तलाश

मान लीजिए, मुझे एक कस्टम मॉड्यूल में कोर ब्लॉक क्लास में बदलाव करना है (बदलाव के तरीके या तरीकों को जोड़ना)। मैं यह कैसे करूं, कदम से कदम?

जवाबों:


23

प्रत्येक ब्लॉक या ब्लॉक के समूह को config.xmlएक मॉड्यूल की फ़ाइल में इस तरह घोषित किया जाता है ( <global>टैग के अंदर )।
कैटलॉग मॉड्यूल से एक उदाहरण यहां दिया गया है

    <blocks><!-- marks definition of a block group -->
        <catalog><!-- unique alias for blocks in the module -->
            <class>Mage_Catalog_Block</class><!-- class prefix for all blocks -->
        </catalog>
    </blocks>

इसका मतलब यह है कि एक ब्लॉक का उपयोग उर्फ ​​का उपयोग करके किया जा सकता है catalog/class_name_hereजहां class_name_hereउपसर्ग से शुरू होने वाला शेष वर्ग पथ है।
इसका मतलब catalog/class_name_hereडिफ़ॉल्ट रूप से मैप किया जाएगा Mage_Catalog_Block_Class_Name_Here

एक ब्लॉक को फिर से लिखने के लिए आपको एक मॉड्यूल बनाना होगा जो उस मॉड्यूल पर निर्भर करता है जिसे आप Magento_Catalogमेरे उदाहरण में बदलना ( ) कर रहे हैं ।
और आपको config.xmlइसे <global>टैग के तहत जोड़ना होगा ।

<blocks>
    <catalog><!-- alias of the block group you are rewriting -->
        <rewrite><!-- reserved tag: specify that you are rewriting something -->
             <class_name_here>YourNamespace_YourModule_Block_Your_New_Class_Here</class_name_here> <!-- tag: the rest of the alias of the class you are rewriting. value: the name of your class that rewrites the core class -->
        </rewrite>
    </catalog>
</blocks>

फिर वर्ग बनाएं YourNamespace_YourModule_Block_Your_New_Class_Here(ZF फ़ोल्डर संरचना का पालन करें) और इस वर्ग को मूल वर्ग का विस्तार करें।

class YourNamespace_YourModule_Block_Your_New_Class_Here extends Mage_Catalog_Block_Class_Name_Here
{
    //your awesome code here
}

जब आप कर लें, तो संकलन अक्षम करें और इसे फिर से सक्षम करें (यदि आवश्यक हो) और कैश को साफ़ करें।

यह अमूर्त ब्लॉकों के लिए काम नहीं करेगा।
यह केवल उन कक्षाओं के लिए काम करता है, जो त्वरित हो जाते हैं।

उदाहरण

मान लेते हैं कि आप फ़ाइल ऐप \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ \ _ टाइप करने के लिए फिर से लिखना चाहते हैं, जिसका वर्ग Mage_Catalog_Block_Product_View_Options_Type_Selectआपके खुद के मॉड्यूल Marius_Test में है

तब आपको इस प्रविष्टि की आवश्यकता होगी config.xml:

<blocks>
    <catalog>
        <rewrite>
            <product_view_options_type_select>Marius_Test_Block_Catalog_Block_Product_View_Options_Type_Select</product_view_options_type_select>
        </rewrite>
    </catalog>
</blocks>

एप्लिकेशन \ code \ local \ Marius \ Test \ Block \ कैटलॉग \ Product \ View \ Options \ Type \ Select.php :

class Marius_Test_Block_Catalog_Product_View_Options_Type_Select extends Mage_Catalog_Block_Product_View_Options_Type_Select
{
    //your awesome code here
}

काम नहीं करता। मैं app \ code \ local \ WR \ EPO \ ब्लॉक \ कैटलॉग \ ब्लॉक \ ब्लॉक \ उत्पाद \ दृश्य \ विकल्प \ टाइप \ Select.phpMage_Catalog_Block_Product_View_Options_Type_Select में वर्ग को अधिलेखित करने का प्रयास करता हूं । मैंने इसे इस तरह आज़माया
ब्लैक

और अगर यह काम नहीं करता है, तो आप सोचते हैं कि मेरा जवाब गलत है, इसलिए आप यह सोचने के बजाय इसे कम कर देते हैं कि शायद आप कुछ गलत कर रहे हैं। वैसे भी ... इस की जगह <Mage_Catalog_Block_Product_View_Options_Type_Select> WR_EPO_Block_Catalog_Block_Product_View_Options_Type_Select </Mage_Catalog_Block_Product_View_Options_Type_Select>के साथ <product_view_options_type_select>WR_EPO_Block_Catalog_Block_Product_View_Options_Type_Select</product_view_options_type_select>और यकीन है कि वहाँ के अंदर कोई रिक्त स्थान हैं कि बनानाproduct_view_options_type_select
मेरियस

मैंने अस्वीकार कर दिया क्योंकि आपका उत्तर सटीक नहीं था और भले ही मैंने इसका चरण दर चरण पालन किया और सही परिणाम नहीं दिया। आपने लिखा है कि हमें कक्षा के नाम का उपयोग करना है, इसलिए मैंने इसका उपयोग किया और यह काम नहीं किया। हमें product_view_options_type_selectवास्तविक वर्ग नाम के बजाय उपयोग करना होगा Mage_Catalog_Block_Product_View_Options_Type_Select। यदि आप अपने उत्तर को अपने अनुसार बदलेंगे तो मैं उत्थान करूंगा।
ब्लैक

यदि आप इसे चरण दर चरण पढ़ते हैं तो आप एक कदम चूक गए हैं। जहाँ मैं समझाता हूँ कि कक्षा का उपनाम क्या है। यदि आप बस कॉपी पेस्ट की जगह लेते हैं तो आपको यह काम कर जाएगा। 17 लोग समझ गए। मुझे लगता है कि मैं इसे सही समझाया
मेरियस

हां, लेकिन एक अच्छा उदाहरण गायब है, इसलिए हम आश्वस्त कर सकते हैं कि हम आपके सिद्धांत को सही ढंग से समझ रहे थे
ब्लैक

4

मेरी बात को ओवरराइड करने और फिर से लिखने के लिए ये दोनों अलग-अलग चीजें हैं,

ओवरराइड:

जब हम डिजाइन कमबैक तंत्र का उपयोग करते हैं तो हम ओवरराइड कर रहे हैं

पुनर्लेखन:

जब हम अपनी कक्षा में मैगेंटो कोर कक्षाओं को फिर से लिखते हैं तो हम फिर से लिख रहे हैं।

1) ओवरराइड का उदाहरण:

अगर मुझे app/code/core/Mage/Catalog/Block/Product/List.phpफ़ाइल को ओवरराइड करने की आवश्यकता है, तो मैं नीचे दिखाए गए पथ के साथ अपने स्थानीय मॉड्यूल में प्रतिलिपि बनाता हूंapp/code/local/Mage/Catalog/Block/Product/List.php

यह Magento के सुझाव नहीं है लेकिन आप इस तरह से कर सकते हैं।

2) पुनर्लेखन का उदाहरण:

अगर मुझे इस ब्लॉक वर्ग को फिर से लिखना है Mage_Adminhtml_Block_Sales_Order_Createतो मैं अपने मॉड्यूल config.xml में नीचे की तरह कोड देता हूं

    <global>
        <blocks>
            <adminhtml>
                <rewrite>

                    <sales_order_create>Trimantra_Smallchanges_Block_Adminhtml_Sales_Order_Create</sales_order_create>
                </rewrite>
            </adminhtml>
        </blocks>
    </global>

और मेरी कक्षा में Trimantra_Smallchanges_Block_Adminhtml_Sales_Order_Create

मैं नीचे की तरह कोड

class Trimantra_Smallchanges_Block_Adminhtml_Sales_Order_Create extends Mage_Adminhtml_Block_Sales_Order_Create {
      My Function Or funcions That I want to Rewrite..
}

2

यहां जोड़ने के लिए महत्वपूर्ण यह है कि ब्लॉक पुनर्लेखन (साथ ही मैगेंटो मॉड्यूल के अन्य सभी पुनर्लेखन) उच्च रखरखाव के प्रयास का अर्थ है और इसलिए कॉन्फ़िगरेशन हेरफेर, घटनाओं और थीम अनुकूलन के बाद कार्यक्षमता का विस्तार करने के लिए एक अंतिम मौका माना जाना चाहिए।

संभावित समस्या 1: जब आप या अन्य अनुचर मैगेंटो के स्रोत फ़ाइलों को अपडेट करेंगे तो पुनर्व्यवस्थित टेम्पलेट अपडेट नहीं होगा। इसका अर्थ है कि सुरक्षा फ़िक्स या सुधार आपके कोड पर लागू नहीं होंगे। समान ब्लॉक सहित अन्य लिखित कक्षाओं पर लागू होता है, लेकिन यह निर्भर करता है कि कितना पुनर्लेखन किया गया था (नीचे देखें)।

संभावित समस्या 2: पुनर्वितरित ब्लॉक (या अन्य वर्ग) एक अन्य एक्सटेंशन द्वारा पुन: लिखा जा सकता है जिसे आप या अन्य अनुचर स्थापित करने का प्रयास करेंगे। तब आपको इस संघर्ष को हल करना होगा।

वैकल्पिक 1: घटनाओं का उपयोग करें, अर्थात कोड के माध्यम से खोदें जो आप बस फिर से लिखना और जांचना चाहते हैं कि क्या ऐसी घटनाएं हैं जिनका उपयोग वांछित कार्यक्षमता को प्राप्त करने के लिए किया जा सकता है।

वैकल्पिक 2: स्मार्ट को फिर से लिखें, अर्थात चारों ओर देखें: हो सकता है कि जिस स्थान पर आप फिर से लिखने जा रहे हैं, उस स्थान की तुरंत जाँच करें और जांचें कि क्या आप प्रभावित कर सकते हैं कि कौन सी कक्षा को विन्यास या घटनाओं के माध्यम से चुना गया है; हो सकता है कि कोई ऐसा वर्ग हो जिसके चारों ओर आप फिर से लिखे गए मूल वर्ग से 30 लाइनों की विधि को कॉपी करने के बजाय क्लासनाम को बदलने के लिए 3-लाइनों की विधि को ओवरराइड करने की अनुमति देते हैं।

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