Risposte:
Il modo più semplice per farlo è solo riscrivere il Mage_Catalog_Block_Navigation
blocco:
=> Nel metodo che _renderCategoryMenuItemHtml()
si desidera sostituire il ciclo
foreach ($children as $child) {
if ($child->getIsActive()) {
$activeChildren[] = $child;
}
}
=> con questo:
foreach ($children as $child) {
if ($child->getIsActive() && $this->_hasProducts($child->entity_id)) {
$activeChildren[] = $child;
}
}
=> e allo stesso modo nel metodo renderCategoriesMenuHtml()
sostituire il codice
foreach ($this->getStoreCategories() as $child) {
if ($child->getIsActive()) {
$activeCategories[] = $child;
}
}
=> con questo:
foreach ($this->getStoreCategories() as $child) {
if ($child->getIsActive() && $this->_hasProducts($child->entity_id)) {
$activeCategories[] = $child;
}
}
=> Infine aggiungi il metodo che stavamo usando nel nostro codice:
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;
}
Tenere presente che il metodo controlla ciascuna categoria singolarmente utilizzando il modello catalogo / categoria. Quindi, se hai molte categorie, potresti voler riscrivere il codice per non incorrere in problemi di prestazioni. In un negozio più piccolo che stiamo gestendo, funziona benissimo.
Non esiste una funzione integrata per nascondere le categorie vuote (ma è possibile selezionare manualmente È attivo = No per ogni categoria nell'area di amministrazione-> catalogo-> gestisci categorie)
Ecco un link su un ottimo post dal blog di Josh Prattski , in cui ha scritto una procedura dettagliata su come realizzare un'estensione per questo scopo.
Per nascondere una categoria vuota dal menu principale, procedi come segue:
Vai a
app/code/core/Mage/Catalog/Block
Cartella e copiaNavigation.php
.Sostituisci
Navigation.php
nel tuo pacchetto locale. Apri ilNavigation.php
tuo pacchetto e incolla il seguente codice in questo file:
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;
}
}
Quello che ha funzionato per me è creare un albero delle categorie di template e implementare una funzione condition che renda l'albero delle categorie:
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;
}
È possibile eseguire il seguente sql per disabilitare tutte le categorie senza prodotti.
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
Maggiori dettagli puoi trovare qui http://quicktips.ru/all/hide-all-categories-without-products-and-show-categories-with-pr/
quello che ho fatto per nascondere categorie vuote è riscrivere la Mage_Catalog_Model_Resource_Category_Tree
load()
funzione. Devo unire la raccolta di prodotti con la raccolta di categorie come di seguito.
$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()));
aggiungi questo codice prima di $arrNodes = $this->_conn->fetchAll($select);
questa riga.
E avvolgi questo codice con questa condizione, anche questa classe chiamata dal modello frontend e backend
if(!Mage::getSingleton('admin/session')->isLoggedIn())
Ho aggiunto un campo extra product_count che contiene il conteggio effettivo dei prodotti attivi.
Sto usando un modulo di terze parti per visualizzare la categoria nel menu in alto e ho impostato le condizioni in base al conteggio del prodotto quando viene visualizzato il menu.