Twój przykład nie uwzględnia wartości „use config”.
Zobaczmy, jak addInStockFilterToCollection
działa:
public function addInStockFilterToCollection($collection)
{
$this->getResource()->setInStockFilterToCollection($collection);
return $this;
}
OK, deleguje na inną metodę:
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;
}
To łączy tabelę zapasów z następującymi warunkami:
Produkt nie korzysta z konfiguracji globalnej ORAZ ma „zarządzaj zapasami” ustawioną na „tak” ORAZ jest w magazynie
LUB
Produkt nie korzysta z konfiguracji globalnej ORAZ ma opcję „zarządzaj zapasami” ustawioną na „nie”
LUB
- Produkt korzysta z konfiguracji globalnej ORAZ, jeśli konfiguracja globalna to „zarządzaj zapasami = tak”, jest dostępna
Musisz odwrócić warunki w następujący sposób:
Produkt nie korzysta z konfiguracji globalnej ORAZ ma opcję „zarządzaj zapasami” ustawioną na „tak” ORAZ nie ma na magazynie
LUB
Produkt korzysta z konfiguracji globalnej ORAZ konfiguracja globalna to „zarządzaj zapasem = tak” ORAZ nie ma jej w magazynie
Objaśnienie: Przyjmujesz tylko warunki, w których in_stock jest faktycznie sprawdzany, i zmieniasz porównanie na 0. Warunki, w których in_stock nie jest sprawdzany („zarządzanie zapasem” = „nie”) oznaczają, że produkt jest zawsze w magazynie, niezależnie od stanu zapasów , więc nie uwzględniamy ich w zapytaniu „brak w magazynie”.
To jest twój kod:
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;
}