Відповіді:
Найпростіший спосіб зробити це лише переписати 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;
}
Майте на увазі, що метод перевіряє кожну категорію індивідуально, використовуючи модель каталогу / категорії. Отже, якщо у вас багато категорій, ви можете переписати код, щоб не виникати проблем з продуктивністю. У меншому магазині, де ми працюємо, це прекрасно працює.
Немає вбудованої функції для приховування порожніх категорій (але ви можете вручну вибрати Активна = Ні для кожної категорії в області адміністратора-> каталог-> керувати категоріями)
Ось посилання на чудовий допис із блогу Джоша Пратцького , де він написав покрокову інструкцію про те, як зробити розширення для цієї мети.
Щоб приховати порожню категорію у верхньому меню, виконайте наступне:
Перейдіть до
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;
}
}
Для мене працювало - створити дерево категорій шаблонів та реалізувати функцію умови, яка надає дерево категорій:
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;
}
Ви можете виконати наступний 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/
те, що я зробив, щоб приховати порожні категорії, - це переписати 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, який містить фактичну кількість активних продуктів.
Я використовую сторонній модуль для відображення категорії у верхньому меню, і я поставив умову на основі кількості продуктів, коли меню надається.