सशर्त रूप से लेआउट XML में ब्लॉक दिखाएं / छिपाएं


32

Magento के लेआउट XML में सशर्त रूप से एक ब्लॉक (व्यवस्थापक पैनल में कॉन्फ़िगरेशन के आधार पर) कैसे जोड़ें?

हम जाँच कर सकते हैं कि क्या क्रियाओं पर विन्यास सही है। नीचे दिए गए उदाहरण में, यदि 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. क्या यह वर्कअराउंड सुरक्षित है?
  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" />

या ब्लॉकों को केवल तभी संसाधित किया जाता है यदि उन्हें अंत में टेम्पलेट में प्रदर्शित किया जाना है? तो क्या Magento को इस तथ्य के बावजूद मेरे सभी 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
यह कुछ मामलों में लागू हो सकता है (और मेरा एक प्रारंभिक विचार था), हालांकि इस मामले में ब्लॉक इन टॉप ( लिलिंक ) को मूल रूप से डिफ़ॉल्ट रूप से लागू किया जाता है।
benmarks

@benmarks आह आप इसे मॉड्यूलर होने के लिए मतलब है? तब आपका दृष्टिकोण इस मामले में सबसे अच्छा तरीका होगा।
रिक कुइपर्स

1
@RickKuipers 1. क्या आप स्पष्ट कर सकते हैं कि यह "परिशिष्ट" विधि कैसे काम करती है? क्या यह my_block"हेड" के अंदर जाएगा, या यह "हेड" के अंदर उस ब्लॉक की एक और कॉपी जोड़ देगा और पहली कॉपी अभी भी कहीं और दिखाई जाएगी (जैसा कि ब्लॉक पहले ही जोड़ा गया था <reference name="head">)? 2. किस PHP फ़ाइल में मुझे "अपेंड" या "अनसेट चाइल्ड" जैसे सभी लेआउट तरीके मिल सकते हैं?
zitix

1
@ ज़ींट यदि ब्लॉक की परिभाषा <reference name="root">(या किसी अन्य नॉन core/text_listब्लॉक) में है तो इसे तब तक स्वचालित रूप से प्रदर्शित नहीं किया जाएगा जब तक कि इसे कॉल न किया जाए getChildHtml()। यह ब्लॉक को स्थानांतरित नहीं करेगा, यह एक प्रतिलिपि होगी जिससे आप इसे कई बार जोड़ सकते हैं। <action>ब्लॉक में एक विधि कहता है। तो यह निर्भर करता है कि हम किस ब्लॉक की बात कर रहे हैं। आप इसमें कुछ मानक पा सकते हैं Mage_Core_Block_Abstract। लेकिन ब्लॉक के स्वामित्व वाली किसी भी विधि का उपयोग करके बुलाया जा सकता है <action>
रिक कुइपर्स

@RickKuipers और यह विधि प्रदर्शन को कैसे प्रभावित करती है? (मैंने अपना प्रश्न संपादित किया) ब्लॉक को जोड़ने की आवश्यकता है, <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]
ज़ीमे

1
सिस्टम कॉन्फ़िगरेशन के लिए स्रोत मॉडल अविश्वसनीय रूप से आसान हैं, और पर्यवेक्षक के माध्यम से कस्टम लेआउट अपडेट हैंडल को जोड़ने की तुलना में यह रास्ता बहुत कम जटिल है।
benmarks

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');
    }
}

अंत में अपने लेआउट में:

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

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

धन्यवाद, मुझे यह नहीं पता था, मैं भविष्य में इस पद्धति का उपयोग करने के लिए सुनिश्चित करूंगा। लेकिन अब मुझे जो करने की आवश्यकता है, उसके लिए बहुत अधिक अतिरिक्त कोड की आवश्यकता है।
zitix
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.