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

22

Есть ли способ скрыть категории, в которых нет активных продуктов? Или, что еще лучше, показывать только категории с активными продуктами и запасами.

BENV
источник
Вопрос в том, хорошая ли это идея. Пользователи смущены, когда они меняют меню.
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;
}

Имейте в виду, что метод проверяет каждую категорию в отдельности, используя модель каталога / категории. Итак, если у вас много категорий, вы можете переписать код, чтобы не столкнуться с проблемами производительности. В небольшом магазине, где мы работаем, это работает нормально.

mpaepper
источник
Можно ли поместить это в расширение, которое можно поместить в локальную папку? Беспокоит код, который будет перезаписан в будущих обновлениях 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;
    }
}
Генри Роджер
источник
Где в этом файле?
Марк
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, которое содержит фактическое количество активных продуктов.

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

Mufaddal
источник