Yanıtlar:
Bunu yapmanın en kolay yolu, yalnızca Mage_Catalog_Block_Navigation
bloğu yeniden yazmaktır :
=> Döngü değiştirmek istediğiniz yöntemde_renderCategoryMenuItemHtml()
foreach ($children as $child) {
if ($child->getIsActive()) {
$activeChildren[] = $child;
}
}
=> bununla:
foreach ($children as $child) {
if ($child->getIsActive() && $this->_hasProducts($child->entity_id)) {
$activeChildren[] = $child;
}
}
=> ve benzer şekilde yöntemde renderCategoriesMenuHtml()
kodu değiştirin
foreach ($this->getStoreCategories() as $child) {
if ($child->getIsActive()) {
$activeCategories[] = $child;
}
}
=> bununla:
foreach ($this->getStoreCategories() as $child) {
if ($child->getIsActive() && $this->_hasProducts($child->entity_id)) {
$activeCategories[] = $child;
}
}
=> Sonunda sadece kodumuzda kullandığımız yöntemi ekleyin:
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;
}
Katalog / kategori modelini kullanarak, yöntemin her kategoriyi ayrı ayrı kontrol ettiğini unutmayın. Bu nedenle, çok fazla kategoriniz varsa, performans sorunlarıyla karşılaşmamak için kodu yeniden yazmak isteyebilirsiniz. Daha küçük bir mağazada koşuyoruz, bu iyi çalışıyor.
Boş kategorileri gizlemek için yerleşik bir özellik yoktur (ancak el ile aktif seçeneğini seçebilirsiniz = Yönetici alanı-> katalog-> kategori kategorilerinde her kategori için Hayır)
İşte Josh Prattski'nin bloğundan çıkan ve bu amaçla nasıl genişletilebileceği konusunda adım adım ilerlemiş olduğu bir yazı.
Boş bir kategoriyi Üst menüden gizlemek için aşağıdakileri yapın:
app/code/core/Mage/Catalog/Block
Klasöre git ve kopyalaNavigation.php
.
Navigation.php
Yerel paketinizde geçersiz kılın .Navigation.php
Paketinizi açın ve aşağıdaki kodu bu dosyaya yapıştırın:
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;
}
}
Benim için işe yarayan şey, bir şablon kategori ağacı oluşturmak ve kategori ağacını oluşturan bir koşul işlevi uygulamaktır:
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;
}
Ürünler olmadan tüm kategorileri devre dışı bırakmak için aşağıdaki sql'yi çalıştırabilirsiniz.
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
Daha fazla bilgiyi burada bulabilirsiniz: http://quicktips.ru/all/hide-all-category-
boş kategorileri gizlemek için yaptığım, Mage_Catalog_Model_Resource_Category_Tree
load()
işlevi yeniden yazmaktır . Ürün koleksiyonuna aşağıdaki kategori koleksiyonuyla katıldım.
$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()));
bu kodu $arrNodes = $this->_conn->fetchAll($select);
bu satırdan önce ekleyin .
Ve bu koşulu bu koda sarın, bu sınıf ön uç ve arka uç modelinden çağrıldı.
if(!Mage::getSingleton('admin/session')->isLoggedIn())
Gerçek aktif ürün sayısını içeren ekstra alan product_count'u ekledim.
Üst menüde kategoriyi görüntülemek için bir 3. parti modül kullanıyorum ve menü oluşturulduğunda ürün sayısına göre koşul koydum.