कोर कक्षाओं को ओवरराइड कैसे करें?


20

कभी-कभी अधिक कार्यक्षमता पाने के लिए या कुछ अन्य प्रकार के कार्य करने के लिए कोर कक्षाओं को ओवरराइड करने की आवश्यकता होती है। क्या कोर कक्षाओं को ओवरराइड करने का कोई तरीका है? अगर यह मुमकिन है तो मैं किन मुद्दों का सामना करके उन्हें पछाड़ सकता हूं?


1
यह बहुत अच्छा होगा यदि आप इसे थोड़ा अधिक विशिष्ट बनाने या स्पष्ट समस्या का वर्णन करने के लिए अपने प्रश्न को परिष्कृत कर सकते हैं।
वैलेंटाइन देस्पा

जूमला 3 उपयोगकर्ताओं के लिए - इनकी जाँच करें। यह तुम्हे मदद करेगा। joomla.stackexchange.com/questions/5449/... प्लगइन - github.com/ghazal/plg_mvcoverride धन्यवाद joomla.stackexchange.com/users/270/ghazal
चा

जवाबों:


16

हाँ यह संभव है।

आप कक्षाओं को ओवरराइड करने के लिए एक सिस्टम प्लगइन का उपयोग कर सकते हैं, कृपया इस लिंक और इस और इसे पढ़ें

दो समस्याओं का सामना करना पड़ेगा:

  1. आपको पूरी कक्षा को ओवरराइड करने की ज़रूरत है (न कि इसके कुछ हिस्सों को)

  2. यदि कोर अपडेट किया गया है और क्लास भी अपडेट / बदल गया है, तो आपको अपना ओवरराइड (यदि आवश्यक हो) अपडेट करना होगा।


4
यह उपयोगी होगा यदि आप दिए गए लिंक से प्रासंगिक चरणों को चिपका सकते हैं, या कम से कम लिंक का विवरण दे सकते हैं, यदि वे चलते हैं या बदलते हैं।
कोडिंगहैंड्स

10

मैंने थोड़ी देर पहले एक प्लगइन बनाया था जो आपको कोर कक्षाओं को ओवरराइड करने की अनुमति देता है, लेकिन यह अभी भी उन समस्याओं का शिकार है जो @jackJoe ने अपने जवाब में बताया। हालांकि, यह आपको ओवरराइड्स को सफाई से करने की अनुमति देता है।

https://gist.github.com/dongilbert/3237387


7
बस यह कहना चाहता हूं कि यह समाधान खूबसूरती से काम करता है, और डॉन ओपन सोर्स की एक सच्ची दयालु भावना है - उससे और उसके काम से नफरत करता है !!!
जीडीपी

आपकी सरल स्क्रिप्ट के साथ एक पर्याप्त समस्या है, यह है कि यह घटकों को प्रीलोड नहीं करता है। इसलिए, यदि आप घटकों को ओवरराइड करते हैं, तो यह वास्तव में उनमें से अधिकांश (जैसे com_content घटक) के लिए काम नहीं करता है। यह अच्छी तरह से काम करता है, लेकिन इसे घटक को पहले से लोड करना होगा ताकि यह उन्हें ओवरराइड कर सके (आप ऐसी किसी चीज़ को ओवरराइड नहीं कर सकते जो अभी तक घोषित नहीं की गई है)। ओह, और आपको कंस्ट्रक्टर में पूरी बात करने के बजाय onAfterRoute का उपयोग करना चाहिए। यदि आप जानना चाहते हैं कि इस टिप्पणी से मेरा क्या अभिप्राय है तो ओवरराइड करने का प्रयास करें components/com_content/models/articles.php
इटोक्टोपस


4

मैं बहुत लंबे समय से इस पर था और डॉन से वादा किया था कि एक बार जब मैं करूंगा तो इसके बारे में अधिक जानकारी दूंगा।

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

मुझे कभी भी पसंद नहीं आया जब डेवलपर्स वास्तव में जूमला डिफ़ॉल्ट वर्ग लेते हैं और इसके साथ गड़बड़ करते हैं, इसलिए मैं उस वर्ग का विस्तार करता हूं यदि मैं कर सकता हूं, तो कुछ ब्रेक लगाने के बजाय।

मेरी प्रक्रिया निम्नलिखित है।

  1. जिस कक्षा में मुझे ओवरराइड करने की आवश्यकता है, उसे प्राप्त करें
  2. इसे पढ़ें, वर्ग नाम बदलें, मेरे अस्थायी वर्ग फ़ोल्डर में नई फ़ाइल बनाएं
  3. मेरी कक्षा का संस्करण लोड करें
  4. लोड जूमला क्लास
  5. जूमला टेम्प्लेट और अंतिम जूमला घटक की तुलना में मेरे विस्तार की विधि को पंजीकृत करें, जो मेरे लोडर में ओवरराइड देखने के लिए फ़ंक्शन लोडप्लेट को बढ़ाती है

यहाँ छवि बल्कि http://prntscr.com/3d9syq है

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

if (($this->Input('option') == 'com_joomlaupdate' && $this->Input('task') == 'update.install') || ($this->Input('option') == 'com_joomlaupdate' && $this->Input('layout') == 'complete')) {

    JFolder::delete(JPATH_SITE . '/plugins/system/yjsg/includes/yjsgcore/classes/extend/classes/');
    JFolder::create(JPATH_SITE . '/plugins/system/yjsg/includes/yjsgcore/classes/extend/classes/');
    $indexContent = '';
    JFile::write(JPATH_SITE . '/plugins/system/yjsg/includes/yjsgcore/classes/extend/classes/index.html', $indexContent);
}

$YjsgJViewDefaultRead         = JPATH_LIBRARIES . '/legacy/view/legacy.php';
$YjsgJViewDefaultFile         = YJSGEXTEND . "classes" . YJDS . "Yjsg" . $isView . "Default" . $IsJversion . ".php";



    //extend JView library class

    if (!JFile::exists($YjsgJViewDefaultFile)) {
        $YjsgJViewDefault = JFile::read($YjsgJViewDefaultRead);
        $YjsgJViewDefault = str_replace('class ' . $isView, 'class Yjsg' . $isView . 'Default', $YjsgJViewDefault);
        JFile::write($YjsgJViewDefaultFile, $YjsgJViewDefault);
    }

    require_once($YjsgJViewDefaultFile);
    jimport('joomla.application.component.view');
    JLoader::register($isView, YJSGEXTEND . $IsJversion . '/component/view.php', true);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.