कोई सक्रिय उत्पादों के साथ श्रेणियां छुपाएं


22

क्या उन श्रेणियों को छिपाने का एक तरीका है जिनमें सक्रिय उत्पाद नहीं हैं? या, और भी बेहतर, केवल उन श्रेणियों को दिखाएं जिनके पास सक्रिय उत्पाद और स्टॉक हैं।


सवाल यह है कि क्या यह एक अच्छा विचार है। जब वे मेनू बदलते हैं तो उपयोगकर्ता भ्रमित होते हैं।
मिमो

जवाबों:


11

ऐसा करने का सबसे आसान तरीका केवल Mage_Catalog_Block_Navigationब्लॉक को फिर से लिखना है :

=> जिस विधि में _renderCategoryMenuItemHtml()आप लूप को बदलना चाहते हैं

foreach ($children as $child) {
    if ($child->getIsActive()) {
        $activeChildren[] = $child;
    }
}

=> इसके साथ:

    foreach ($children as $child) {
        if ($child->getIsActive() && $this->_hasProducts($child->entity_id)) {
            $activeChildren[] = $child;
        }
    }

=> और इसी तरह विधि renderCategoriesMenuHtml()में कोड को बदलें

 foreach ($this->getStoreCategories() as $child) {
        if ($child->getIsActive()) {
            $activeCategories[] = $child;
        }
    }

=> इसके साथ:

    foreach ($this->getStoreCategories() as $child) {
        if ($child->getIsActive() && $this->_hasProducts($child->entity_id)) {
            $activeCategories[] = $child;
        }
    }

=> अंत में वह विधि जोड़ें जो हम अपने कोड में उपयोग कर रहे थे:

protected function _hasProducts($category_id) {
    $products = Mage::getModel('catalog/category')->load($category_id)
        ->getProductCollection()
        ->addAttributeToSelect('entity_id')
        ->addAttributeToFilter('status', 1)
        ->addAttributeToFilter('visibility', 4);
    return ( $products->count() > 0 )  ? true : false;
}

ध्यान रखें कि विधि कैटलॉग / श्रेणी मॉडल का उपयोग करके व्यक्तिगत रूप से प्रत्येक श्रेणी की जांच करती है। इसलिए, यदि आपके पास कई श्रेणियां हैं, तो आप कोड को प्रदर्शन के मुद्दों में नहीं चलाने के लिए फिर से लिखना चाह सकते हैं। जिस छोटे स्टोर में हम चल रहे हैं, यह ठीक काम करता है।


क्या यह संभव है कि इसे एक एक्सटेंशन में बॉक्स किया जाए जिसे स्थानीय फ़ोल्डर में गिराया जा सके? कोड के बारे में चिंतित भविष्य के मैगेंटो अपडेट में ओवरराइट किया गया है।
MagentoMac

10

खाली श्रेणियों को छिपाने के लिए कोई अंतर्निहित सुविधा नहीं है (लेकिन आप मैन्युअल रूप से चयन कर सकते हैं सक्रिय है = व्यवस्थापक क्षेत्र में प्रत्येक श्रेणी के लिए नहीं-> कैटलॉग-> श्रेणियों का प्रबंधन करें)

यहां जोश प्रत्सकी के ब्लॉग के एक महान पोस्ट पर एक लिंक दिया गया है , जहां उन्होंने इस उद्देश्य के लिए विस्तार करने के लिए चरण-दर-चरण वॉकथ्रू लिखा है।


यह अच्छा लग रहा है, लेकिन जो भी कारण हमारे स्टोर में काम नहीं कर रहा है ... किसी भी विचार को कैसे डीबग करना है? कोई त्रुटि संदेश नहीं मिल रहा है। एक टी को निर्देशों का पालन किया, लेकिन दृश्यपटल में कोई बदलाव नहीं। पहले से ही अक्षम कर चुके हैं, फिर संकलक को फिर से सक्षम किया है, और कैश आदि को साफ किया है
MagentoMac

4

यदि आप उन्हें कैटलॉग नेविगेशन में छिपाना चाहते हैं तो आप उस श्रेणी के उत्पादों की मात्रा की जांच करने के लिए टेम्पलेट में एक शर्त जोड़ सकते हैं।


4

शायद इससे भी मदद मिलेगी।

अपने webshop के बैकएंड पर जाएं।

फिर Catalog > Category > Manage Category, अपनी श्रेणी चुनें, और Display settingsटैब चुनें।

लेबल Display Modeसेट किया जा सकता है

Show static block only


4

शीर्ष मेनू से एक खाली श्रेणी छिपाने के लिए, निम्न कार्य करें:

app/code/core/Mage/Catalog/Blockफोल्डर पर जाएं और कॉपी करें Navigation.php

Navigation.phpअपने स्थानीय पैकेज में ओवरराइड करें । Navigation.php अपने पैकेज को खोलें और इस फाइल में निम्नलिखित कोड पेस्ट करें:

if ($category->getIsActive()) {
    $cat = Mage::getModel('catalog/category')->load($category->getId());
    $products = Mage::getResourceModel('catalog/product_collection')->addCategoryFilter($cat);

    Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($products);
    Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($products);
    Mage::getSingleton('cataloginventory/stock')->addInStockFilterToCollection($products);

    if (count($products) == 0) {
        return;
    }
}

उस फाइल में कहां?
मार्क जूल

3

मेरे लिए जो काम किया गया है, वह एक श्रेणी श्रेणी का पेड़ बनाना और एक शर्त कार्य को लागू करना है जो श्रेणी वृक्ष का प्रतिपादन करता है:

foreach ($children as $child) 
{
    if ($child->getIsActive() && $this->_hasProducts($child->entity_id)) 
    {
        $activeChildren[] = $child;
    }
}
function _hasProducts:

    protected function _hasProducts($category_id) {
    $products = Mage::getModel('catalog/category')->load($category_id)
        ->getProductCollection()
        ->addAttributeToSelect('entity_id')
        ->addAttributeToFilter('status', 1)
        ->addAttributeToFilter('visibility', 4);
    return ( $products->count() > 0 )  ? true : false;
}

2

आप उत्पादों के बिना सभी श्रेणियों को निष्क्रिय करने के लिए sql के बाद निष्पादित कर सकते हैं।

UPDATE `catalog_category_entity_int` AS `status`
INNER JOIN `eav_attribute` AS `attr` ON `attr`.`attribute_code` = 'is_active'
AND `attr`.`entity_type_id` = 3
AND `status`.`attribute_id` = `attr`.`attribute_id`
SET `status`.`value` = IF((SELECT COUNT(`index`.`product_id`)
    FROM `catalog_category_product_index` AS `index`
    WHERE `index`.`category_id` = `status`.`entity_id` GROUP BY `index`.`category_id`) > 0, 1, 0)
WHERE `status`.`store_id` = 0

अधिक जानकारी आप यहाँ पा सकते हैं http://quicktips.ru/all/hide-all-categories-without-products-and-show-categories-with-pr/


2

मैंने खाली श्रेणियों को छिपाने के लिए जो किया है वह Mage_Catalog_Model_Resource_Category_Tree load()फ़ंक्शन को फिर से लिखना है। मुझे नीचे की तरह श्रेणी संग्रह के साथ उत्पाद संग्रह में शामिल होना है।

    $collection = Mage::getResourceModel('catalog/product_collection');
    Mage::getSingleton('cataloginventory/stock')->addInStockFilterToCollection($collection);
    Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection);

 $collection->getSelect()->join(
        array('product_category' => Mage::getSingleton('core/resource')->getTableName('catalog/category_product_index')),
        'product_category.product_id = e.entity_id',
        array('')
    );
    $collection->getSelect()->where('product_category.category_id = '.$this->_table.'.entity_id');
    $select->columns(array('product_count' => $collection->getSelectCountSql()));

$arrNodes = $this->_conn->fetchAll($select);इस लाइन से पहले इस कोड को जोड़ें ।

और इस कोड को इस शर्त के साथ लपेटें, इस वर्ग को फ्रंटेंड और बैकएंड मॉडल से भी बुलाया जाता है

  if(!Mage::getSingleton('admin/session')->isLoggedIn())

मैंने अतिरिक्त फ़ील्ड product_count जोड़ा है जिसमें वास्तविक सक्रिय उत्पाद गणना शामिल है।

मैं शीर्ष मेनू पर श्रेणी प्रदर्शित करने के लिए एक 3 पार्टी मॉड्यूल का उपयोग कर रहा हूं और मैंने मेनू प्रदान किए जाने पर उत्पाद गणना के आधार पर शर्त रखी है।

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