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“.
Super! Willst du nicht einen patch commiten?
LG. Vinai
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?
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
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.