Votre exemple ne prend pas en compte la valeur "use config".
Voyons comment cela addInStockFilterToCollection
fonctionne:
public function addInStockFilterToCollection($collection)
{
$this->getResource()->setInStockFilterToCollection($collection);
return $this;
}
OK, il délègue à une autre méthode:
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;
}
Cela rejoint la table d'inventaire avec les conditions suivantes:
Le produit n'utilise pas la configuration globale ET a "gérer le stock" réglé sur "oui" ET est en stock
OU
Le produit n'utilise pas la configuration globale ET a "gérer le stock" défini sur "non"
OU
- Le produit utilise la configuration globale ET si la configuration globale est "gérer le stock = oui", est en stock
Vous devez inverser les conditions comme suit:
Le produit n'utilise pas la configuration globale ET a "gérer le stock" défini sur "oui" ET n'est pas en stock
OU
Le produit utilise la configuration globale ET la configuration globale est "gérer le stock = oui" ET n'est pas en stock
Explication: Vous prenez uniquement les conditions dans lesquelles in_stock est réellement vérifié et changez la comparaison à 0. Les conditions dans lesquelles in_stock n'est pas vérifiée ("gérer le stock" = "non") signifient que le produit est toujours en stock, quel que soit l'état du stock , nous ne les incluons donc pas dans notre requête "rupture de stock".
Alors voici votre 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;
}