Bagaimana cara mendapatkan koleksi produk stok barang habis - kebalikan dari addInStockFilterToCollection ()?


9

Saya memiliki persyaratan untuk menampilkan produk kategori dalam dua daftar - satu untuk persediaan item, yang lainnya untuk persediaan barang habis.

saya menggunakan

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

untuk memfilter koleksi produk saya untuk item persediaan, tetapi tampaknya tidak ada metode yang setara untuk menyaring item persediaan habis - Saya telah melihat Mage_CatalogInventory_Model_Stockmodelnya, yang merupakan tempat metode tersebut didefinisikan.

Saya telah melihat contoh berikut untuk mengambil kembali stok produk:

$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));

... tapi tentunya ini bukan hanya atau cara terbaik untuk mencapai ini?

Jawaban:


3

katakanlah itu $collectionadalah koleksi produk Anda yang Anda buat seperti ini:

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

sekarang lakukan ini ke koleksi Anda. Ini bergabung dengan koleksi dengan tabel status persediaan.

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

Sekarang Anda dapat menyaring produk yang habis:

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

Apakah ini akan berhasil, apa pun opsi konfigurasi yang ditetapkan untuk setiap inventaris produk? (Misalnya, produk yang stoknya tidak ada dalam stok atau habis?)
BrynJ

Ini harus bekerja, karena tabel stok diindeks dan memperhitungkan semua pengaturan yang mungkin. Anda hanya perlu memastikan indeks saham Anda terkini
Marius

Terimakasih sudah mengkonfirmasi. Ini sepertinya pendekatan "ringan" yang bagus untuk mendapatkan data ini.
BrynJ

Menggunakan tabel indeks status stok alih-alih tabel item persediaan memang merupakan solusi terbaik.
Fabian Schmengler

Saya harus mengirim produk yang dipilih sebagai argumen pertama ke fungsi Mage :: getModel ('cataloginventory / stock_status') -> addStockStatusToSelect ($ collection-> getSelect (), $ website);
minlare

2

Contoh Anda tidak memperhitungkan nilai "gunakan konfigurasi".

Mari kita lihat bagaimana cara addInStockFilterToCollectionkerjanya:

public function addInStockFilterToCollection($collection)
{
    $this->getResource()->setInStockFilterToCollection($collection);
    return $this;
}

Oke, itu mendelegasikan ke metode lain:

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;
}

Ini bergabung dengan tabel inventaris dengan ketentuan sebagai berikut:

  1. Produk tidak menggunakan konfigurasi global DAN memiliki "kelola stok" diatur ke "ya" DAN masih ada stok

    ATAU

  2. Produk tidak menggunakan konfigurasi global DAN "mengatur stok" diatur ke "tidak"

    ATAU

  3. Produk menggunakan konfigurasi global DAN jika konfigurasi global "kelola stok = ya", ada stok

Anda perlu membalikkan kondisinya sebagai berikut:

  1. Produk tidak menggunakan konfigurasi global DAN memiliki "kelola persediaan" diatur ke "ya" DAN tidak ada dalam persediaan

    ATAU

  2. Produk menggunakan konfigurasi global DAN konfigurasi global adalah "kelola stok = ya" DAN tidak ada dalam stok

Penjelasan: Anda hanya mengambil kondisi di mana in_stock benar-benar diperiksa dan mengubah perbandingan menjadi 0. Kondisi di mana in_stock tidak diperiksa ("kelola stok" = "tidak") berarti bahwa produk selalu dalam stok, terlepas dari status persediaan. , jadi kami tidak memasukkannya dalam kueri "habis".

Maka ini adalah kode Anda:

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;
}

Jawaban terinci yang luar biasa. Jadi, Anda menyarankan membuat modul untuk ini, untuk memperpanjang Mage_CatalogInventory_Model_Stockmodel?
BrynJ

1
Tidak menulis ulang atau memperluas. Anda dapat meletakkan metode ini di mana saja karena tidak digunakan $this. Bisa juga fungsi sederhana. Saya akan membuat modul terpisah dan menjadikannya metode penolong (atau jika Anda memerlukan ini untuk modul lain, tambahkan ke penolong modul itu)
Fabian Schmengler

1

Cuplikan kode berikut akan mengembalikan Anda produk-produk dari kategori yang berstatus 'Aktifkan', katalog Visibilitas, pencarian 'dan Ketersediaan Stok' Kehabisan stok '.

$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

Anda bisa mencoba ini.

 $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) . ')'
        );

Atau Anda bisa coba ini

  $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) . ')'
        );

Tidak yakin 100%.


Terima kasih @AmitBera. Bisakah Anda memberikan beberapa konteks untuk jawaban Anda, dan menjelaskan perbedaannya?
BrynJ
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.