XML লেআউটে শর্তাধীনভাবে ব্লকগুলি দেখান / লুকান


32

কীভাবে শর্তসাপেক্ষে ম্যাজেন্টোর লেআউট এক্সএমএলে একটি ব্লক (অ্যাডমিন প্যানেলে কনফিগারেশনের উপর নির্ভর করে) যুক্ত করবেন?

কনফিগারেশন কর্মের ক্ষেত্রে সত্য কিনা তা আমরা পরীক্ষা করতে পারি। নীচের উদাহরণে, যদি sample/config/show_toplinksঅ্যাডমিন প্যানেল থেকে কনফিগারেশন (সিস্টেম-> কনফিগারেশনে) সত্য হয় , তবে টেমপ্লেট ফাইলটি links.phtmlশীর্ষ লিঙ্কগুলি রেন্ডার করতে ব্যবহৃত হবে। যদি sample/config/show_toplinksহয় মিথ্যা , তারপরে ডিফল্ট টেমপ্লেট ব্যবহার করা হবে।

<reference name="top.links">
    <action method="setTemplate" ifconfig="sample/config/show_toplinks">
        <template>page/template/links.phtml</template>
    </action>
</reference>

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

<reference name="top.links">
    <action method="setTemplate" ifconfig="sample/config/show_toplinks">
        <template>page/template/links.phtml</template>
    </action>

    <!-- OR set completely empty template -->
    <action method="setTemplate">
        <template>page/template/empty_template_for_links.phtml</template>
    </action>
</reference>

এই ক্ষেত্রে, যদি sample/config/show_toplinksহয় সত্য , তারপর টেমপ্লেট links.phtmlব্যবহার করা হবে এবং শীর্ষ লিংক প্রদর্শন করা হবে। তবে যদি sample/config/show_toplinksএটি মিথ্যা হয় , তবে empty_template_for_links.phtmlটেমপ্লেটটি ব্যবহার করা হবে এবং সেই টেমপ্লেটটি সম্পূর্ণ খালি, সুতরাং এটি কোনও HTML ফেরত দেয় না এবং শীর্ষ লিঙ্কগুলি দৃশ্যমান হবে না।

  1. অ্যাডমিন প্যানেলে কনফিগারেশনের উপর নির্ভর করে শর্তসাপেক্ষে ব্লকগুলি দেখানোর বা আড়াল করার কোনও অন্য উপায় আছে কি?
  2. এই workaround নিরাপদ?
  3. এটি কি কোনও অপ্রত্যাশিত ত্রুটি ঘটাতে পারে?

সম্পাদনা করুন:

সমস্ত উত্তরের উপর ভিত্তি করে আমি মনে করি যে রিক কুইপার্স সমাধানটি আমার ক্ষেত্রে সবচেয়ে সুবিধাজনক বলে মনে হচ্ছে। তবে আমার আরও একটি সম্পর্কিত প্রশ্ন রয়েছে:

    <block type="core/template" name="my_block" template="my/block.phtml" />
    <!-- ...add more blocks here -->

    <reference name="footer">
        <action method="append" ifconfig="sample/config/show_toplinks">
            <block>my_block</block>
        </action>
        <!-- ...append more blocks here -->
    </reference>

যদি আমার কাছে এই জাতীয় যোগ করার জন্য অনেকগুলি ব্লক থাকে ( appendপদ্ধতি এবং ব্যবহার করে ifconfig) তবে আসুন 50 বলি, এটি কি কার্যকারিতাটিকে প্রভাবিত করে ? কেবলমাত্র কয়েকটি ব্লক সত্যই প্রদর্শিত হবে (যা সিস্টেম -> কনফিগারেশনে ব্যবহারকারীর সেটিংসের উপর নির্ভর করে) তবে শর্তসাপেক্ষে সেগুলি ভিতরে যুক্ত করার আগে আমার সমস্ত ব্লক যুক্ত করা দরকার <reference name="footer">...</reference>

Magento তাৎক্ষণিকভাবে সমস্ত ব্লককে এভাবে যুক্ত করা প্রক্রিয়া করে?

    <block type="core/template" name="my_block" template="my/block.phtml" />

বা ব্লকগুলি কেবলমাত্র যদি শেষ পর্যন্ত টেম্পলেটে প্রদর্শিত হয় তবে তাদের প্রক্রিয়া করা হয়? সুতরাং কেবল those ব্লকগুলির মধ্যে কিছু প্রদর্শন করা দরকার ছিল তা সত্ত্বেও কি ম্যাজেন্টোকে আমার 50 টি ব্লকগুলি প্রক্রিয়া করতে হবে?

উত্তর:


28

বেনমার্কের উত্তরের বিপরীতে আমি আমার বিকল্পটি যুক্ত করতে চাই।

আমার পদ্ধতিটি অ্যাডেন্ড ক্রিয়াটি ব্যবহার করা:

    <block type="core/template" name="my_block" template="my/block.phtml" />
    <reference name="head">
        <action method="append" ifconfig="myblock/general/enabled"><block>my_block</block></action>
    </reference>

1
এটি নির্দিষ্ট ক্ষেত্রে প্রয়োগ হতে পারে (এবং এটি আমার প্রাথমিক চিন্তা ছিল) তবে এই ক্ষেত্রে প্রশ্নটিতে থাকা ব্লকটি ( টপ.লিংকস ) মূল থেকে পূর্বনির্ধারিতভাবে আহ্বান করা হয়েছে।
বেনমার্কস

@ বেনমার্কস আহ আপনার অর্থ এটি মডুলার হওয়ার স্বার্থে? তাহলে আপনার পদ্ধতির ক্ষেত্রে এক্ষেত্রে সেরা পন্থা হবে।
রিক কুইপার্স

1
@ রিককিউপার্স ১। এই "সংযোজন" পদ্ধতিটি কীভাবে কাজ করে তা আপনি ব্যাখ্যা করতে পারবেন? এটি কি my_block"মাথা" এর ভিতরে চলে যাবে , বা এটি "মাথা" এর ভিতরে that ব্লকের অন্য অনুলিপি যুক্ত করবে এবং প্রথম অনুলিপিটি অন্য কোথাও প্রদর্শিত হবে (যেমন ব্লকটি আগেই যুক্ত করা হয়েছিল <reference name="head">)? ২. পিএইচপি ফাইলটিতে আমি "সংযোজন" বা "আনসেটচাইল্ড" এর মতো সমস্ত লেআউট পদ্ধতি খুঁজে পেতে পারি?
zitix

1
@ জিতিক্স যদি ব্লকের সংজ্ঞাটি <reference name="root">(বা অন্য কোনও নন core/text_listব্লক) এ থাকে তবে এটি কল না করা হলে এটি স্বয়ংক্রিয়ভাবে প্রদর্শিত হবে না getChildHtml()। এটি ব্লকটি সরবে না, এটি একটি অনুলিপি হবে যাতে আপনি এটি একাধিকবার সংযোজন করতে পারেন। <action>ব্লকে একটি পদ্ধতি কল করে। সুতরাং এটি নির্ভর করে যে আমরা কোন ব্লকের কথা বলছি। আপনি কয়েকটি মানক খুঁজে পেতে পারেন Mage_Core_Block_Abstract। তবে ব্লকের মালিকানাধীন যে কোনও পদ্ধতি ব্যবহার করে বলা যেতে পারে <action>
রিক কুইপার্স

@ রিককিউপার্স এবং কীভাবে এই পদ্ধতিটি পারফরম্যান্সকে প্রভাবিত করে? (আমি আমার প্রশ্ন সম্পাদনা করেছি) <block type="core/template" name="my_block" template="my/block.phtml" />অবশেষে প্রদর্শিত না হলেও ব্লকটি যুক্ত করা দরকার ।
zitix

15

_templateআউটপুট আড়াল করতে সম্পত্তি ব্যবহার করে একটি অভিনব পদ্ধতির। আমি কনফিগার বিকল্পে মানগুলি বিপরীত করতে পছন্দ করব যাতে হ্যাঁ = 0 (সম্ভবত একটি কাস্টম উত্স মডেল) এবং unsetChildপ্যারেন্ট হেড ব্লকে কল করুন :

<reference name="head">
    <action method="unsetChild" ifconfig="sample/config/show_toplinks">
       <child>topLinks</child>
    </action>
</reference>

1
আপনাকে ধন্যবাদ, এটি খুব ভাল তবে এটির জন্য সিস্টেম -> কনফিগারেশনের সমস্ত কনফিগারেশন ক্ষেত্রকে উল্টানো দরকার। আমার বদলাতে হবে: Top Links: [enable/disable]এরকম কিছুতে Hide Top Links: [Yes/No]
zitix

1
সিস্টেম কনফিগারেশনের উত্স মডেলগুলি অবিশ্বাস্যরকম সহজ এবং পর্যবেক্ষকের মাধ্যমে কাস্টম লেআউট আপডেট হ্যান্ডেল যোগ করার চেয়ে এই পথটি খুব কম জটিল।
বেনমার্কস 4'13

12

আপনার প্রশ্ন হিসাবে:

  1. আমার পদ্ধতিটি কেবল আপনার উপর প্রসারিত

  2. কেন হবে না তা আমি দেখতে পাচ্ছি না

  3. আবার, আপনার getStoreConfigকোডগুলি এমন পদ্ধতিগুলির পিছনে বেশ নিরাপদ যা ব্যতিক্রম ঘটবে না ( একের জন্য কেবল মিথ্যা মানগুলি ফিরিয়ে দেবে, সুতরাং আপনার শর্তসাপেক্ষ হ্যান্ডেলটি যুক্ত হবে না) তবে খালি টেম্পলেট ফাইলটি উপস্থিত না থাকলে আপনি একটি ব্যতিক্রম পাবেন। একটি খালি মান পাস করার জন্য একটি স্ব-সমাপনী ট্যাগ ব্যবহার করুন (উদাঃ <template />)

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

<config>
  <global>
    <!-- stuff -->
    <events>
      <controller_action_layout_load_before>
        <observers>
          <my_module_add_handle>
            <class>my_module/Observer</class>
            <method>addHandle</method>
          </my_module_add_handle>
        </observers>
      </controller_action_layout_load_before>
    </events>
    <!-- other stuff -->
  </global>
</config>

এবং তারপরে আপনার Observerমডেলটিতে ...

public function addHandle(Varien_Event_Observer $observer)
{
    if (Mage::getStoreConfig('sample/config/toplinks') {
        $observer->getEvent()->getLayout()->getUpdate()
            ->addHandle('show_toplinks');
    }
}

আপনার লেআউটে অবশেষে Aaaand:

<default>
  <reference name="top.links">
     <!-- yup -->
  </reference>
</default>

<show_toplinks>
  <reference name="top.links">
     <!-- another yup -->
  </reference>
</show_toplinks>

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