ম্যাজেন্টো 2-এ অ্যাবস্ট্রাক্ট ক্লাস ওভাররাইড করুন


13

ম্যাজেন্টো 1 তে আমি স্থানীয় বা সম্প্রদায় ডিরেক্টরিতে বিমূর্ত ক্লাসটি অনুলিপি করতে পারি এবং ম্যাগেন্টো এটি ব্যবহার করে, যখন অটোলোড এই ক্লাসটি লোড করে।

এর পরিবর্তে আমার ক্লাসে ম্যাজেন্টো লোড করার কোনও সমাধান আছে vendor/magento/framework/Model/AbstractModel.php?

di.xmlবিমূর্ত শ্রেণীর জন্য পছন্দগুলি কাজ করে না। শুধুমাত্র প্লাগইনস?

উত্তর:


9

শুধুমাত্র প্লাগইনস?

হ্যাঁ. আপনি বিমূর্ত ক্লাসগুলির জন্য প্লাগইন লিখতে পারেন এবং সম্ভব হলে প্লাগিনগুলি সর্বদা পছন্দগুলির চেয়ে বেশি পছন্দ করা উচিত।

আপনি যদি কোনও বাস্তবায়ন প্রতিস্থাপন করতে চান তবে পছন্দগুলি কার্যকর। AbstractModelযদি এমন যুক্তিযুক্তভাবে সম্ভব হয় তবে প্রসারিত সমস্ত মডেলের প্রয়োগ বাস্তবায়নের জন্য আমি কোনও ব্যবহারের ক্ষেত্রে ভাবতে পারি না । সুতরাং আপনি সম্ভবত যা চান তা হ'ল কার্যকারিতা যুক্ত করা বা পরিবর্তন করা এবং এটি প্লাগইনগুলির জন্য।


1
হাই, এই ক্ষেত্রে আমি কীভাবে বিমূর্ত শ্রেণীর থেকে সুরক্ষিত ফাংশনটিকে ওভাররাইড করতে পারি? আপনি দয়া করে সাহায্য করতে পারেন
মনশভি বিড়লা

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

1
"আমি অ্যাবস্ট্রাকমোডেল প্রসারিত সমস্ত মডেলের বাস্তবায়ন প্রতিস্থাপনের জন্য কোনও ব্যবহারের ক্ষেত্রে ভাবতে পারি না" আমার এই ধরনের ব্যবহারের একটি মামলা রয়েছে: আমার কাছে পেমেন্ট মডিউল রয়েছে, যা 4 টি নিয়ন্ত্রকের জন্য অ্যাবস্ট্রাক্ট বেস ক্লাস ব্যবহার করে, প্রত্যেকে যাচাই করার জন্য বেস থেকে একটি পদ্ধতি ব্যবহার করে পেমেন্ট গেটওয়ে থেকে প্রতিক্রিয়া। এখন, প্রতিক্রিয়া বদলেছে এবং আমাকে সমস্ত 3. পরিবর্তন করতে হবে
তেরো লাহ্তিনেন

6

সম্পূর্ণ সমাধান: ম্যাজেন্টো তাদের অটোলাড করার আগে প্রতিস্থাপন করা ক্লাস অন্তর্ভুক্ত করুন। তাই ধাপে ধাপে:

  1. ফাইলটিতে app/etc/NonComposerComponentRegistration.phpসারি যুক্ত করুন

    $pathList[] = dirname(__DIR__) . '/etc/ClassReplacer.php';
  2. ইন app/etcজায়গা ফাইল ClassReplacer.phpকন্টেন্ট সঙ্গে

    class ClassReplacer
    {
        public function includeReplacedFiles($src)
        {
            try {
                $replacedFiles = $this->listDir($src, false, true);
                foreach ($replacedFiles as $replacedFile) {
                    include_once $src . $replacedFile;
                }
            } catch (Exception $e) {
                return;
            }
        }
    
        protected function listDir($dir, $prependDir = false, $recursive = false, $entityRegexp = null, $currPath = '')
        {
            if (!is_dir($dir)) {
                return array();
            }
            $currPath = $prependDir ? $dir : $currPath;
            $currPath = $currPath !== '' ? rtrim($currPath, '/') . '/' : '';
            $files = array();
            foreach (scandir($dir) as $file) {
                if (in_array($file, array('.', '..'))) {
                    continue;
                }
                $entity = $currPath . $file;
                if ($recursive && is_dir("$dir/$file")) {
                    $files = array_merge($files, $this->listDir("$dir/$file", false, true, $entityRegexp, $entity . '/'));
                    continue;
                }
                if ($entityRegexp && !preg_match($entityRegexp, $entity)) continue;
                $files[] = $entity;
            }
            return $files;
        }
    }
    $replace = new ClassReplacer();
    $replace->includeReplacedFiles(dirname(__DIR__) . '/code/Magento/');
  3. app/code/Magentoকিছু শ্রেণীতে স্থান , যা প্রতিস্থাপন করা হবে, যেমনapp/code/Magento/Tax/Model/Calculation/AbstractAggregateCalculator.php



1
ডার্টি হ্যাক, তবে কিছু সময় এটি করতে সক্ষম হতে পারে helpful এম 1 এর মূল ক্লাসগুলিতে ম্যানুয়াল পরিবর্তন প্রয়োজন (সুতরাং অ্যাপ্লিকেশন / কোড / স্থানীয়ভাবে অনুলিপি করুন) যদি আপনি চালানের পিডিএফ দেখতে অন্যরকম দেখতে চান তবে আমি বাজি ধরছি যে এটির প্রয়োজন হবে এমন কিছু ক্ষেত্রে থাকবে।
জাফিরিন

5

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

আমাকে _processDownloadঅভ্যন্তরীন পদ্ধতিতে ওভাররাইড করতে হয়েছিল \Magento\Downloadable\Controller\Download, ভিতরে কিছু 'if-s' যুক্ত করা হয়েছিল। (কারও যদি ধারণা থাকে যে আমি প্লাগিনগুলি ব্যবহার করে কীভাবে এই অভ্যন্তরীণ পদ্ধতির মতো কিছু যুক্ত করতে পারি তবে আমি কৃতজ্ঞ হব)। ক্লাসটি বিমূর্ত হয় তাই পছন্দ কাজ করে নি। প্লাগইনগুলিও যেমন পদ্ধতিটি সুরক্ষিত। আমার যে জিনিসটি করতে হয়েছিল তা হ'ল Downloadঅগ্রাধিকারটি ব্যবহার করে সমস্ত শ্রেণি থেকে প্রসারিত over এই ক্লাসগুলি:

Magento\Downloadable\Controller\Download\Link Magento\Downloadable\Controller\Download\LinkSample Magento\Downloadable\Controller\Download\Sample

এবং তাদের অভ্যন্তরে প্যারেন্ট ক্লাস থেকে পুনর্লিখনের পদ্ধতিটি (যেটাকে আমি ওভাররাইড করার কথা বলেছিলাম)। সুতরাং আসলে ওভাররাইড পদ্ধতিগুলির কোডটি তিন জায়গায় অনুলিপি করা হয়েছিল এবং ঠিক একই ছিল exactly

এটি আদর্শ নয় তবে, কাজ করে।


4

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

আমি ম্যাজেন্টো \ রিপোর্টস \ ব্লক \ পণ্য \ অ্যাবস্ট্রাক্ট প্রোডাক্ট নামের নিচের সিনট্যাক্সটি ব্যবহার করে ক্লাস থেকে getItems সংগ্রহ সংগ্রহ নামে ফাংশনের জন্য প্লাগইন ব্যবহার করেছি :

ফাইল: অ্যাপ্লিকেশন \ কোড \ প্যাকেজ \ মডিউল \ ইত্যাদি on সম্মুখভাগ \ di.xML

<type name="Magento\Reports\Block\Product\AbstractProduct">
    <plugin name="Package_Module::aroundGetItemsCollection" type="Package\Module\Block\Viewed" sortOrder="20"/>
</type>

ফাইল: অ্যাপ্লিকেশন \ কোড \ প্যাকেজ \ মডিউল \ ব্লক \ ভিউড.এফপি

public function afterGetItemsCollection(
    $subject, $result
) {
    $result = $result->addAttributeToFilter('skip_hire_product', [['neq' => 1], ['null' => true]], 'left');
    return $result;
}

আপনি প্রায় পাশাপাশি প্লাগইনগুলির আগেও ব্যবহার করতে পারেন। আশা করি এই কাজটি আপনার জন্য।


1
আমি আমার প্রয়োজনের একটিতে উপরের কোডটি দিয়ে সাফল্য পেয়েছি, আসলে আমি ইমেল মডিউল বিমূর্ত শ্রেণির পদ্ধতিটির কিছু কার্যকারিতা পরিবর্তন করতে চেয়েছিলাম এবং প্লাগিন আমাকে এটি অর্জনে সহায়তা করেছে, ধন্যবাদ
ভর্তা শাস্ত্রী
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.