Respuestas:
La forma más fácil de hacer esto es reescribir solo el Mage_Catalog_Block_Navigation
bloque:
=> En el método _renderCategoryMenuItemHtml()
que desea reemplazar el bucle
foreach ($children as $child) {
if ($child->getIsActive()) {
$activeChildren[] = $child;
}
}
=> con esto:
foreach ($children as $child) {
if ($child->getIsActive() && $this->_hasProducts($child->entity_id)) {
$activeChildren[] = $child;
}
}
=> y de manera similar en el método renderCategoriesMenuHtml()
reemplaza el código
foreach ($this->getStoreCategories() as $child) {
if ($child->getIsActive()) {
$activeCategories[] = $child;
}
}
=> con esto:
foreach ($this->getStoreCategories() as $child) {
if ($child->getIsActive() && $this->_hasProducts($child->entity_id)) {
$activeCategories[] = $child;
}
}
=> Finalmente agregue el método que estábamos usando en nuestro código:
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;
}
Tenga en cuenta que el método verifica cada categoría individualmente utilizando el modelo de catálogo / categoría. Por lo tanto, si tiene muchas categorías, es posible que desee volver a escribir el código para no tener problemas de rendimiento. En una tienda más pequeña que estamos ejecutando, esto funciona bien.
No hay una función integrada para ocultar categorías vacías (pero puede seleccionar manualmente Está activo = No para cada categoría en el área de administración-> catálogo-> administrar categorías)
Aquí hay un enlace en una gran publicación del blog de Josh Prattski , donde escribió un tutorial paso a paso sobre cómo hacer una extensión para este propósito.
Para ocultar una categoría vacía del menú superior, haga lo siguiente:
Ir a la
app/code/core/Mage/Catalog/Block
carpeta y copiarNavigation.php
.Anular
Navigation.php
en su paquete local. AbraNavigation.php
su paquete y pegue el siguiente código en este archivo:
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;
}
}
Lo que funcionó para mí es crear un árbol de categorías de plantillas e implementar una función de condición que represente el árbol de categorías:
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;
}
Puede ejecutar el siguiente sql para deshabilitar todas las categorías sin productos.
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
Puede encontrar más detalles aquí http://quicktips.ru/all/hide-all-categories-without-products-and-show-categories-with-pr/
lo que hice para ocultar categorías vacías es reescribir la Mage_Catalog_Model_Resource_Category_Tree
load()
función. Tengo que unir la colección de productos con la colección de categorías como a continuación.
$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()));
agregue este código antes de $arrNodes = $this->_conn->fetchAll($select);
esta línea.
Y envuelva este código con esta condición, esta clase llamada desde el modelo de interfaz y backend también
if(!Mage::getSingleton('admin/session')->isLoggedIn())
Agregué un campo extra product_count que contiene el recuento real de productos activos.
Estoy usando un módulo de terceros para mostrar la categoría en el menú superior y puse la condición según el recuento de productos cuando se muestra el menú.