Magento 2 में एक सार वर्ग के लिए एक नई विधि जोड़ना


16

जैसे इस सूत्र ने कहा: मैगेंटो 2 में Magento 2 में ओवरराइड सार वर्ग ,

मैं बस एक नया वर्ग बना सकता हूं। Magento 2 में, हमें प्लगइन्स का उपयोग करने की आवश्यकता है, लेकिन प्लगइन्स मुझे केवल मौजूदा अस्तित्व मोड में बदलने की अनुमति देते हैं। अगर मुझे कोई नया तरीका जोड़ना है तो मुझे क्या करना होगा?

उदाहरण:

इस वर्ग में vendor/magento/module-ui/Component/AbstractComponent.php, घटकों की एक सरणी होती है: $componentsउस सरणी के लिए तत्वों को हटाने / हटाने का कोई कार्य नहीं होता है। तो मैं उस फ़ंक्शन को कैसे बना सकता हूं?

जवाबों:


0

मैं यह नहीं देखता कि आप क्लास को पूरी तरह से ओवरराइड किए बिना कैसे कर सकते हैं। अपने उदाहरण के मामले में, आप XML में "डेटा" तर्क के लिए "अक्षम" आइटम सेट करके व्यक्तिगत घटकों को अक्षम कर सकते हैं। उदाहरण के लिए:

<?xml version="1.0" encoding="UTF-8"?>

<form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Ui:etc/ui_configuration.xsd">
    <fieldset name="general">
        <field name="title">
            <argument name="data" xsi:type="array">
                <item name="disabled" xsi:type="boolean">true</item>
            </argument>
        </field>
    </fieldset>
</form>

यह $componentsसरणी से 'शीर्षक' को प्रभावी रूप से हटाता है ।

यह वर्ग createChildComponentमें विधि के कारण है Magento\Framework\View\Element\UiComponentFactory:

 protected function createChildComponent(
        array $bundleComponents,
        ContextInterface $renderContext,
        $identifier
    ) {
        list($className, $arguments) = $this->argumentsResolver($identifier, $bundleComponents);
        if (isset($arguments['data']['disabled']) && (int)$arguments['data']['disabled']) {
            return null;
        }
        $components = [];
        foreach ($bundleComponents['children'] as $childrenIdentifier => $childrenData) {
            $children = $this->createChildComponent(
                $childrenData,
                $renderContext,
                $childrenIdentifier
            );
            $components[$childrenIdentifier] = $children;
        }
        $components = array_filter($components);
        $arguments['components'] = $components;
        if (!isset($arguments['context'])) {
            $arguments['context'] = $renderContext;
        }

        return $this->objectManager->create($className, $arguments);
    }

यह वह नहीं है जो मैं खोज रहा हूं ... मैं एक सार वर्ग में नए तरीके जोड़ने का तरीका चाहता हूं ... यह सिर्फ एक उदाहरण है ... उदाहरण के लिए, अगर मैं गतिशील रूप से तत्वों को निकालना चाहता हूं तो क्या होगा? अपनी टिप्पणी में आप "पूरा ओवरराइडिंग" का उल्लेख करते हैं कि आप कैसे करते हैं ??
मत्ती

फिर आपको अपने नए तरीकों को एक वर्ग में परिभाषित करने की आवश्यकता होगी जो अमूर्त वर्ग का विस्तार करता है और फिर अमूर्त वर्ग के उपवर्गों के लिए कक्षाएं बनाता है जो बदले में आपकी कक्षा से प्राप्त करता है और di.xml में वरीयताएँ निर्धारित करता है। मेरा मतलब है कि 'पूरी तरह से वर्ग को पछाड़कर।' मैं एक उदाहरण दिखाने की कोशिश कर रहा था कि ऐसा करने से कैसे बचा जाए।
आरोन एलन

हां, मैं आपको समझता हूं ... लेकिन समाधान बिल्कुल भी कम नहीं है ... मुझे विश्वास नहीं हो सकता है कि एम 2 ने अमूर्त कक्षाओं को ओवरराइड करने की संभावना को हटा दिया ... मुझे लगा कि वे इसे हटाने के बजाय इसे सुधारने जा रहे हैं .. ।
मत्ती


0

समुदाय या स्थानीय निर्देशिका के माध्यम से ऑटोलैडर में एम 1 में एक वर्ग को ओवरलोड करना (जैसे कि आपके द्वारा जुड़े प्रश्न में सुझाव दिया गया है) को एम 1 में बहुत अच्छे कारणों से बुरा अभ्यास माना जाता था।

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

वास्तव में, मैं किसी भी usecase के बारे में नहीं सोच सकता, जहां आपको वास्तव में एक अमूर्त वर्ग के तरीकों को जोड़ने की जरूरत है, क्योंकि आप हमेशा अपने स्वयं के तर्क को एक वर्ग में जोड़ सकते हैं इसे एक प्लगइन / पर्यवेक्षक / viewModel / xml कॉन्फ़िगरेशन में एकीकृत कर सकते हैं

सबसे अच्छा तरीका होगा, एक नए वर्ग की शुरुआत करना जो आपके विशिष्ट उपयोग के मामले में अमूर्त वर्ग का विस्तार करता है और फिर जहाँ आवश्यक हो, अपनी कक्षा का उपयोग करें।

यदि आपको यूआई घटक से तत्वों को हटाने की आवश्यकता है, तो लेआउट प्रोसेसर के माध्यम से लेआउट / प्लगइन के माध्यम से इसे करने के लिए एक बेहतर तरीका है।

इसलिए यदि आप अपने विशिष्ट usecase का वर्णन करते हैं तो इसका बेहतर उत्तर हो सकता है।


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

एक दूसरा उपयोग मामला हो सकता है, यदि आप टिकट में जो कहना चाहते हैं, उस सरणी से तत्वों को परेशान / हटा दें (उदाहरण के रूप में देखें), आप किसी अन्य चीज़ पर सोच सकते हैं ... आपको एक नया फ़ंक्शन बनाने की आवश्यकता है अमूर्त वर्ग में, अन्यथा, आप प्रत्येक वर्ग में एक ही फ़ंक्शन बनाने के लिए मजबूर होंगे जो फैली हुई है, और वह फिर से स्केलेबल नहीं है ... और सबसे खराब, क्योंकि Magento कोर में चर संरक्षित होने के बजाय निजी हैं, इसलिए मध्यम केवल एक तरीका यह है कि अमूर्त वर्ग में एक विधि को जोड़ा जाए ...
मत्ती

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

Btw यह अभी भी Magento2 में संभव है क्योंकि आप संगीतकार ऑटोलैडर को हेरफेर कर सकते हैं, लेकिन अत्यधिक हतोत्साहित हैं क्योंकि आपको अपडेट के बारे में समस्या होगी magento.stackexchange.com/questions/164455/…
डेविड वेरिएंट

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