Leere Kategorien in Navigation

von | Aug 4, 2011 | Magento, Shopsysteme, Technologie | 0 Kommentare

Wir mussten gerade feststellen, dass die Methode getProductCount des Kategorie Models nicht so arbeitet, wie man es von ihr erwartet.

Kurze Problembeschreibung:
Unser Problem bestand darin, dass in der Navigation Kategorien aufgetaucht sind, welche eigentlich keine Produkte enthalten. Es waren z.B. 2 Produkte der Kategorie zugewiesen, aber deaktiviert. Der ProductCount gab trotzdem eine Anzahl von 7 Produkten zurück.

Nach kurzer Analyse mussten wir feststellen, dass Produkte, welche in der gleichen Kategorie, aber in einem anderen Store waren, auch mitgezählt wurden. Ein kurzer Blick auf den Query von Magento hat dann auch schon gereicht, um festzustellen, dass weder die Stores noch die Verfügbarkeit der Produkte eine Rolle spielen.

Wir haben den Query um eine Filterung des aktuellen Stores und um eine Prüfung der Verfügbarkeit der Produkte erweitert. Das wollen wir euch natürlich nicht vorenthalten.

Ihr müsst folgendes Resource Model überschreiben: Mage_Catalog_Model_Resource_Eav_Mysql4_Category_Flat

Und hier unsere getProductCount Methode:

public function getProductCount($category)
{
 $productEntityIntTable = (string)Mage::getConfig()->getTablePrefix() . 'catalog_product_entity_int';
  
 $select =  $this->_getReadAdapter()->select()
  ->from(array('p' => $this->getTable('catalog/category_product')), "COUNT(p.product_id)")
  ->joinLeft(array('w' => $this->getTable('catalog/product_website')),'p.product_id = w.product_id')
  ->joinLeft(array('ci' => $this->getTable('cataloginventory/stock_status')),'ci.product_id = p.product_id AND ci.website_id = w.website_id')
  ->joinLeft(array('cpi' => $productEntityIntTable),'cpi.entity_id = p.product_id')
  ->where("p.category_id = ?", $category->getId())
  ->where("w.website_id = ?", Mage::app()->getStore()->getWebsiteId())
  ->where("ci.stock_status = 1")
  ->where("cpi.attribute_id = 84")
  ->where("cpi.value = 1")
  ->group("p.category_id");
   
  return (int) $this->_getReadAdapter()->fetchOne($select);
}

Die „attribute_id“ muss noch durch eure ersetzt werden. Es handelt sich hierbei um das „status“ Attribut der Produkte mit dem Backend Type „catalog/product_status“.

0 Kommentare

Einen Kommentar abschicken

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Consent Management Platform von Real Cookie Banner