Kategorien ohne aktive Produkte ausblenden

22

Gibt es eine Möglichkeit, Kategorien auszublenden, in denen keine aktiven Produkte vorhanden sind? Oder, noch besser, nur Kategorien anzeigen, die aktive Produkte und Lagerbestände haben.

BenV
quelle
Die Frage ist, ob dies eine gute Idee ist. Benutzer sind verwirrt, wenn sie das Menü ändern.
MiMo

Antworten:

11

Der einfachste Weg, dies zu tun, besteht darin, nur den Mage_Catalog_Block_NavigationBlock neu zu schreiben :

=> In der Methode _renderCategoryMenuItemHtml()möchten Sie die Schleife ersetzen

foreach ($children as $child) {
    if ($child->getIsActive()) {
        $activeChildren[] = $child;
    }
}

=> damit:

    foreach ($children as $child) {
        if ($child->getIsActive() && $this->_hasProducts($child->entity_id)) {
            $activeChildren[] = $child;
        }
    }

=> und in ähnlicher Weise in der Methode renderCategoriesMenuHtml()den Code ersetzen

 foreach ($this->getStoreCategories() as $child) {
        if ($child->getIsActive()) {
            $activeCategories[] = $child;
        }
    }

=> damit:

    foreach ($this->getStoreCategories() as $child) {
        if ($child->getIsActive() && $this->_hasProducts($child->entity_id)) {
            $activeCategories[] = $child;
        }
    }

=> Füge zum Schluss die Methode hinzu, die wir gerade in unserem Code verwendet haben:

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

Beachten Sie, dass die Methode jede Kategorie einzeln anhand des Katalog- / Kategoriemodells überprüft. Wenn Sie also über viele Kategorien verfügen, möchten Sie möglicherweise den Code neu schreiben, um Leistungsprobleme zu vermeiden. In einem kleineren Laden, den wir betreiben, funktioniert das einwandfrei.

mpaepper
quelle
Ist es möglich, dies in eine Erweiterung einzupacken, die in einem lokalen Ordner abgelegt werden kann? Besorgt darüber, dass der Code in zukünftigen Magento-Updates überschrieben wird.
MagentoMac
10

Es gibt keine integrierte Funktion zum Ausblenden leerer Kategorien (Sie können jedoch manuell Is active = No für jede Kategorie in Admin-Bereich-> Katalog-> Kategorien verwalten auswählen.)

Hier ist ein Link zu einem großartigen Beitrag aus Josh Prattskis Blog , in dem er Schritt für Schritt erklärt, wie man eine Erweiterung für diesen Zweck erstellt.

Sergei Guk
quelle
Das sieht gut aus, aber aus irgendeinem Grund funktioniert es in unserem Shop nicht ... Gibt es Ideen zum Debuggen? Es werden keine Fehlermeldungen angezeigt. Befolgen Sie die Anweisungen zu einem Abschlag, aber keine Änderung im Frontend. Haben Sie bereits deaktiviert, dann Compiler wieder aktiviert und Cache usw.
geleert
4

Wenn Sie sie nur in der Katalognavigation ausblenden möchten, können Sie der Vorlage eine if-Bedingung hinzufügen, um die Anzahl der Produkte in dieser Kategorie zu überprüfen.

Tobias
quelle
4

Vielleicht würde das auch helfen.

Gehen Sie zum Backend Ihres Webshops.

Dann Catalog > Category > Manage Categorywählen Sie Ihre Kategorie, und die wählen Display settingsRegisterkarte.

Das Label Display Modekönnte auf gesetzt sein

Show static block only.

julianisch
quelle
4

Gehen Sie wie folgt vor, um eine leere Kategorie im Hauptmenü auszublenden:

Gehe in den app/code/core/Mage/Catalog/BlockOrdner und kopiere Navigation.php.

Überschreiben Sie Navigation.phpin Ihrem lokalen Paket. Öffnen Sie Navigation.php Ihr Paket und fügen Sie den folgenden Code in diese Datei ein:

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
quelle
Wo in dieser Datei?
Markieren Sie den
3

Für mich hat es funktioniert, einen Vorlagen-Kategoriebaum zu erstellen und eine Bedingungsfunktion zu implementieren, die den Kategoriebaum darstellt:

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
quelle
2

Sie können folgendes SQL ausführen, um alle Kategorien ohne Produkte zu deaktivieren.

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

Weitere Details finden Sie hier http://quicktips.ru/all/hide-all-categories-without-products-and-show-categories-with-pr/

Denis Óbukhov
quelle
2

Was ich getan habe, um leere Kategorien auszublenden, ist die Mage_Catalog_Model_Resource_Category_Tree load()Funktion neu zu schreiben . Ich muss mich der Produktsammlung mit der Kategoriesammlung wie unten anschließen.

    $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()));

Fügen Sie diesen Code vor $arrNodes = $this->_conn->fetchAll($select);dieser Zeile ein.

Und schließen Sie diesen Code mit dieser Bedingung ab, die auch vom Frontend- und Backend-Modell aufgerufen wird

  if(!Mage::getSingleton('admin/session')->isLoggedIn())

Ich habe ein zusätzliches Feld product_count hinzugefügt, das die tatsächliche Anzahl der aktiven Produkte enthält.

Ich verwende ein Modul eines Drittanbieters, um die Kategorie im oberen Menü anzuzeigen, und habe die Bedingung basierend auf der Anzahl der Produkte festgelegt, wenn das Menü gerendert wird.

Mufaddal
quelle