लेआउट में कई लेआउट लक्ष्यीकरण XML को संभालता है


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नोड में लक्षित पृष्ठ के बजाय सभी पेज प्रतीत होता है पर ऐसा कर रहा है।

मैंने इस लेआउट अपडेट के कई क्रमों की कोशिश की है, लेकिन कोई भी काम नहीं कर रहा है। मैं लेआउट हैंडल का उपयोग करते हुए एक ही समय में इस एक लेआउट हैंडल को कैसे लक्षित कर सकता हूं customer_logged_out?

- संपादित करें - स्पष्ट होने के लिए, यह वास्तव में एक तृतीय-पक्ष मॉड्यूल है।

जवाबों:


18

चूंकि आप अपने स्वयं के नियंत्रक का उपयोग कर रहे हैं, इसलिए आपको केवल डिफ़ॉल्ट हैंडल का उपयोग करने की आवश्यकता नहीं है। लॉग इन स्थिति के आधार पर आप अपनी जानकारी विधि में जोड़ सकते हैं

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

या

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

और फिर अपने लेआउट में। xml फ़ाइल का उपयोग करें

<mymodule_customer_info_logged_in>

तथा

<mymodule_customer_info_logged_out>

- नीचे अपना संपादन संपादित करने के बाद -

यह देखते हुए कि आप नियंत्रक को संपादित नहीं करना चाहते हैं (क्योंकि यह एक तृतीय पक्ष एक्सटेंशन है), मैं एक अलग एक्सटेंशन बनाऊंगा जो केवल नियंत्रक_action_layout_load_before को देखता है

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

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

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

आकर्षक लगा। यह आदर्श नहीं है, लेकिन एक अपेक्षाकृत साफ समाधान है। जैसा कि मैंने नीचे अपनी अन्य टिप्पणी में उल्लेख किया है, मुझे तीसरे पक्ष के मॉड्यूल को संशोधित करने की आवश्यकता नहीं है, लेकिन ऐसा लगता है कि यहां बहुत पसंद नहीं है। शर्म आनी चाहिए, क्योंकि 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';
    }
}

untested


मैंने ऐसा सोचा भी था, लेकिन मैं उम्मीद कर रहा था कि मॉड्यूल में अतिरिक्त कक्षाओं पर भरोसा किए बिना केवल प्रदर्शन करने के लिए मॉड्यूल के लेआउट एक्सएमएल पर भरोसा करना होगा - दर्शन का "अगर यह एक्सएमएल में किया जा सकता है, तो इसे करें XML में, यदि आवश्यक नहीं है, तो अतिरिक्त मॉड्यूल संसाधन न बनाएँ ”।
pspahn

@pspahn निश्चित रूप से लक्ष्य की कोशिश करना है और इसे XML लेआउट सिस्टम Magento प्रदान करता है, दुर्भाग्य से इसकी सीमाएं हैं और मेरा मानना ​​है कि यह उनमें से एक है। हालांकि मुझे अभी भी लगता है कि अतिरिक्त मॉड्यूल संसाधन के बावजूद यह एक पूरी तरह से व्यवहार्य समाधान है।
रिक कुइपर्स

@pspahn Fooman के पास एक अच्छा वैकल्पिक उपाय है जो मैं अपने ऊपर सलाह दूंगा। इसके लिए कम कोडिंग की आवश्यकता होती है!
रिक कुइपर्स

इस मामले में, मैं वास्तव में एक तृतीय-पक्ष मॉड्यूल के साथ काम कर रहा हूं। मुझे उनके मॉड्यूल को संपादित करने की आवश्यकता नहीं है (क्योंकि अपडेट इसे तोड़ सकते हैं) और मैं इसे अलग मॉड्यूल के सहायक वर्ग में नहीं डालूंगा (क्योंकि उनके मॉड्यूल और कूल्हे एक साथ मॉड्यूल को जोड़ता है)।
pspahn

6

मुझे हाल ही में इस तरह की कार्यक्षमता की आवश्यकता थी और मौजूदा लेआउट हैंडल के सभी विभिन्न संयोजनों के लिए अधिक से अधिक लेआउट हैंडल जोड़ना मुश्किल हो रहा था, इसलिए मैंने सीधे लेआउट xml से कई लेआउट हैंडल को लक्षित करने की क्षमता जोड़ने के लिए एक मैगनेटो एक्सटेंशन बनाया।

यहां एक्सटेंशन का लिंक दिया गया है- https://github.com/mridul89/MultipleHandles.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लेआउट हैंडल भी मौजूद है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.