स्तरित नेविगेशन के लेआउट को बदलना


14

मेरे पास एक स्तरित नेविगेशन है, और ग्राहक <select/>लिंक की लंबी सूची के बजाय फ़ील्ड रखना चाहता है ।

मैं सिर्फ एक पर्यवेक्षक के साथ टेम्पलेट को बदलने के बारे में सोचा अगर फ़िल्टर का नाम / आईडी मेल खाता है।

कोई बेहतर विचार या सिफारिशें? टेम्पलेट को बदलने के लिए विकल्प, शायद ब्लॉक को फिर से लिखना / फिर से लिखना या केवल दो फिल्टर के लिए ब्लॉक वर्ग को बदलना?

टेम्पलेट बदलने के लिए किस घटना का उपयोग करना है?

मुझे तब यहाँ वैसी ही समस्या है जैसी /programming/14524791/magento-enable-or-disable-a-module-in-code/14529629 क्योंकि मेरे पास एक ऑब्जर्वर है जो लेआउट चीजों को बदलता है। यह केवल विषय प्रासंगिक है। तो अपडेट चलाने से पहले थीम को चेज करना एक अच्छा विचार हो सकता है?


"ग्राहक लिंक की एक लंबी सूची के बजाय फ़ील्ड रखना चाहते हैं" मुझे नहीं पता कि आपका इससे क्या मतलब है।
रिक कुइपर्स

लानत, स्टैकएक्सचेंज ने मेरी <select>
Fabian Blechschmidt

1
मैं कहूंगा कि बस catalog/layer/filter.phtmlटेम्पलेट को अधिलेखित करें और आपको जो कुछ भी करने की आवश्यकता है उसे बदल दें, यह विषय के रूप में भी विशिष्ट होगा। केवल एक चीज जिससे आपको निपटना है वह चयनित फ़िल्टर बिट है। मैं अनुमान लगा रहा हूं कि आप चुने गए सभी फ़िल्टर दिखाना चाहते हैं <select>, जिसमें कुछ ब्लॉक फ़ंक्शंस जोड़ने की आवश्यकता हो सकती है, क्योंकि एक बार फ़िल्टर का चयन करने पर अन्य विकल्प गायब हो जाते हैं।
रिक कुइपर्स

नहीं, ग्राहक श्रेणियों और "उपश्रेणियाँ" (विशेषता) का चयन बॉक्स के रूप में करना चाहते हैं, चेकबॉक्स के साथ बाकी सब कुछ (काम करने के लिए) और रेटिंग के अनुसार फ़िल्टर करें :-) लेकिन फिर मैं टेम्पलेट में सब कुछ लागू करूँगा।
फैबियन ब्लेचस्मिट

1
यह टिप्पणी मेरे लिए एक नोट के रूप में कार्य करती है। मेरे पास इसका जवाब है लेकिन मैं अपने फोन पर हूं। स्तरित नव में काम प्यार। मैंने इसे पिछली परियोजना में कई क्षेत्रों का चयन करने के लिए बढ़ाया (सोचिए चेकबॉक्स)
टिम रेनॉल्ड्स

जवाबों:


6

ठीक है, जिन चीजों को आपको करने की आवश्यकता है: 1. अपना खुद का टेम्पलेट सेट करने के लिए 'कैटलॉग / लेयर_व्यू' ब्लॉक को ओवरराइड करें। मैंने अपने स्तरित क्षेत्र को 1 कॉलम लेआउट के भाग के रूप में हेडर क्षेत्र में रखा

<layout>
    <catalog_category_layered>        
        <reference name="header">
            <block type="catalog/layer_view" name="mylayered"  template="mymodule/catalog/layer/view.phtml"/>
        </reference>    
    </catalog_category_layered>
</layout>

उस टेम्पलेट फ़ाइल में आपको अपने व्यक्तिगत तत्वों के लिए ओवरराइड टेम्पलेट निर्दिष्ट करने की आवश्यकता होती है।

<?php if($this->canShowBlock()): ?>
<div class="block block-layered-nav">
    <div class="block-title">
        <strong><span><?php echo $this->__('Shop By') ?></span></strong>
    </div>
    <div class="block-content">
        <?php echo $this->getStateHtml() ?>
        <?php if ($this->getLayer()->getState()->getFilters()): ?>
            <div class="actions"><a href="<?php echo $this->getClearUrl() ?>"><?php echo $this->__('Clear All') ?></a></div>
        <?php endif; ?>
        <?php if($this->canShowOptions()): ?>
            <p class="block-subtitle"><?php echo $this->__('Shopping Options') ?></p>
            <dl id="narrow-by-list">
                <?php $_filters = $this->getFilters() ?>
                <?php foreach ($_filters as $_filter): ?>
                <?php /* !!! HERE !!! */ ?>
                <?php if(some_condition == true){ $_filter->setTemplate('path/to/your/new/filter.phtml'); } ?>
                <?php if($_filter->getItemsCount()): ?>
                    <dt><?php echo $this->__($_filter->getName()) ?></dt>
                    <dd><?php echo $_filter->getHtml() ?></dd>
                <?php endif; ?>
                <?php endforeach; ?>
            </dl>
            <script type="text/javascript">decorateDataList('narrow-by-list')</script>
        <?php endif; ?>
    </div>
</div>
<?php endif; ?>

अंत में, आपको ड्रॉप डाउन फ़िल्टर बनाने की आवश्यकता है। phtml। वह सीधे आगे होना चाहिए। यह खराब रूप से स्वरूपित है क्योंकि मुझे इस संपादक से परेशानी हो रही है, लेकिन सामान्य विचार यहाँ है। कुछ जावास्क्रिप्ट की भी आवश्यकता होगी।

<ol>

    <li><select>
    <?php foreach ($this->getItems() as $_item): ?>
        <option value="<?php echo $this->urlEscape($_item->getUrl()); ?>">
        <?php if ($_item->getCount() > 0): ?>
        <a href="<?php echo $this->urlEscape($_item->getUrl()) ?>"><?php echo $_item->getLabel() ?></a>
        <?php else: echo $_item->getLabel() ?>
        <?php endif; ?>
        <?php if ($this->shouldDisplayProductCount()): ?>
        (<?php echo $_item->getCount() ?>)
        <?php endif; ?>
    </option>
<?php endforeach ?>
</select></li>
</ol>

लेआउट को फिर से लिखने से परेशान क्यों? क्यों न केवल थीम थीम फ़ोल्डर में आधार टेम्पलेट की प्रतिलिपि बनाएं? क्या मुझे यहाँ कुछ याद आ रहा है (थोड़ा थक गया, पूरी रात मेरी बीमार नवजात बेटी के साथ)
ProxiBlue

@dedmeet आपकी बेटी को बधाई देता हूं और मेरा भी यही सवाल है। एक साधारण विषय टेम्पलेट ओवरराइड करेगा।
रिक कुइपर्स

@ समय: मेरे मोबाइल पोस्ट को [पर] टिम निगल लिया है, तो यह सिर्फ इसलिए कि टिम एक अधिसूचना प्राप्त करते हैं।
ProxiBlue

@dedmeet जब आप टिप्पणी करते हैं, तो पोस्ट के मूल पोस्टर को हमेशा सूचित किया जाएगा भले ही आप उसका उल्लेख न करें :)
mpaepper

क्षमा करें, हाँ, टेम्पलेट फिर से लिखना काम करेगा। मैंने उल्लेख किया कि मैंने मेनू के नीचे पृष्ठ के केंद्र में अपनी स्तरित नौसेना को स्थानांतरित कर दिया। यह जवाब अप्रासंगिक था इसलिए मुझे इसे छोड़ देना चाहिए था।
टिम रेनॉल्ड्स

10

आप अपने विशेष विशेषता फ़िल्टर के टेम्पलेट को बदलने के लिए ब्लॉक core_block_abstract_prepare_layout_afterपर घटना का उपयोग कर सकते हैं Mage_Catalog_Block_Layer_View

यह कुछ इस तरह हो सकता है:

public function yourObserver($observer) 
{
    $block = $observer->getBlock();
    if ($block instanceof Mage_Catalog_Block_Layer_View) {
        $block->getChild($yourAttributeCodeGoesHere . '_filter')
           ->setTemplate('your/template.phtml');
    }
}

सारांश:

प्रत्येक बाल फ़िल्टर ब्लॉक में स्तरित नेविगेशन ब्लॉक के रूप में उर्फ ​​है [attribute_code]_filter, और उन सभी को _prepareLayout()विधि में बनाया गया है ताकि आप आसानी से core_block_abstract_prepare_layout_afterघटना पर इसके टेम्पलेट को संशोधित कर सकें ।

इसके अलावा, आप अपने पर्यवेक्षक के भीतर जांच कर सकते हैं कि वर्तमान विषय कॉल के अनुसार अपेक्षित है:

$design = Mage::getSingleton('core/design_package')
$design->getPackageName(); // Returns current design package
$design->getTheme('layout'); // Returns current design layout

साभार, इवान


अगर चाइल्ड फिल्टर ब्लॉक को attribute_code_filterउर्फ असाइन किया गया है , तो आप केवल एक लेआउट xml में टेम्पलेट क्यों सेट नहीं कर सकते?
pspahn

1
@pspahn क्योंकि आप इसे लेआउट के रूप में उपनाम से एक्सेस नहीं कर सकते। यदि आप इसका आउटपुट चेक getNameInLayout()करते हैं, तो देखेंगे कि इनमें से प्रत्येक ब्लॉक का ANNONYMOUS_30, ANNONYMOUS_23, आदि नाम अद्वितीय हैं, इसलिए आप इस पर भरोसा नहीं कर सकते।
इवान चेपर्नी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.