Ví dụ của bạn không đưa giá trị cho "use config" vào tài khoản.
Chúng ta hãy xem cách làm addInStockFilterToCollection
việc:
public function addInStockFilterToCollection($collection)
{
$this->getResource()->setInStockFilterToCollection($collection);
return $this;
}
OK, nó ủy thác cho một phương pháp khác:
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;
}
Điều này tham gia bảng kiểm kê với các điều kiện sau:
Sản phẩm không sử dụng cấu hình toàn cầu VÀ có "quản lý kho" được đặt thành "có" VÀ có trong kho
HOẶC LÀ
Sản phẩm không sử dụng cấu hình toàn cầu VÀ có "quản lý kho" được đặt thành "không"
HOẶC LÀ
- Sản phẩm sử dụng cấu hình toàn cầu VÀ nếu cấu hình toàn cầu là "Manage stock = yes", có trong kho
Bạn cần đảo ngược các điều kiện như sau:
Sản phẩm không sử dụng cấu hình toàn cầu VÀ có "quản lý kho" được đặt thành "có" VÀ không có trong kho
HOẶC LÀ
Sản phẩm sử dụng cấu hình toàn cầu VÀ cấu hình toàn cầu là "Manage stock = yes" VÀ không có trong kho
Giải thích: Bạn chỉ lấy các điều kiện trong đó in_stock thực sự được kiểm tra và thay đổi so sánh thành 0. Các điều kiện trong đó không kiểm tra in_stock ("Manage stock" = "no") có nghĩa là sản phẩm luôn trong kho, bất kể trạng thái tồn kho , vì vậy chúng tôi không đưa chúng vào truy vấn "hết hàng".
Đây là mã của bạn:
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;
}