ซ่อนหมวดหมู่โดยไม่มีผลิตภัณฑ์ที่ใช้งานอยู่


22

มีวิธีซ่อนหมวดหมู่ที่ไม่มีผลิตภัณฑ์ที่ใช้งานหรือไม่? หรือดียิ่งขึ้นแสดงเฉพาะหมวดหมู่ที่มีผลิตภัณฑ์และสต็อกที่ใช้งานอยู่


คำถามคือว่านี่เป็นความคิดที่ดีหรือไม่ ผู้ใช้สับสนเมื่อพวกเขาเปลี่ยนเมนู
MiMo

คำตอบ:


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

โปรดจำไว้ว่าวิธีการตรวจสอบแต่ละหมวดหมู่โดยใช้แคตตาล็อก / หมวดหมู่หมวดหมู่ ดังนั้นหากคุณมีหลายประเภทคุณอาจต้องการเขียนรหัสใหม่เพื่อไม่ให้เกิดปัญหาเรื่องประสิทธิภาพ ในร้านค้าขนาดเล็กที่เรากำลังดำเนินการอยู่ได้ผลดี


เป็นไปได้หรือไม่ที่จะทำสิ่งนี้ให้เป็นส่วนขยายที่สามารถดรอปไว้ในโฟลเดอร์ในเครื่องได้ กังวลเกี่ยวกับรหัสที่ถูกเขียนทับในการอัพเดต Magento ในอนาคต
MagentoMac

10

ไม่มีคุณสมบัติในตัวสำหรับซ่อนหมวดหมู่ที่ว่างเปล่า (แต่คุณสามารถเลือกด้วยตนเองใช้งานได้ = ไม่สำหรับแต่ละหมวดหมู่ในพื้นที่ผู้ดูแล -> แคตตาล็อก -> จัดการหมวดหมู่)

นี่คือลิงค์ในโพสต์ที่ยอดเยี่ยมจากบล็อกของ Josh Prattskiซึ่งเขาเขียนคำแนะนำแบบทีละขั้นตอนเกี่ยวกับวิธีการสร้างส่วนขยายสำหรับจุดประสงค์นี้


สิ่งนี้ดูดี แต่ด้วยเหตุผลใดก็ตามที่ใช้ไม่ได้ในร้านของเรา ... ความคิดใด ๆ ที่จะแก้ไขข้อบกพร่องได้อย่างไร ไม่ได้รับข้อความแสดงข้อผิดพลาด ทำตามคำแนะนำเพื่อที แต่ไม่มีการเปลี่ยนแปลงในส่วนหน้า ปิดใช้งานแล้วจากนั้นเปิดใช้งานคอมไพเลอร์ใหม่และล้างแคช ฯลฯ
MagentoMac

4

หากคุณต้องการซ่อนไว้ในการนำทางแคตตาล็อกคุณสามารถเพิ่มเงื่อนไข if ในเทมเพลตเพื่อตรวจสอบปริมาณของผลิตภัณฑ์ในหมวดหมู่นั้น


4

บางทีนี่อาจช่วยได้เช่นกัน

ไปที่แบ็กเอนด์ของเว็บช็อปของคุณ

จากนั้นไปที่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;
    }
}

อยู่ที่ไหนในไฟล์นั้น?
MarkE

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 ซึ่งมีจำนวนผลิตภัณฑ์ที่ใช้งานจริง

ฉันใช้โมดูลบุคคลที่สามเพื่อแสดงหมวดหมู่บนเมนูด้านบนและฉันวางเงื่อนไขตามจำนวนผลิตภัณฑ์เมื่อมีการแสดงเมนู

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.