এক্সএমএল লেআউটে একাধিক বিন্যাস হ্যান্ডলগুলি লক্ষ্য করে


22

/custommodule/customer/infoনীচে 2columns-left.phtmlটেমপ্লেটটি rootনোডে লোড করছে এমন পথে আমার কাছে একটি কাস্টম নিয়ামক অ্যাক্সেস করা আছে :

<custommodule_customer_info>
    <reference name="root">
        <action method="setTemplate"><template>page/2columns-left.phtml</template></action>
    </reference>
</custommodule_customer_info>

আমি যা করতে চাই তা হ'ল লগ ইন না করা গ্রাহকদের জন্য মূল টেমপ্লেট আপডেট করা, যেমন:

<customer_logged_out>
    <custommodule_customer_info>
        <reference name="root">
            <action method="setTemplate"><template>page/1column.phtml</template></action>
        </reference>
    </custommodule_customer_info>
</customer_logged_out>

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

আমি ভেবেছিলাম যে নিম্নলিখিতগুলি দিয়ে আমি আমার কন্ট্রোলারের হ্যান্ডেলটিকে লক্ষ্য করতে পারি:

<customer_logged_out>
    <reference name="custommodule_customer_info">
        <reference name="root">
            <action method="setTemplate"><template>page/1column.phtml</template></action>
        </reference>
    </reference>
</customer_logged_out>

এটি প্রকৃতপক্ষে টেমপ্লেটটির সাথে মূল টেমপ্লেটটি আপডেট করে 1column.phtmlতবে এটি আমার referenceনোডে লক্ষ্যযুক্ত পৃষ্ঠার পরিবর্তে সমস্ত পৃষ্ঠাগুলি হিসাবে উপস্থিত বলে মনে হচ্ছে appears

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

- সম্পাদনা করুন - পরিষ্কার করার জন্য, এটি আসলে একটি তৃতীয় পক্ষের মডিউল।

উত্তর:


18

যেহেতু আপনি আপনার নিজের নিয়ন্ত্রক ব্যবহার করছেন আপনার কেবলমাত্র ডিফল্ট হ্যান্ডলগুলি ব্যবহার করার দরকার নেই। লগ ইন থাকা অবস্থার উপর ভিত্তি করে আপনি আপনার তথ্য পদ্ধতিতে যুক্ত করতে পারেন

 $this->getLayout()->getUpdate()->addHandle('mymodule_customer_info_logged_in');

অথবা

 $this->getLayout()->getUpdate()->addHandle('mymodule_customer_info_logged_out');

এবং তারপরে আপনার লেআউট.এক্সএমএল ফাইলের ব্যবহার

<mymodule_customer_info_logged_in>

এবং

<mymodule_customer_info_logged_out>

- নীচে আপনার সম্পাদনার পরে সংযোজন -

আপনি নিয়ামকটি সম্পাদনা করতে চান না তা দেখে (যেহেতু এটি একটি তৃতীয় পক্ষের এক্সটেনশন), আমি একটি পৃথক এক্সটেনশন তৈরি করব যা কেবলমাত্র নিয়ামক_অ্যাকশন_লেআউট_লোড_বরে পর্যবেক্ষণ করে

    $update = $observer->getEvent()->getLayout()->getUpdate();
    $handles = $update->getHandles();

    if (in_array('custommodule_customer_info', $handles)) {

        //code to add the custom handles based on login
    }

Snazzy। এটি আদর্শ নয়, তবে এটি তুলনামূলকভাবে পরিষ্কার সমাধান। আমি নীচে আমার অন্যান্য মন্তব্যে যেমন উল্লেখ করেছি, তৃতীয় পক্ষের মডিউলটি পরিবর্তনের দরকার নেই, তবে দেখে মনে হচ্ছে এখানে কোনও পছন্দ বেশি নেই। লজ্জাজনক, কারণ customer_logged_in/outহ্যান্ডলগুলি এত শক্তিশালী হতে পারে তবে তারা এই সীমাবদ্ধতার কারণে ঝিমঝিম হয়ে যায়।
pspahn

14

অ্যালান স্টর্ম এর অনুরূপ কিছুটির উত্তর দিয়েছেন:

/programming//a/5601579/1157493

কাস্টম লগ ইন হয়েছে কিনা তা যাচাই করার আপনার যুক্তিটি করতে আপনি কোনও সহায়ককে ব্যবহার করতে পারেন।

<action method="setTemplate">
    <template helper="mymodule/myhelper/switchTemplateIf"/>
</action>

এটি Mage::helper('mymodule/myhelper')->switchTemplateIf(); সেই সহায়কতে কল করবে আপনি টেম্পলেটটি স্যুইচ করার সিদ্ধান্ত নিতে পারেন বা কেবল এটি ঠিক রাখবেন।

আমি বিশ্বাস করি এটি returnযে ফাংশনে আপনি তা টেম্পলেট সেট করে ।

এটি দেখতে এমন কিছু লাগবে:

public function switchTemplateIf() {
    if (Mage::helper('customer')->isLoggedIn()) {
        return 'page/1column.phtml';
    } else {
        return 'page/2column-right.phtml';
    }
}

অপরীক্ষিত


আমারও এই চিন্তাভাবনা ছিল, তবে আমি কেবল মডিউলের অতিরিক্ত ক্লাসের উপর নির্ভর না করে এটি সম্পাদন করার জন্য মডিউলের লেআউট এক্সএমএলের উপর নির্ভর করতে হবে বলে আশাবাদী - "যদি এটি এক্সএমএলে করা যায় তবে এটি করুন" এক্সএমএলে, এটির প্রয়োজন না হলে অতিরিক্ত মডিউল সংস্থান তৈরি করবেন না "।
পিএসপাহ্ন

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

@ স্প্যাসন ফুমানের একটি ভাল বিকল্প সমাধান রয়েছে যা আমি আমার উপর পরামর্শ দেব। এর জন্য কম কোডিং দরকার!
রিক কুইপার্স

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

6

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

এক্সটেনশনের লিঙ্কটি এখানে- https://github.com/mridul89/ মাল্টিপেলহ্যান্ডলস. git

আপনি এটি এর মতো ব্যবহার করবেন-

<customer_logged_out ifhandle="custommodule_customer_info">
    <reference name="root">
        <action method="setTemplate"><template>page/1column.phtml</template></action>
    </reference>
</customer_logged_out>

customer_logged_outযদি custommodule_customer_infoলেআউট হ্যান্ডেলটি উপস্থিত থাকে তবে এটি ম্যাজেন্টোকে কেবল এই নির্দিষ্ট লেআউট হ্যান্ডেলটি ব্যবহার করতে বলবে ।

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