Odpowiedzi:
Najłatwiej to zrobić tylko przepisując Mage_Catalog_Block_Navigation
blok:
=> W metodzie, _renderCategoryMenuItemHtml()
którą chcesz zastąpić pętlę
foreach ($children as $child) {
if ($child->getIsActive()) {
$activeChildren[] = $child;
}
}
=> z tym:
foreach ($children as $child) {
if ($child->getIsActive() && $this->_hasProducts($child->entity_id)) {
$activeChildren[] = $child;
}
}
=> i podobnie w metodzie renderCategoriesMenuHtml()
zamień kod
foreach ($this->getStoreCategories() as $child) {
if ($child->getIsActive()) {
$activeCategories[] = $child;
}
}
=> z tym:
foreach ($this->getStoreCategories() as $child) {
if ($child->getIsActive() && $this->_hasProducts($child->entity_id)) {
$activeCategories[] = $child;
}
}
=> Na koniec dodaj metodę, której właśnie używaliśmy w naszym kodzie:
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;
}
Należy pamiętać, że metoda sprawdza każdą kategorię indywidualnie za pomocą modelu katalogu / kategorii. Jeśli masz wiele kategorii, możesz przepisać kod, aby nie napotkać problemów z wydajnością. W mniejszym sklepie, który prowadzimy, to działa dobrze.
Nie ma wbudowanej funkcji ukrywania pustych kategorii (ale możesz ręcznie wybrać Jest aktywny = Nie dla każdej kategorii w obszarze administracyjnym-> katalog-> zarządzaj kategoriami)
Oto link do świetnego postu z bloga Josha Prattskiego , w którym napisał krok po kroku poradnik jak zrobić rozszerzenie w tym celu.
Aby ukryć pustą kategorię w górnym menu, wykonaj następujące czynności:
Przejdź do
app/code/core/Mage/Catalog/Block
folderu i skopiujNavigation.php
.Zastąp
Navigation.php
w pakiecie lokalnym. OtwórzNavigation.php
swój pakiet i wklej następujący kod w tym pliku:
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;
}
}
Dla mnie zadziałało utworzenie drzewa kategorii szablonów i zaimplementowanie funkcji warunku, która renderuje drzewo kategorii:
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;
}
Możesz wykonać następujące polecenie SQL, aby wyłączyć wszystkie kategorie bez produktów.
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
Więcej informacji można znaleźć tutaj http://quicktips.ru/all/hide-all-categories-without-products-and-show-categories-with-pr/
To, co zrobiłem, aby ukryć puste kategorie, to przepisanie Mage_Catalog_Model_Resource_Category_Tree
load()
funkcji. Muszę połączyć kolekcję produktów z kolekcją kategorii jak poniżej.
$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()));
dodaj ten kod wcześniej $arrNodes = $this->_conn->fetchAll($select);
tym wierszem.
I zawiń ten kod w ten warunek, również w tej klasie wywoływanej z frontendu i modelu backendu
if(!Mage::getSingleton('admin/session')->isLoggedIn())
Dodałem dodatkowe pole liczba_produktu, które zawiera rzeczywistą liczbę aktywnych produktów.
Korzystam z zewnętrznego modułu do wyświetlania kategorii w górnym menu i ustawiam warunek na podstawie liczby produktów podczas wyświetlania menu.