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.
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.
Antworten:
Der einfachste Weg, dies zu tun, besteht darin, nur den Mage_Catalog_Block_Navigation
Block 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.
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.
Vielleicht würde das auch helfen.
Gehen Sie zum Backend Ihres Webshops.
Dann
Catalog > Category > Manage Category
wählen Sie Ihre Kategorie, und die wählenDisplay settings
Registerkarte.
Das Label Display Mode
könnte auf gesetzt sein
Show static block only
.
Gehen Sie wie folgt vor, um eine leere Kategorie im Hauptmenü auszublenden:
Gehe in den
app/code/core/Mage/Catalog/Block
Ordner und kopiereNavigation.php
.Überschreiben Sie
Navigation.php
in Ihrem lokalen Paket. Öffnen SieNavigation.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;
}
}
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;
}
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/
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.