ম্যাজেন্টো 2 এ বিমূর্ত শ্রেণিতে একটি নতুন পদ্ধতি যুক্ত করা হচ্ছে


16

এই থ্রেডটি পছন্দ করে বলেছিল: ম্যাজেন্টো 1 তে ম্যাজেন্টো 2-অ্যাবস্ট্রাক্ট শ্রেণিকে ওভাররাইড করুন ,

আমি কেবল একটি সম্পূর্ণ নতুন ক্লাস তৈরি করতে পারি। ম্যাজেন্টো 2-এ, আমাদের প্লাগইন ব্যবহার করা দরকার, তবে প্লাগইনগুলি কেবলমাত্র বিদ্যমান বিদ্যমান পদ্ধতিগুলিকে সংশোধন করার অনুমতি দেয়। আমি কোনও নতুন পদ্ধতি যুক্ত করতে চাইলে আমাকে কী করতে হবে?

উদাহরণ:

এই শ্রেণিতে vendor/magento/module-ui/Component/AbstractComponent.phpউপাদানগুলির একটি অ্যারে রয়েছে:, অ্যারের জন্য উপাদানগুলি $componentsআনসেট / মোছার কোনও ফাংশন নেই। তাহলে আমি কীভাবে এই ফাংশনটি তৈরি করতে পারি?

উত্তর:


0

ক্লাসকে পুরোপুরি ওভাররাইড না করে আপনি কীভাবে এটি করতে পারবেন তা আমি দেখতে পাচ্ছি না। আপনার উদাহরণের ক্ষেত্রে, আপনি এক্সএমএলে "ডেটা" যুক্তিটিতে "অক্ষম" আইটেমটি সেট করে স্বতন্ত্র উপাদানগুলি অক্ষম করতে পারেন। এই ক্ষেত্রে:

<?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 এ খারাপ অভ্যাস হিসাবে বিবেচিত হয়েছিল।

মূল ক্লাসটি যদি জায়গাগুলিতে পরিবর্তিত হয় তবে আপনি আপনার ওভারলোডেড শ্রেণিতে বিবেচনা করেননি, তবে বেশিরভাগ ক্ষেত্রে আপনি আপনার ম্যাজেন্টো উদাহরণটি আপগ্রেড করার ক্ষমতা হারাবেন।

প্রকৃতপক্ষে, আমি কোনও ইউজকেস সম্পর্কে ভাবতে পারি না, যেখানে আপনাকে সত্যিই একটি বিমূর্ত ক্লাসে পদ্ধতি যুক্ত করা দরকার, যেহেতু আপনি সর্বদা নিজের যুক্তিকে নিজের শ্রেণিতে যুক্ত করতে পারেন এটি একটি প্লাগইন / পর্যবেক্ষক / ভিউমোডেল / এক্সএমএল কনফিগারেশনে সংহত করে

সর্বোত্তম উপায় হ'ল, একটি নতুন ক্লাস প্রবর্তন করা যা আপনার নির্দিষ্ট ব্যবহারের ক্ষেত্রে বিমূর্ত শ্রেণিকে প্রসারিত করে এবং তারপরে যেখানে প্রয়োজন সেখানে আপনার ক্লাসটি ব্যবহার করে।

আপনার যদি কোনও ইউআই উপাদান থেকে উপাদানগুলি অপসারণ করতে হয়, তবে লেআউট / লেআউট প্রসেসরের একটি প্লাগইন / জেএস ফাইলের প্রয়োজনীয় যে ফাইলটি প্রয়োজন তা পরিবর্তনের মাধ্যমে এটি করার আরও ভাল উপায় সম্ভবত রয়েছে।

সুতরাং আপনি যদি আপনার নির্দিষ্ট ব্যবহারের বর্ণনা বর্ণনা করেন তবে এর আরও উত্তম উত্তর হতে পারে।


আমি জানি, এটি করা একটি খারাপ অভ্যাস, তবে কমপক্ষে, আপনার এটি করার একটি উপায় আছে। উদাহরণস্বরূপ, আপনি যে লোড লোড প্রতিটি মডেলের জন্য একটি ক্যাশে যুক্ত করতে চান সেই ক্ষেত্রে বিবেচনা করুন। এটি অ্যাবস্ট্রাক্ট শ্রেণিতে লোড পদ্ধতিটি পরিবর্তন করে করা যেতে পারে এবং তারপরে এই পরিবর্তনটি সমস্ত শ্রেণিতে প্রচার করা হবে। আপনার যদি এটি না থাকে তবে আপনার কাছে থাকা প্রতিটি মডেলটি সংশোধন করতে হবে এবং এটি একেবারেই স্কেলযোগ্য নয়।
মাতিয়াস

দ্বিতীয় ব্যবহারের ক্ষেত্রে, আপনি যদি টিকিটে যা বলি তা করতে চান, সেই অ্যারে থেকে উপাদানগুলি আনসেট / মুছে ফেলতে চান (উদাহরণ হিসাবে বিবেচনা করুন), আপনি অন্য যে কোনও বিষয়ে ভাবতে পারেন ... আপনাকে একটি নতুন ফাংশন তৈরি করতে হবে বিমূর্ত শ্রেণিতে, অন্যথায়, আপনি প্রসারিত প্রতিটি শ্রেণিতে একই ফাংশন তৈরি করতে বাধ্য হবেন, এবং এটি আবার মোটেও স্কেবলযোগ্য নয় ... এবং সবচেয়ে খারাপ কারণ ম্যাগ্যান্টো কোরের ভেরিয়েবলগুলি সুরক্ষিত হওয়ার পরিবর্তে ব্যক্তিগত so এটি করার একমাত্র উপায় হ'ল বিমূর্ত শ্রেণিতে একটি পদ্ধতি যুক্ত করা ...
মাতিয়াস

প্রথম উদাহরণটি কেবল বিমূর্ত মডেলটিতে প্রায় একটি প্লাগইন যুক্ত করে প্রতি মডেল লোডের ফলাফলকে ক্যাশে করে একেবারে সহজ। অ্যাবস্ট্রাক্ট ক্লাসটি ওভারলোডিংয়ের পরে যা আরও ভাল হবে যা বিমূর্ত মডেলটি পরিবর্তিত হওয়ার সাথে সাথে ভবিষ্যতের প্রতিটি আপডেটকে ভেঙে ফেলবে। আপনার দ্বিতীয় "উদাহরণ" আমি আপনাকে এ সম্পর্কে অনেক কিছুই বলতে পারি না, কারণ আপনার আসল ব্যবহারের ঘটনাটি উল্লেখ না করে মূলত অ্যাবস্ট্রাক্ট ক্লাসে কোনও পদ্ধতি যুক্ত করার জন্য জিজ্ঞাসা করছেন
ডেভিড ভারহোলেন

বিটিডব্লিউ এখনও এটি ম্যাজেন্টো 2 এ সম্ভব কারণ আপনি রচয়িতা অটোলোডারকে হেরফের করতে পারেন তবে অত্যন্ত নিরুৎসাহিত হবেন কারণ আপনার সাথে আপডেটগুলি রয়েছে magento.stackex بدل.com
ডেভিড ভারহোলেন

That's না একটি বিকল্প
Matias
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.