In Ihrem Beispiel wird der Wert für "use config" nicht berücksichtigt.
Schauen wir uns an, wie es addInStockFilterToCollection
funktioniert:
public function addInStockFilterToCollection($collection)
{
$this->getResource()->setInStockFilterToCollection($collection);
return $this;
}
OK, es wird an eine andere Methode delegiert:
public function setInStockFilterToCollection($collection)
{
$manageStock = Mage::getStoreConfig(Mage_CatalogInventory_Model_Stock_Item::XML_PATH_MANAGE_STOCK);
$cond = array(
'{{table}}.use_config_manage_stock = 0 AND {{table}}.manage_stock=1 AND {{table}}.is_in_stock=1',
'{{table}}.use_config_manage_stock = 0 AND {{table}}.manage_stock=0',
);
if ($manageStock) {
$cond[] = '{{table}}.use_config_manage_stock = 1 AND {{table}}.is_in_stock=1';
} else {
$cond[] = '{{table}}.use_config_manage_stock = 1';
}
$collection->joinField(
'inventory_in_stock',
'cataloginventory/stock_item',
'is_in_stock',
'product_id=entity_id',
'(' . join(') OR (', $cond) . ')'
);
return $this;
}
Dies verbindet die Inventartabelle mit den folgenden Bedingungen:
Das Produkt verwendet keine globale Konfiguration UND hat "Lager verwalten" auf "Ja" gesetzt UND ist auf Lager
ODER
Das Produkt verwendet keine globale Konfiguration UND hat "Lagerverwaltung" auf "Nein" gesetzt.
ODER
- Produkt verwendet globale Konfiguration UND wenn die globale Konfiguration "Lager verwalten = Ja" lautet, ist es auf Lager
Sie müssen die Bedingungen wie folgt umkehren:
Das Produkt verwendet keine globale Konfiguration UND hat "Lager verwalten" auf "Ja" gesetzt UND ist nicht auf Lager
ODER
Das Produkt verwendet die globale Konfiguration UND die globale Konfiguration lautet "Lager verwalten = Ja" UND ist nicht auf Lager
Erläuterung: Sie nehmen nur die Bedingungen, unter denen der Lagerbestand tatsächlich geprüft wird, und ändern den Vergleich auf 0. Die Bedingungen, unter denen der Lagerbestand nicht geprüft wird ("Lager verwalten" = "nein"), bedeuten, dass das Produkt unabhängig vom Lagerstatus immer auf Lager ist Daher nehmen wir sie nicht in unsere Abfrage "Nicht vorrätig" auf.
Dann ist dies Ihr Code:
public function setOutOfStockFilterToCollection($collection)
{
$manageStock = Mage::getStoreConfig(Mage_CatalogInventory_Model_Stock_Item::XML_PATH_MANAGE_STOCK);
$cond = array(
'{{table}}.use_config_manage_stock = 0 AND {{table}}.manage_stock=1 AND {{table}}.is_in_stock=0'
);
if ($manageStock) {
$cond[] = '{{table}}.use_config_manage_stock = 1 AND {{table}}.is_in_stock=0';
}
$collection->joinField(
'inventory_in_stock',
'cataloginventory/stock_item',
'is_in_stock',
'product_id=entity_id',
'(' . join(') OR (', $cond) . ')'
);
return $this;
}