एक मॉडल (मॉडल) को फिर से अक्षम करने के लिए कैसे


10

एक तृतीय-पक्ष विस्तार है जो एक विशिष्ट Magento कोर वर्ग को फिर से लिखता है। इससे कोई फर्क नहीं पड़ता कि यह ब्लॉक, हेल्पर या मॉडल है, लेकिन इस मामले में यह एक मॉडल है। अब मेरा सामना है कि यह फिर से लिखना बुरा है और मैं इसे तीसरे पक्ष के विस्तार को बदलने के बिना अक्षम करना चाहूंगा। इसलिए, मैं एक कस्टम एक्सटेंशन लिखता हूं जो थर्ड पार्टी एक्सटेंशन पर निर्भर करता है। तीसरे पक्ष के पुनर्लेखन को अक्षम करने का सबसे अच्छा तरीका क्या है? मैं जिस एक के बारे में सोच सकता हूं वह एक कस्टम रीराइट को परिभाषित करना है, जिसे तीसरे पक्ष के पुनर्लेखन के बजाय उपयोग किया जाता है:

<global>
    <models>
        <custom_extension>
            <class>Custom_Extension_Model</class>
        </custom_extension>
        <mage_core>
            <rewrite>
                <sth>Custom_Extension_Model_Sth</sth>
            </rewrite>
        </mage_core>
    </models>
</global>

Sth.php, वर्ग सीधे Mage वर्ग से निकलता है और इसलिए तीसरे पक्ष को फिर से लिखना अक्षम करता है:

class Custom_Extension_Model_Sth extends Mage_Core_Model_Sth
{

}

यह काम करता है, लेकिन बहुत अच्छा नहीं लगता है। पर्यवेक्षकों के बारे में सोचकर, उन्हें config.xml के माध्यम से केवल उन्हें अक्षम करना संभव है disabled। क्या पुनर्लेखन के साथ ऐसा कुछ संभव है? मैंने निम्नलिखित का उपयोग करने की कोशिश की और यह काम करता है:

<global>
    <models>
        <mage_core>
            <rewrite>
                <sth></sth>
            </rewrite>
        </mage_core>
    </models>
</global>

लेकिन क्या ऐसा करना सुरक्षित है? क्या यह सभी संस्करणों में काम करता है? मैंने कभी नहीं देखा कि जंगली में, यही कारण है कि मैं पूछ रहा हूं।

जवाबों:


1

लंबे समय तक नोड के रूप में खाली है Magento सोचेंगे कि कोई पुनर्लेखन नहीं था और 'क्लास प्रीफिक्स को क्लास नाम बनाने के लिए उपयोग करें' क्योंकि आसन कभी भी उनका नहीं था। में Mage_Core_Model_Config::getGroupedClassName

हालाँकि मुझे लगता है कि आपको टैग को बदलने के <sth/>बजाय <sth></sth>फ़ॉर्मेटिंग को रोकने के लिए उपयोग करना चाहिए (मैगेंटो की नज़र में 'खाली' नहीं) जो कि उस वर्ग के साथ समाप्त हो जाएगा जिसमें त्रुटि नहीं मिली है।

मुझे विश्वास नहीं है कि सहायकों, ब्लॉक या मॉडल के लिए एक 'अक्षम' विकल्प है। आप एक ऑब्जर्वर का भी उपयोग कर सकते हैं (जो कि विन्यास को वापस लाएगा कि यह कैसे होना चाहिए) लेकिन समस्या यह है कि आप इसके साथ देखते हैं तो आप किसी भी मॉड्यूल को मजबूर करते हैं जो आपके मॉड्यूल के बाद या तो फिर से लिखना चाहता है ताकि एक ऑब्जर्वर ऑल का उपयोग कर सके XML के माध्यम से अपने पर्यवेक्षक को निष्क्रिय करने के लिए पता करने के लिए।

कुछ इस तरह:

    public function controllerActionPredispatch(Varien_Event_Observer $event)
    {
        $helper = Mage::helper('webtise_foundationalerts');
        if (! $helper->isAdmin()) {
            $node = Mage::getConfig()->getNode('global/models/core/rewrite');
unset($node->sth);
        }
    }

तो मेरे लिए XML तरीका जीतता है।


3

मैं कहूंगा कि यदि आप एक कस्टम मॉड्यूल बनाते हैं, तो यह सुनिश्चित करने के लिए कि यह उस मॉड्यूल पर निर्भरता है जो इसे ओवरराइट कर रहा है।

अप्रत्याशित व्यवहार को रोकने के लिए मैं शायद एक 'उचित' तरीके से पुनर्लेखन को फिर से परिभाषित करूँगा

<global>
    <models>
        <mage_core>
            <rewrite>
                <sth>Mage_Core_Model_Sth</sth>
            </rewrite>
        </mage_core>
    </models>
</global>

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

लेकिन अपने तरीके को साबित करने के लिए यहां कोई भी कठिन प्रमाण त्रुटियों का कारण नहीं होगा :)

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