Masquer les catégories sans produits actifs

22

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 .

BenV
la source
La question est de savoir si c'est une bonne idée. Les utilisateurs sont confus lorsqu'ils modifient le menu.
MiMo

Réponses:

11

La façon la plus simple de le faire est de réécrire uniquement le Mage_Catalog_Block_Navigationbloc:

=> 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.

mpaepper
la source
Est-il possible de placer cela dans une extension qui peut être déposée dans un dossier local? Inquiet que le code soit écrasé dans les futures mises à jour de Magento.
MagentoMac
10

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.

Sergei Guk
la source
Cela semble bon, mais pour une raison quelconque ne fonctionne pas dans notre magasin ... des idées sur la façon de déboguer? Pas de message d'erreur. J'ai suivi les instructions pour un tee-shirt, mais aucun changement dans le frontend. Ont déjà désactivé, puis
réactivé le
4

Si vous souhaitez simplement les masquer dans la navigation dans le catalogue, vous pouvez ajouter une condition if dans le modèle pour vérifier la quantité de produits dans cette catégorie.

Tobias
la source
4

Peut-être que cela aiderait aussi.

Accédez au backend de votre boutique en ligne.

Ensuite Catalog > Category > Manage Category, choisissez votre catégorie et sélectionnez l' Display settingsonglet.

L'étiquette Display Modepeut être définie sur

Show static block only.

julien
la source
4

Pour masquer une catégorie vide du menu principal, procédez comme suit:

Accédez au app/code/core/Mage/Catalog/Blockdossier et copiez Navigation.php.

Remplacez Navigation.phpvotre package local. Ouvrez Navigation.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;
    }
}
Henry Roger
la source
Où dans ce dossier?
MarkE
3

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;
}
Torrence Blanche
la source
2

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/

Denis Óbukhov
la source
2

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.

Mufaddal
la source