В вашем примере не учитывается значение «use 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 не проверяется ("manage stock" = "no"), означают, что товар всегда есть в наличии, независимо от состояния запаса. поэтому мы не включаем их в наш запрос "нет в наличии".
Тогда это ваш код:
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;
}