Leere Kategorien in Navigation

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

4 Kommentare
  • Avatar

    Hat bei mir gut funktioniert, danke.

    Ich habe den Stock-Part rausgelassen, da in unserem Shop auch Produkte angezeigt werden, die Out of Stock sind.

  • Avatar

    Das überschreiben eines Resource Models funktioniert genauso, wie bei einem normalen, nur das der Namespace meist „resource“ oder „mysql4“ noch beinhaltet.

    Hier das XML um das oben genannte Resource Model zu überschreiben.

    http://pastebin.com/6PAd6UD1

  • Avatar

    Ich stehe hier total im Wald. Gibt es irgendwo eine gute Anleitung, wie man ein Resource Model überschreibt? Ich habe jetzt schon einige Tutorials durch, aber diese Methode zu überschreiben will einfach nicht funktionieren..

    Oder könntest du evtl. die entsprechenden Dateien bereitstellen?

  • Avatar

    Super! Willst du nicht einen patch commiten?
    LG. Vinai

Hinterlassen Sie einen Kommentar

Ihr Kommentar*

Name*
Website

Weitere Beiträge zum Thema
Magento-Extension: Feedback Dialog
FeedReader und GoogleWebmasterTools Extension für Magento
Progressive Web Apps: Nichts für kleine und mittlere Unternehmen (KMU)?
Magento 2 und der „progressive“ Weg zur Web App