Existe-t-il un moyen de masquer les catégories qui n'ont pas de produits actifs? Ou, mieux encore, n'affiche que les catégories qui ont des produits et des stocks actifs .
Existe-t-il un moyen de masquer les catégories qui n'ont pas de produits actifs? Ou, mieux encore, n'affiche que les catégories qui ont des produits et des stocks actifs .
Réponses:
La façon la plus simple de le faire est de réécrire uniquement le Mage_Catalog_Block_Navigation
bloc:
=> Dans la méthode que _renderCategoryMenuItemHtml()
vous souhaitez remplacer la boucle
foreach ($children as $child) {
if ($child->getIsActive()) {
$activeChildren[] = $child;
}
}
=> avec ceci:
foreach ($children as $child) {
if ($child->getIsActive() && $this->_hasProducts($child->entity_id)) {
$activeChildren[] = $child;
}
}
=> et de même dans la méthode renderCategoriesMenuHtml()
remplacer le code
foreach ($this->getStoreCategories() as $child) {
if ($child->getIsActive()) {
$activeCategories[] = $child;
}
}
=> avec ceci:
foreach ($this->getStoreCategories() as $child) {
if ($child->getIsActive() && $this->_hasProducts($child->entity_id)) {
$activeCategories[] = $child;
}
}
=> Enfin, ajoutez la méthode que nous venions d'utiliser dans notre code:
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;
}
Gardez à l'esprit que la méthode vérifie chaque catégorie individuellement en utilisant le modèle de catalogue / catégorie. Donc, si vous avez plusieurs catégories, vous voudrez peut-être réécrire le code pour ne pas rencontrer de problèmes de performances. Dans un petit magasin que nous exploitons, cela fonctionne bien.
Il n'y a pas de fonction intégrée pour masquer les catégories vides (mais vous pouvez sélectionner manuellement Est actif = Non pour chaque catégorie dans la zone d'administration-> catalogue-> gérer les catégories)
Voici un lien sur un excellent article du blog de Josh Prattski , où il a écrit une procédure pas à pas sur la façon de créer une extension à cet effet.
Pour masquer une catégorie vide du menu principal, procédez comme suit:
Accédez au
app/code/core/Mage/Catalog/Block
dossier et copiezNavigation.php
.Remplacez
Navigation.php
votre package local. OuvrezNavigation.php
votre package et collez le code suivant dans ce fichier:
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;
}
}
Ce qui a fonctionné pour moi, c'est de créer une arborescence de catégories de modèles et d'implémenter une fonction de condition qui rend l'arborescence de catégories:
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;
}
Vous pouvez exécuter sql suivant pour désactiver toutes les catégories sans produits.
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
Plus de détails vous pouvez trouver ici http://quicktips.ru/all/hide-all-categories-without-products-and-show-categories-with-pr/
ce que j'ai fait pour cacher les catégories vides, c'est réécrire la Mage_Catalog_Model_Resource_Category_Tree
load()
fonction. Je dois rejoindre la collection de produits avec la collection de catégories comme ci-dessous.
$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()));
ajoutez ce code avant $arrNodes = $this->_conn->fetchAll($select);
cette ligne.
Et enveloppez ce code avec cette condition, cette classe appelée aussi à partir du modèle frontend et backend
if(!Mage::getSingleton('admin/session')->isLoggedIn())
J'ai ajouté le champ product_count supplémentaire qui contient le nombre réel de produits actifs.
J'utilise un module tiers pour afficher la catégorie dans le menu supérieur et j'ai mis une condition basée sur le nombre de produits lorsque le menu est rendu.