लेआउट अपडेट के लिए CMS XML हैंडल


13

मेरे पास कुछ परिदृश्य हैं जहां मैंने सेमी पेज के लेआउट को अपडेट करने के लिए सेमी हैंडल का उपयोग करने की कोशिश की है। उदाहरण के लिए मैं cms_index_index हैंडल को संदर्भित करने के लिए रूट का उपयोग करने और पृष्ठ टेम्पलेट सेट करने का प्रयास कर रहा था। यह विफल रहा और मुझे इस लेआउट अपडेट को सीधे व्यवस्थापक सिस्टम के माध्यम से मुखपृष्ठ सेमी पेज प्रदर्शन सेटिंग्स पर करना पड़ा।

मैंने cms_page हैंडल का उपयोग करके बाईं ओर संदर्भ में एक ब्लॉक जोड़ने की कोशिश की है। फिर से यह विफल रहा और मुझे व्यवस्थापक प्रणाली के माध्यम से लेआउट अपडेट को लागू करना पड़ा।

मैंने पढ़ा है कि आप cms पृष्ठों में रूट टेम्प्लेट निर्दिष्ट नहीं कर सकते। क्या यह सही है और क्या कोई समझा सकता है कि क्यों?

मैं यह भी सोचता हूं कि क्या मानक संदर्भों जैसे कि बाएं, दाएं, रूट आदि का उपयोग करने के लिए सीएमएस हैंडल को सक्षम करने का कोई तरीका था? मुझे लगता है कि सिर और सामग्री जैसी चीजें ठीक-ठीक बताई जा सकती हैं।

जवाबों:


20

रूट टेम्प्लेट को बदलने से काम क्यों नहीं चलता

दोनों

Mage_Cms_IndexController::indexAction()

तथा

Mage_Cms_IndexController::viewAction()

जो डिफ़ॉल्ट मुखपृष्ठ और CMS पृष्ठ को क्रमशः एक सहायक को प्रदर्शित करने के लिए जिम्मेदार हैं:

Mage::helper('cms/page')->renderPage($this, $pageId)

यदि आप सहायक (ऐप / कोड / कोर / मैज / सेमी / हेल्पर / पेज. एफपी पर स्थित) में कूदते हैं और renderPage()संरक्षित विधि का पालन करते हैं, _renderPage()तो आप देखेंगे कि मैगेंटो एक रूट टेम्पलेट के लिए दो बार जांच कर रहा है (मैगेंटो सीई 1.7। 0.2):

if ($page->getRootTemplate()) {
    $handle = ($page->getCustomRootTemplate()
                && $page->getCustomRootTemplate() != 'empty'
                && $inRange) ? $page->getCustomRootTemplate() : $page->getRootTemplate();
    $action->getLayout()->helper('page/layout')->applyHandle($handle);     
}

तथा

if ($page->getRootTemplate()) {
    $action->getLayout()->helper('page/layout')
        ->applyTemplate($page->getRootTemplate());
}

दोनों कॉल "cms_page" जैसे लेआउट हैंडल के बाद होते हैं और इसी तरह संसाधित होते हैं, इसलिए आप यहां भाग्य से बाहर हैं।

रूट टेम्पलेट को बदलने के लिए आप क्या कर सकते हैं

एक घटना है cms_page_renderजिसका उपयोग आप CMS पृष्ठों पर अपने स्वयं के XML लेआउट हैंडल को जोड़ने के लिए कर सकते हैं। अपना स्वयं का एक्सटेंशन बनाएं (मैं यहां कुछ विवरण छोड़ दूंगा) और आपके पास ईवेंट पर्यवेक्षक को कॉन्फ़िगर करूंगा config.xml:

<?xml version="1.0"?>
<config>
    <modules>
        <Emzee_Cms>
            <version>0.0.1</version>
        </Emzee_Cms>
    </modules>

    <global>
        <events>
            <cms_page_render>
                <observers>
                    <emzee_cms_page_render>
                        <class>emzee_cms/observer</class>
                        <method>cms_page_render</method>
                    </emzee_cms_page_render>
                </observers>
            </cms_page_render>
        </events>
        <models>
            <emzee_cms>
                <class>Emzee_Cms_Model</class>
            </emzee_cms>
        </models>
    </global>
</config>

अपनी घटना पर्यवेक्षक जोड़ें:

<?php

class Emzee_Cms_Model_Observer
{
    public function cms_page_render(Varien_Event_Observer $observer)
    {
        $action = $observer->getEvent()->getControllerAction();

        $actionName = strtolower($action->getFullActionName());
        $action->getLayout()->getUpdate()
            ->addHandle($actionName . '_after');
        return $this;
    }
}

अंत में, अपना नया लेआउट XML हैंडल (जैसे आपके local.xml) में जोड़ें:

<?xml version="1.0"?>
<layout version="0.1.0">
    <cms_index_index_after>
        <reference name="root">
            <action method="setTemplate"><template>page/1column.phtml</template></action>
        </reference>
    </cms_index_index_after>
</layout>

आप इस विधि का उपयोग किसी cms_page_view_afterहैंडल को जोड़ने या पेज विशिष्ट हैंडल बनाने के लिए कर सकते हैं क्योंकि ऑब्जेक्ट आपके पर्यवेक्षक को cms_page_renderपास करता है $page

आप 'संदर्भ बाईं ओर' ब्लॉक को क्यों नहीं जोड़ सकते

क्या आप सुनिश्चित हैं कि आपके द्वारा उपयोग किए जा रहे टेम्पलेट में एक बाएं कॉलम है? यह प्रश्न मूर्खतापूर्ण लग सकता है लेकिन डिफ़ॉल्ट "राइट बार के साथ 2 कॉलम" उदाहरण के लिए केवल एक 'सामग्री' और एक 'सही' क्षेत्र प्रदान करता है। मैं cms_pageसमस्याओं के बिना सही कॉलम में ब्लॉक जोड़ सकता हूं ताकि यह समस्या हो सके।

सामान्य तौर पर, आप केवल संदर्भों में आसानी से ब्लॉक जोड़ सकते हैं और यदि उन्हें इको कर सकते हैं

  • चुने हुए रूट टेम्पलेट उस ब्लॉक का उपयोग करता है जिसे आप संदर्भित कर रहे हैं (देखें app/design/frontend/base/default/template/page/*.phtml) और
  • जिस ब्लॉक का आप संदर्भ ले रहे हैं core/text_list, वह या तो प्रकार का है , $this->getChildhtml()तर्कों के बिना कॉल करता है या कुछ और करता है, जिससे सभी बच्चे ब्लॉक को गूंज सकें ।

अधिक जानकारी के बिना, मैं आपको यह नहीं बता सकता कि आपके ब्लॉक बाएं या दाएं कॉलम में क्यों नहीं गूंज रहे हैं।


हाय माथियास। एक घटना पर्यवेक्षक को जोड़ने के सुझाव के लिए धन्यवाद, मैं अपने एक देवता के साथ एक नज़र डालूंगा और देखूंगा कि क्या यह काम करता है। यह जवाब हो सकता है! @Alan ने cms पृष्ठों के लिए सही डिफ़ॉल्ट टेम्प्लेट सेट होने के बारे में भी इसी तरह की बात कही और इस तथ्य को संभाल लिया गया कि यह ओवरराइड है। इस जानकारी के लिए भी धन्यवाद, मुझे लगता है कि मुझे पता चला है कि अब पता चला है।
मार्क वेस्टन

नमस्ते। यह परीक्षण किया और यह काम करता है। पृष्ठ विशिष्ट हैंडल के लिए भी इसका परीक्षण किया है और यह काम कर रहा है, लेकिन यह सबसे अच्छा समाधान नहीं है क्योंकि मुझे उन पृष्ठों के लिए पहचानकर्ता की आवश्यकता नहीं है जिन्हें अभ्यस्त बदला जाना चाहिए। परीक्षण के रूप में मैंने पृष्ठ पहचानकर्ता का उपयोग किया है $cmsPageId = '_' . str_replace('-', '_', $observer->getEvent()->getPage()->getIdentifier()); यदि किसी ने सीएमएस पृष्ठ का URL बदल दिया है, तो हैंडल न होगा। आदर्श रूप से 'पेज की' के लिए एक फ़ील्ड एडमिन सिस्टम में CMS पेज पर मौजूद होगी, फिर पेज url, नाम आदि को बदला जा सकता है और कुंजी को समान रखा जा सकता है।
मार्क वेस्टन

14

आपके "के बारे में <reference name="left/> का उपयोग करके कोई ब्लॉक नहीं जोड़ा जा सकता है , क्या आप सुनिश्चित हैं कि आपके सीएमएस पृष्ठ में एक ब्लॉक है जिसका नाम बाएं है। उदाहरण के लिए, यदि आप डिफ़ॉल्ट होम पेज पर विचार करते हैं जो मैगेंटो नमूना डेटा के साथ जहाज करता है, तो यह ब्लॉक नाम का प्रतीत होता है बाएं।

क्या वह बायां स्तंभ है?

हालाँकि, यदि आप बैकएंड में पृष्ठ को देखते हैं, तो आप देख सकते हैं कि यह रूट टेम्पलेट का उपयोग करने के लिए सेट है

`2 columns with right bar`    

और फिर इसके कंटेंट एरिया में, लेफ्ट कॉलम को HTML मार्कअप (WYSIWYG से सोर्स व्यू के लिए टॉगल) का उपयोग करके जोड़ा जाता है

<div class="col-left side-col">
<p class="home-callout"><a href="{{store direct_url="apparel/shoes/womens/anashria-womens-premier-leather-sandal.html"}}"><img src="{{skin url='images/ph_callout_left_top.gif'}}" alt="" border="0" /></a></p>
<p class="home-callout"><img src="{{skin url='images/ph_callout_left_rebel.jpg'}}" alt="" border="0" /></p>
{{block type="tag/popular" template="tag/popular.phtml"}}</div>

यह निर्देशित ग्राफ़ यह स्पष्ट करता है कि इसमें leftहुक करने के लिए कोई ब्लॉक नहीं है ( पूर्ण आकार की छवि के लिए क्लिक करें )

वाणिज्य बग के साथ निर्देशित ग्राफ

टेम्पलेट सेट करने के संबंध में, यदि आप "लेआउट" ड्रॉप डाउन के स्रोत को देखते हैं

<select id="page_root_template" name="root_template" class=" required-entry select">
    <option value="empty">Empty</option>
    <option value="one_column">1 column</option>
    <option value="two_columns_left">2 columns with left bar</option>
    <option value="two_columns_right" selected="selected">2 columns with right bar</option>
    <option value="three_columns">3 columns</option>
</select>

जब आप इस क्षेत्र को स्थापित कर रहे हैं आप देख सकते हैं, वास्तविक मूल्य को बचाया जा रहा है की तरह कुछ है one_column, two_columns_leftआदि एक ही नाम के लेआउट हैंडल करने के लिए इन मूल्यों corespond।

#File: app/design/frontend/default/modern/layout/page.xml
<page_one_column translate="label">
    <label>All One-Column Layout Pages</label>
    <reference name="root">
        <action method="setTemplate"><template>page/1column.phtml</template></action>
        <!-- Mark root page block that template is applied -->
        <action method="setIsHandle"><applied>1</applied></action>
        <action method="setLayoutCode"><name>one_column</name></action>
    </reference>
</page_one_column>
...
<page_two_columns_left translate="label">
    <label>All Two-Column Layout Pages (Left Column)</label>
    <reference name="root">
        <action method="setTemplate"><template>page/2columns-left.phtml</template></action>
        <!-- Mark root page block that template is applied -->
        <action method="setIsHandle"><applied>1</applied></action>
        <action method="setLayoutCode"><name>two_columns_left</name></action>
    </reference>
</page_two_columns_left>

जब Magento एक CMS पृष्ठ प्रदान कर रहा है, तो यह सहेजे गए मानों को संदर्भित करता है, और पृष्ठ पर उपयुक्त लेआउट हैंडल जोड़ता है। हालांकि यह प्रश्न के लिए ठोस है, कि हैंडल को यहां जोड़ा गया है

#File: app/code/core/Mage/Cms/Helper/Page.php
protected function _renderPage(Mage_Core_Controller_Varien_Action  $action, $pageId = null, $renderLayout = true)
{
    //...
    $action->addActionLayoutHandles();        
    if ($page->getRootTemplate()) {
        $handle = ($page->getCustomRootTemplate()
                    && $page->getCustomRootTemplate() != 'empty'
                    && $inRange) ? $page->getCustomRootTemplate() : $page->getRootTemplate();
        $action->getLayout()->helper('page/layout')->applyHandle($handle);
    }  
    //...
}

अधिक महत्वपूर्ण बात यह है कि लेआउट के हैंडल को क्रम में जोड़ने का क्रम है

कॉमर्स बग का हैंडल

जैसा कि आप ऊपर स्क्रीनशॉट में देख सकते हैं, page_two_columns_rightहैंडल के बादcms_index_index हैंडल जोड़ा गया है। इसका मतलब है कि अगर आप लेआउट xml अपडेट कोड जोड़ते हैं तो cms_index_indexआपके कोड में टेम्पलेट बदल जाएगा, लेकिन फिर लेआउट अपडेट xml कोड page_two_columns_rightइसके साथ चलेगा।

मुझे हमेशा संदेह है कि यह डिज़ाइन द्वारा यह सुनिश्चित करने के लिए है कि उपयोगकर्ता इंटरफ़ेस में सेट टेम्पलेट हमेशा सही हो। मैगेंटो के पिछले संस्करण में <action method="setIsHandle"><applied>1</applied></action>विधि कॉल उन्हीं कारणों से मौजूद है।

तो, शुद्ध लेआउट xml कोड का उपयोग करके आप क्या करना चाहते हैं, इसका कोई तरीका नहीं है। यदि आप कस्टम मॉड्यूल और ऑब्जर्वर कोड बनाने में सहज हैं, तो cms_page_renderईवेंट देखें। यह आग बुझने से ठीक पहले लगी loadLayoutUpdatesहै, और आपको अतिरिक्त हैंडल नाम को स्लाइड करने देगा या मौजूदा हैंडल नामों को हटा देगा।


धन्यवाद एलन, एक सेमी पृष्ठ में ब्लॉक जोड़ने के बारे में आपकी टिप्पणी पूरी समझ में आती है। मैं आमतौर पर विभिन्न पृष्ठों के लिए टेम्पलेट सेट करता हूं जो कि विभिन्न xml हैंडल मैगेंटो प्रदान करता है। Cms पृष्ठों की मेरी थोड़ी बेहतर समझ ने यह स्पष्ट कर दिया है कि मुझे cms पृष्ठों के संदर्भों का उपयोग करने में समस्या क्यों हुई। मुझे यह सुनिश्चित करने की ज़रूरत है कि मेरे पेज में डिफ़ॉल्ट हैंडल। Xml में सेमी पेज के लिए सही लेआउट है। लगता है कि मैं उस हैंडल पर चमक गया हूं, क्योंकि मैं आमतौर पर इसे कहीं और से देख रहा हूं। क्या वो सही है? क्या मैं पूछ सकता हूं कि आपने किसी विशेष अनुरोध के लिए हैंडल को देखने के लिए ग्राफ़ और किस टूल का उपयोग किया है?
मार्क वेस्टन

2
@MarkWeston चित्र और वाणिज्य बग से कुछ यूआई को संभालें, एक वाणिज्यिक डिबगिंग उपकरण जिसे मैंने बनाया और बेचा। ( विवरण के लिए alanstorm.com/find_magento_block_name देखें) मुझे यकीन नहीं है कि मैं हैंडल के बारे में आपके प्रश्न को समझ गया हूं, लेकिन यदि आप हैंडल में टेम्पलेट सेट कर रहे हैं default, तो व्यवस्थापक में सेट लेआउट अभी भी जीत page_two_columns_rightजाएगा (यानी अभी भी चलेगा बाद में)। इसके अलावा, पुन: शब्दावली - आप हैंडल को ओवरराइड नहीं करते हैं, आपके हैंडल हमेशा दूसरों के साथ मिलकर काम करते हैं - इसका सिर्फ एक ही क्रम वे अंतिम परिणाम को प्रभावित करते हैं।
एलन स्टॉर्म

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