আমি কীভাবে ম্যাজেন্টো 1 তে একটি ব্লক শ্রেণিকে ওভাররাইড / পুনর্লিখন করব?


12

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

আরও দেখুন: ম্যাজেন্টো 1 ওভাররাইডগুলি সম্পর্কে প্রমিত প্রশ্নগুলির সন্ধান করছেন

ধরা যাক, আমাকে একটি কাস্টম মডিউলটিতে (একটি পদ্ধতি পরিবর্তন বা পদ্ধতি যুক্ত করতে) একটি ব্লক শ্রেণিতে পরিবর্তন করতে হবে। ধাপে ধাপে আমি কীভাবে এটি করব?

উত্তর:


23

প্রতিটি ব্লক, বা গ্রুপের গ্রুপগুলি config.xmlএই জাতীয় মডিউলের ( <global>ট্যাগের অভ্যন্তরে) ফাইলে ঘোষিত হয় ।
ক্যাটালগ মডিউলটির একটি উদাহরণ এখানে

    <blocks><!-- marks definition of a block group -->
        <catalog><!-- unique alias for blocks in the module -->
            <class>Mage_Catalog_Block</class><!-- class prefix for all blocks -->
        </catalog>
    </blocks>

এর অর্থ হ'ল একটি ব্লকটি উপসটি থেকে শুরু করে বাকী ক্লাসের পথটি catalog/class_name_hereযেখানে উলাম ব্যবহার করে তা ইনস্ট্যান্ট করা যেতে পারে class_name_here
এর অর্থ catalog/class_name_hereডিফল্টরূপে ম্যাপ করা হবে Mage_Catalog_Block_Class_Name_Here

একটি ব্লক পুনর্লিখনের জন্য আপনাকে এমন একটি মডিউল তৈরি করতে হবে যা আপনি Magento_Catalogআমার উদাহরণে ( ) পরিবর্তন করার চেষ্টা করছেন সেই মডিউলের উপর নির্ভর করে ।
এবং আপনাকে config.xmlএটি <global>ট্যাগের আওতায় যুক্ত করতে হবে ।

<blocks>
    <catalog><!-- alias of the block group you are rewriting -->
        <rewrite><!-- reserved tag: specify that you are rewriting something -->
             <class_name_here>YourNamespace_YourModule_Block_Your_New_Class_Here</class_name_here> <!-- tag: the rest of the alias of the class you are rewriting. value: the name of your class that rewrites the core class -->
        </rewrite>
    </catalog>
</blocks>

তারপরে ক্লাস তৈরি করুন YourNamespace_YourModule_Block_Your_New_Class_Here(জেডএফ ফোল্ডার কাঠামো অনুসরণ করে) এবং এই ক্লাসটি মূল বর্গকে বাড়িয়ে দিন।

class YourNamespace_YourModule_Block_Your_New_Class_Here extends Mage_Catalog_Block_Class_Name_Here
{
    //your awesome code here
}

আপনার হয়ে গেলে, সংকলনটি অক্ষম করুন এবং এটি আবার সক্ষম করুন (যদি প্রয়োজন হয়) এবং ক্যাশে সাফ করুন।

এটি বিমূর্ত ব্লকের জন্য কাজ করবে না।
এটি কেবল ক্লাসগুলির জন্য কাজ করে যা তাত্ক্ষণিকভাবে কাজ করে।

উদাহরণ

এর অনুমান করা যে আপনার ফাইল পুনর্লিখন চান অ্যাপ্লিকেশন \ কোড \ কোর \ পুরোনো যাদুকর \ ক্যাটালগ \ ব্লক \ পণ্যের \ দেখুন \ বিকল্প \ টাইপ \ Select.php যা বর্গ হয়েছে Mage_Catalog_Block_Product_View_Options_Type_Selectআপনার নিজের মডিউলে Marius_Test

তারপরে আপনার এই প্রবেশের প্রয়োজন হবে আপনার config.xml:

<blocks>
    <catalog>
        <rewrite>
            <product_view_options_type_select>Marius_Test_Block_Catalog_Block_Product_View_Options_Type_Select</product_view_options_type_select>
        </rewrite>
    </catalog>
</blocks>

অ্যাপ্লিকেশন \ কোড \ স্থানীয় \ Marius \ টেস্ট \ ব্লক \ ক্যাটালগ \ পণ্যের \ দেখুন \ বিকল্প \ টাইপ \ Select.php :

class Marius_Test_Block_Catalog_Product_View_Options_Type_Select extends Mage_Catalog_Block_Product_View_Options_Type_Select
{
    //your awesome code here
}

কাজ করে না. আমি বর্গ ওভাররাইট চেষ্টা Mage_Catalog_Block_Product_View_Options_Type_Selectমধ্যে \ কোড \ স্থানীয় \ WR \ EPO \ ব্লক \ ক্যাটালগ \ ব্লক \ পণ্যের \ দেখুন \ বিকল্প \ টাইপ \ Select.php অ্যাপ্লিকেশন । আমি এটির মতো চেষ্টা করেছিলাম: কোডেপেন.আইও
কালো

এবং যদি এটি কাজ করে না, আপনি ভাবেন যে আমার উত্তরটি ভুল তাই আপনি সম্ভবত কিছু ভুল করছেন বলে ভাবার পরিবর্তে আপনি এটিকে নীচে নামিয়ে দিন। যাইহোক ... এটির <Mage_Catalog_Block_Product_View_Options_Type_Select> WR_EPO_Block_Catalog_Block_Product_View_Options_Type_Select </Mage_Catalog_Block_Product_View_Options_Type_Select>সাথে প্রতিস্থাপন করুন <product_view_options_type_select>WR_EPO_Block_Catalog_Block_Product_View_Options_Type_Select</product_view_options_type_select>এবং নিশ্চিত করুন যে ভিতরে কোনও স্থান নেইproduct_view_options_type_select
মারিয়াস

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

আপনি যদি ধাপে ধাপে এটি পড়েন তবে আপনি একটি পদক্ষেপ মিস করেছেন। আমি যেখানে ক্লাস ওরফে কী তা ব্যাখ্যা করি। আপনি যদি কেবল পেস্ট প্রতিস্থাপনের অনুলিপি করেন তবে আপনি এটি কাজ করতে পারবেন। 17 জন বুঝেছেন। আমি মনে করি আমি এটি সঠিকভাবে ব্যাখ্যা করেছি
মারিয়াস

হ্যাঁ, তবে একটি ভাল উদাহরণ নিখোঁজ রয়েছে সুতরাং আমরা নিশ্চিত করতে পারি যে আমরা আপনার তত্ত্বটি সঠিকভাবে বুঝতে
কালো

4

আমার দৃষ্টিভঙ্গির ওভাররাইড এবং এই দুটি পুনর্লিখন পৃথক জিনিস,

অগ্রাহ্য করা:

আমরা যখন ডিজাইন ফালব্যাক প্রক্রিয়া ব্যবহার করি তখন আমরা ওভাররাইড করছি

লেখা:

আমরা যখন আমাদের ক্লাসে ম্যাজেন্টো কোর ক্লাসগুলি পুনরায় লিখি তখন আমরা পুনর্লিখন করি।

1) ওভাররাইডের উদাহরণ:

যদি আমার app/code/core/Mage/Catalog/Block/Product/List.phpফাইলটি ওভাররাইড করতে হয় তবে আমি নীচে দেখানো একই পাথ দিয়ে আমার স্থানীয় মডিউলটিতে অনুলিপি করছিapp/code/local/Mage/Catalog/Block/Product/List.php

এটি ম্যাজেন্টো দ্বারা প্রস্তাবিত নয় তবে আপনি সেভাবে করতে পারেন।

2) পুনর্লিখনের উদাহরণ:

আমি যদি এই ব্লক ক্লাসটি Mage_Adminhtml_Block_Sales_Order_Createআবার লিখতে চাই তবে নীচে আমার মডিউল কনফিগারেশন.এক্সএমএল এ কোড করি

    <global>
        <blocks>
            <adminhtml>
                <rewrite>

                    <sales_order_create>Trimantra_Smallchanges_Block_Adminhtml_Sales_Order_Create</sales_order_create>
                </rewrite>
            </adminhtml>
        </blocks>
    </global>

এবং আমার ক্লাসে Trimantra_Smallchanges_Block_Adminhtml_Sales_Order_Create

আমি নীচের মত কোড

class Trimantra_Smallchanges_Block_Adminhtml_Sales_Order_Create extends Mage_Adminhtml_Block_Sales_Order_Create {
      My Function Or funcions That I want to Rewrite..
}

2

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

সম্ভাব্য সমস্যা 1: আপনি বা অন্য রক্ষণাবেক্ষণকারীরা মাগেন্তোর উত্স ফাইলগুলি আপডেট করবেন তখন পুনরায় লিখিত টেম্পলেট আপডেট হবে না। সুরক্ষা ফিক্স বা উন্নতি আপনার কোডে প্রয়োগ হবে না। একই সাথে ব্লক সহ অন্যান্য পুনঃ লিখিত ক্লাসগুলিতে প্রযোজ্য, তবে কতটা পুনর্লিখন করা হয়েছিল তার উপর নির্ভর করে (নীচে দেখুন)।

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

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

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

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