Сховати категорії без активних продуктів


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

Немає вбудованої функції для приховування порожніх категорій (але ви можете вручну вибрати Активна = Ні для кожної категорії в області адміністратора-> каталог-> керувати категоріями)

Ось посилання на чудовий допис із блогу Джоша Пратцького , де він написав покрокову інструкцію про те, як зробити розширення для цієї мети.


Це виглядає добре, але з будь-якої причини не працює в нашому магазині ... будь-які ідеї як налагодити? Не отримує жодних повідомлень про помилки. Дотримуйтесь вказівок до трійника, але фронтенду немає. Вже відключили, потім знову ввімкнули компілятор і очистили кеш тощо.
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, який містить фактичну кількість активних продуктів.

Я використовую сторонній модуль для відображення категорії у верхньому меню, і я поставив умову на основі кількості продуктів, коли меню надається.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.