Ваш приклад не враховує значення для "config config".
Давайте подивимось, як addInStockFilterToCollection
працює:
public function addInStockFilterToCollection($collection)
{
$this->getResource()->setInStockFilterToCollection($collection);
return $this;
}
Гаразд, це делегування іншого методу:
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;
}
Це приєднується до таблиці інвентаризації з такими умовами:
Продукт не використовує глобальну конфігурацію І має "керувати запасами", встановлений на "так" І є на складі
АБО
Продукт не використовує глобальну конфігурацію І встановлено "управління запасом" на "ні"
АБО
- Продукт використовує глобальну конфігурацію ТА, якщо глобальна конфігурація "керувати запасом = так", є на складі
Ви повинні перевернути умови таким чином:
Продукт не використовує глобальну конфігурацію. І "керувати запасами" встановлено на "так" І немає на складі
АБО
Продукт використовує глобальну конфігурацію І глобальна конфігурація - "керувати запасом = так" І відсутня на складі
Пояснення: Ви приймаєте лише умови, коли фактично перевіряється in_stock, і змінюєте порівняння на 0. Умови, коли in_stock не перевіряється ("керувати запасами" = "ні") означають, що продукт завжди є на складі, незалежно від стану запасу , тому ми не включаємо їх у наш запит "немає в наявності".
Тоді це ваш код:
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;
}