Nascondi categorie senza prodotti attivi


22

C'è un modo per nascondere le categorie che non hanno prodotti attivi? O, ancora meglio, mostra solo le categorie che hanno prodotti e scorte attivi .


La domanda è se questa è una buona idea. Gli utenti sono confusi quando cambiano il menu.
MiMo,

Risposte:


11

Il modo più semplice per farlo è solo riscrivere il Mage_Catalog_Block_Navigationblocco:

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


È possibile racchiuderlo in un'estensione che può essere rilasciata nella cartella locale? Preoccupato per il codice che verrà sovrascritto nei futuri aggiornamenti di Magento.
MagentoMac,

10

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.


Questo sembra buono, ma per qualsiasi motivo non funziona nel nostro negozio ... qualche idea su come eseguire il debug? Non viene visualizzato alcun messaggio di errore. Seguito le istruzioni per un tee, ma nessun cambiamento nel frontend. Ho già disabilitato, quindi riattivato il compilatore e cancellato la cache, ecc.
MagentoMac,

4

Se desideri semplicemente nasconderli nella navigazione del catalogo, puoi aggiungere una condizione if nel modello per verificare la quantità di prodotti in quella categoria.


4

Forse anche questo sarebbe d'aiuto.

Vai al backend del tuo negozio online.

Quindi Catalog > Category > Manage Category, scegli la tua categoria e seleziona la Display settingsscheda.

L'etichetta Display Modepotrebbe essere impostata su

Show static block only.


4

Per nascondere una categoria vuota dal menu principale, procedi come segue:

Vai a app/code/core/Mage/Catalog/BlockCartella e copia Navigation.php.

Sostituisci Navigation.phpnel tuo pacchetto locale. Apri il Navigation.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;
    }
}

Dove in quel file?
MarkE

3

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;
}

2

È 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/


2

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.