যখন কোনও এক্সটেনশন বিশ্বব্যাপী কোনও শ্রেণিকে ওভাররাইট করে এবং আমি মূলটি ব্যবহার করতে চাই তখন আমি কী করব?


42

আমরা এমন একটি এক্সটেনশন ব্যবহার করছি যা বিশ্বব্যাপী ম্যাগ_গ্যাটালগ_ব্লক_প্রডাক্ট_লিস্ট_তুলবার ব্লকটিকে ওভাররাইট করে।

<global>
    <blocks>
        <catalog>
            <rewrite>
                <product_list_toolbar>Amasty_Shopby_Block_Catalog_Product_List_Toolbar</product_list_toolbar>
            </rewrite>
        </catalog>
    </blocks>
</global>

প্রসারিত স্তরযুক্ত নেভিগেশন বিভাগের প্রসঙ্গে কাজ করার সময়, আমরা যখন নিজের ঘরে থাকা মডিউলটিতে অন্য (কাস্টম) দৃশ্যে একটি স্বেচ্ছাসেবী পণ্য তালিকা সন্নিবেশ করি তখন পুনরায় লিখিত শ্রেণিটি সঠিকভাবে কাজ করে না। আমরা যদি কেবল পরীক্ষার উদ্দেশ্যে এক্সটেনশানটি ওভাররাইট করে নিয়ে যাই তবে সবকিছু ঠিকঠাক কাজ করে।

এক্সটেনশান বিকাশকারীর সম্প্রদায় কোডটি সম্পাদনা না করে আমরা কীভাবে কেবলমাত্র আমাদের নিজস্ব নিয়ামকের জন্য কোনও এক্সটেনশনের পুনরায় লেখাকে পূর্বাবস্থায় ফেরাতে পারি?


2
আপনি যদি শ্রেণিটি পরিবর্তন করেন তবে আপনি সম্ভবত শপবি এক্সটেনশনটি ভেঙে ফেলবেন তবে ... কখনও চেষ্টা করেননি তবে আপনি সম্ভবত নিজের এক্সটেনশনে সেই এক্সটেনশন ক্লাসটি আবার লিখতে চাইতে পারেন আপনার_এক্সটেনশন_ব্লক_কিগ্যাল_প্রডাক্ট_লিস্ট_ুলবার এমাস্টি_শপবি_ব্লক_কিগ্যাল_এল_প্রডাক্ট_লিস্ট_তুলবার
স্যান্ডার

আমি যা বলতে পারি তা থেকে, ম্যাজেন্টো কেবলমাত্র <rewrite>প্রতি ক্লাসে একজনকে অনুমতি দেয় , তবে যদিও আমি নিজের ক্লাসটি মূল শ্রেণীর প্রসারিত করে তৈরি করতে পারি, তবে আমি নিশ্চিত না যে আমি কীভাবে এটি getBlock('catalog/product_list_toolbar')কারখানার পদ্ধতিতে কাজ করতে পারি ।
অ্যারন পোলক

যদি একটি payed এক্সটেনশান আপনি Amasty সমর্থন, বাগ হিসাবে এই বর্ণন সাথে যোগাযোগ করা উচিত
Fra

আপনি সমস্যাটি চিহ্নিত করতে পরিচালনা করেছেন? আপনি কী সমস্যার মুখোমুখি হচ্ছেন (বর্ধিত শ্রেণিতে কোনটি কাজ করে)?
ফ্লোরিনেলচিসি

1
অ্যারোনপলক সম্ভবত হতে পারে, তবে এই সমস্যাটি এখনও এমন একটি এক্সটেনশান থেকে উত্থিত হতে পারে যা জিনিসগুলি যেমন প্রয়োজন ঠিক তেমনভাবে ওভাররাইট করে। সম্ভবত আমরা উত্তরাধিকারের মডেলটি নিজেই পরীক্ষা করে নেওয়া ভাল। হতে পারে মিক্সিনস বা বৈশিষ্ট্যগুলি সাহায্য করবে।
kojiro

উত্তর:


25

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

পদক্ষেপ 1 পুনরায় লেখার কাজটি পূর্বাবস্থায় ফেরাচ্ছে। রানটাইমটিতে ম্যাজেন্টো কনফিগারেশন ট্রি পরিবর্তন করা যেতে পারে। সুতরাং, যদি আপনি নিম্নলিখিত কোডটি চালান

$config = Mage::getConfig();        
$config->setNode(
    'global/blocks/catalog/rewrite/product_list_toolbar',
    'Mage_Catalog_Block_Product_List_Toolbar'
);

তারপরে ম্যাজেন্টো Mage_Catalog_Block_Product_List_Toolbarঅনুরোধের বাকী অংশের জন্য মূল ব্লকটি ইনস্ট্যান্ট করবে ।

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

protected function _undoRewrites()
{
    $config = Mage::getConfig();        
    $config->setNode(
        'global/blocks/catalog/rewrite/product_list_toolbar',
        'Mage_Catalog_Block_Product_List_Toolbar'
    );    
}

এবং তারপরে আপনার প্রতিটি ক্রিয়াকলাপের শুরুতে এই পদ্ধতিটি কল করুন

public function indexAction()
{
    $this->_undoRewrites();
    $test = Mage::getSingleton('core/layout')->createBlock('catalog/product_list_toolbar');        
    var_dump($test);
}

এটি একটু আড়ম্বরপূর্ণ বলে মনে হতে পারে তবে আপনি মনে করেন যে আপনি যখন ম্যাজেন্টোর সিস্টেমে অবজেক্টের সাথে চালাক হচ্ছেন তখন আড়ম্বরপূর্ণ হওয়া (অর্থাত্ প্রকট) হওয়া ভাল idea এর জন্য আর একটি জায়গা হতে পারে ঘটনা controller_action_predispatchবা controller_action_predispatch_front_controller_actionইভেন্ট এবং / অথবা শর্তযুক্ত প্রয়োগ করা যেতে পারে ।

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


19

সমাধান 1:
আপনি আপনার নিয়ামকের মাধ্যমে ক্লাসটি সরাসরি (পিএইচপি উপায়) ইনস্ট্যান্ট করার চেষ্টা করতে পারেন

পরিবর্তে

$this->getLayout()->createBlock('catalog/product_list_toolbar');

কিছুটা এইরকম:

$block = New Magento_Catalog_Product_List_Toolbar;
$this->getLayout()->addBlock(....);

সমাধান 2:
আরেকটি পদ্ধতি হ'ল আপনার মডিউলে একটি নতুন শ্রেণি তৈরি করা হবে যা মূল বর্গকে প্রসারিত করে এবং সেটিকে ব্যবহার করবে।

সমাধান 3:
অন্যথায় যদি এক্সটেনশানটি ক্রিপ্ট না করা হয় (আমরা সকলেই ওপেন সোর্স পছন্দ করি :) এটি আপনার জিনিস কেন ভাঙে তা জানার চেষ্টা করতে পারেন


সমাধান 2 কাজ করে (বাস্তববাদী সমাধান) তবে এটি দুর্দান্ত নয় যে আমি rewriteএকই বেস শ্রেণিতে দ্বিতীয়টি করতে পারি না । অতএব কারখানার পদ্ধতিটি কার্যকর হবে না (আপনি এটি ইতিমধ্যে মনে করেন এটি বুঝতে পেরেছেন)। এটি করার কোনও ম্যাজেন্টো উপায় নেই, তবে এর থেকে আরও ভাল উপায় আছে কিনা তা দেখার জন্য আমরা কিছুটা চেষ্টা করি।
অ্যারন পোলক

সমাধান 2 হ'ল আমি কী নিয়ে যাব ... আমি ফ্রান্সেস্কোর উত্তর না পাওয়া পর্যন্ত এই পরামর্শ দেওয়ার জন্য প্রস্তুত ছিলাম। ;)
ডেভিডালগার

1
যদিও আমি সমাধান 2 টি সর্বোত্তম, দ্রষ্টব্য 1 টি নোটটি পছন্দ করি: আপনি তৈরি ব্লকটিতে সম্পূর্ণ শ্রেণির নামও সরবরাহ করতে পারেন ( $this->getLayout()->createBlock("Mage_Catalog_Block_Product_List_Toolbar")যখন আপনি কোনও ব্লক শ্রেণির প্রসঙ্গে আছেন)। যদি /প্যারামিটারে কিছু না থাকে তবে ম্যাজেন্টো ক্লাসটি অনুসন্ধান করার জন্য স্ট্রিংটি ব্যবহার করবে।
ম্যাথিয়াস জেইস

1
অ্যারন পোলক, আপনি একই বেস শ্রেণিতে দ্বিতীয় পুনর্লিখন করতে পারেন। মডিউলের নেমস্পেসের নাম কেবল জেড (A এর পরে যে কোনও অক্ষর) রাখুন এবং ম্যাজেন্টো এটি Amasty এর পরিবর্তে ব্যবহার করবে।
অমাস্টি

5

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

  1. আপনার নিজস্ব একটি নতুন এক্সটেনশন তৈরি করুন।
  2. লেখা catalog/product_list_toolbarআপনার এক্সটেনশন দিয়ে
  3. আপনার ব্লকটি Mage_Catalog_Block_Product_List_Toolbarঅ্যামাস্টি শ্রেণির পরিবর্তে প্রসারিত করুন।
  4. আপনার ক্লাসটি উদারভাবে মন্তব্য করে ব্যাখ্যা করুন যে এই পুনর্লিখনের বিরোধটি ইচ্ছাকৃত। আপনি চাইছেন না এমন অন্য বিকাশকারী যিনি MageRun চালান আপনার সদ্য তৈরি হওয়া পুনর্লিখনের বিরোধটি চেষ্টা করতে এবং "ঠিক করতে" পারেন।
  5. আপনার এক্সটেনশানটি Amasty এর পরে লোড হচ্ছে কিনা তা নিশ্চিত করতে আপনার এক্সটেনশনের অ্যাপ্লিকেশন / ইত্যাদি / মডিউল / blah.xML ফাইলে নির্ভরতা যুক্ত করুন।

1

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

Mage::getModel('Mage_Catalog_Block_Product_List_Toolbar');

সাইড নোটে, আমি বিশ্বাস করি এটি Magento2 এ ক্লাস লোড করার মানক উপায় way


1

আমি ভয় করি এমন এক্সটেনশন কোডটিতে আপনার কিছুটা পরিবর্তন করা দরকার। ক্লাসটি config.xmlআর নিজের হাতে নতুন করে লিখবেন না, কেবল পরিবর্তিত Amasty_Shopby_Block_Catalog_Product_List_Toolbarকরুন আপনার ক্লাসটি প্রসারিত করুন যা ঘুরে দাঁড়াবে Mage_Catalog_Block_Product_List_Toolbar


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

এটি একটি খারাপ অভ্যাস। বাহ্যিক মডিউলগুলি সর্বদা অচ্ছুত হওয়া উচিত। আপনার যদি মডিউলটি আপডেট করতে হয় তবে আপনাকে নতুন সংস্করণে আপনার সমস্ত পরিবর্তন পুনরায় করা দরকার। এটি রক্ষণাবেক্ষণের ক্ষেত্রে একটি দুঃস্বপ্ন হয়ে উঠতে পারে।
মাইকেল টার্ক

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