Làm cách nào để có được bộ sưu tập sản phẩm hết hàng - ngược lại với addInStockFilterToCollection ()?


9

Tôi có một yêu cầu để hiển thị các sản phẩm của một danh mục trong hai danh sách - một cho các mặt hàng trong kho, còn lại cho các mặt hàng trong kho.

Tôi đang sử dụng

Mage::getSingleton('cataloginventory/stock')->addInStockFilterToCollection()

để lọc bộ sưu tập sản phẩm của tôi cho các mặt hàng trong kho, nhưng dường như không có một phương pháp tương đương để lọc ra khỏi các mặt hàng trong kho - Tôi đã xem Mage_CatalogInventory_Model_Stockmô hình, đó là nơi xác định phương pháp đã nói ở trên.

Tôi đã thấy ví dụ sau để lấy ra khỏi các sản phẩm chứng khoán:

$collection->joinField(
                    'is_in_stock',
                    'cataloginventory/stock_item',
                    'is_in_stock',
                    'product_id=entity_id',
                    '{{table}}.stock_id=1',
                    'left'
            )
            ->addAttributeToFilter('is_in_stock', array('eq' => 0));

... nhưng chắc chắn đây không phải là cách duy nhất hay tốt nhất để đạt được điều này?

Câu trả lời:


3

giả sử đó $collectionlà bộ sưu tập sản phẩm của bạn mà bạn xây dựng như thế này:

$collection = Mage::getModel('catalog/product')->getCollection()
    ->...additional filters here...;

Bây giờ làm điều này để bộ sưu tập của bạn. Điều này tham gia bộ sưu tập với bảng trạng thái chứng khoán.

$website = Mage::app()->getWebsite();
Mage::getModel('cataloginventory/stock_status')->addStockStatusToSelect($collection, $website);

Bây giờ bạn có thể lọc ra khỏi các sản phẩm chứng khoán:

$collection->getSelect()->where('stock_status.stock_status = ?', 0);

Điều này có hoạt động không, bất kể tùy chọn cấu hình nào được đặt cho kho của mỗi sản phẩm? (Ví dụ: một sản phẩm không được quản lý trong kho hoặc hết hàng?)
BrynJ

Nó nên hoạt động, bởi vì bảng chứng khoán được lập chỉ mục và nó sẽ tính đến tất cả các cài đặt có thể. Bạn chỉ cần đảm bảo chỉ số chứng khoán của bạn được cập nhật
Marius

Cảm ơn về lời xác nhận. Đây có vẻ là một cách tiếp cận "nhẹ" tốt đẹp để có được dữ liệu này.
BrynJ

Sử dụng bảng chỉ số trạng thái chứng khoán thay vì bảng mục chứng khoán thực sự là giải pháp tốt nhất.
Fabian Schmengler

Tôi đã phải gửi sản phẩm chọn làm đối số đầu tiên cho hàm Mage :: getModel ('cataloginventory / stock_status') -> addStockStatusToSelect ($ sưu tập-> getSelect (), $ website);
minlare

2

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 addInStockFilterToCollectionviệ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:

  1. Sản phẩm không sử dụng cấu hình toàn cầu có "quản lý kho" được đặt thành "có" có trong kho

    HOẶC LÀ

  2. Sản phẩm không sử dụng cấu hình toàn cầu có "quản lý kho" được đặt thành "không"

    HOẶC LÀ

  3. Sản phẩm sử dụng cấu hình toàn cầu 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:

  1. Sản phẩm không sử dụng cấu hình toàn cầu có "quản lý kho" được đặt thành "có" không có trong kho

    HOẶC LÀ

  2. Sản phẩm sử dụng cấu hình toàn cầu cấu hình toàn cầu là "Manage stock = yes" 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;
}

Câu trả lời rất chi tiết. Vì vậy, bạn đề nghị tạo một mô-đun cho việc này, để mở rộng Mage_CatalogInventory_Model_Stockmô hình?
BrynJ

1
Không viết lại hoặc mở rộng. Bạn có thể đặt phương pháp này ở bất cứ đâu vì nó không sử dụng $this. Nó cũng có thể là chức năng đơn giản. Tôi sẽ tạo một mô-đun riêng và biến nó thành phương thức trợ giúp (hoặc nếu bạn cần mô-đun này cho mô-đun khác, hãy thêm nó vào trình trợ giúp của mô-đun đó)
Fabian Schmengler

1

Đoạn mã sau sẽ trả về cho bạn các sản phẩm của danh mục có trạng thái 'Kích hoạt', Danh mục 'Hiển thị', tìm kiếm 'và Tính khả dụng của kho' Hết hàng '.

$productDetails = Mage::getModel('catalog/category')->load($cat_id)
                  ->getProductCollection()
                  ->addAttributeToSelect('*');

$productDetails->addAttributeToFilter('visibility', 4); 
$productDetails->addAttributeToFilter('status', 1); 
$productDetails->joinField('is_in_stock',
                            'cataloginventory/stock_item',
                            'is_in_stock',
                            'product_id=entity_id',
                            'is_in_stock=0',
                            '{{table}}.stock_id=1',
                            'left');

0

Bạn có thể thử điều này.

 $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',
            '{{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=0';
        } 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) . ')'
        );

Hoặc bạn có thể thử cái này

  $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',
            '{{table}}.use_config_manage_stock = 0 AND {{table}}.manage_stock=0',
        );

        if ($manageStock) {
            $cond[] = '{{table}}.is_in_stock=0';


        $collection->joinField(
            'inventory_in_stock',
            'cataloginventory/stock_item',
            'is_in_stock',
            'product_id=entity_id',
            '(' . join(') OR (', $cond) . ')'
        );

Không chắc chắn 100%.


Cảm ơn @AmitBera. Bạn có thể vui lòng cung cấp một số bối cảnh cho câu trả lời của bạn, và giải thích sự khác biệt?
BrynJ
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.