Stokta olmayan ürünlerin ürün koleksiyonunu nasıl alabilirim?


9

Bir kategorinin ürünlerini iki listede gösterme gereksinimim var - biri stoktaki ürünler için, diğeri stoktaki ürünler için.

kullanıyorum

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

Stoktaki ürünler için ürün koleksiyonumu filtrelemek için, ancak stoktaki öğeler için filtrelemek için eşdeğer bir yöntem yok gibi görünüyor - Mage_CatalogInventory_Model_StockYukarıda belirtilen yöntemin tanımlandığı modele baktım .

Ben stok ürün almak için aşağıdaki örneği gördüm:

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

... ama kesinlikle bunu başarmanın tek ya da en iyi yolu değil mi?

Yanıtlar:


3

diyelim ki bu $collectionşekilde inşa ettiğiniz ürün koleksiyonunuz:

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

şimdi bunu koleksiyonunuza yapın. Bu, koleksiyona hisse senedi durum tablosuyla katılır.

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

Şimdi stokta olmayan ürünleri filtreleyebilirsiniz:

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

Bu, her bir ürünün envanteri için hangi yapılandırma seçeneklerinin ayarlandığına bakılmaksızın çalışır mı? (Örneğin stokta veya stokta yönetilmeyen bir ürün mü?)
BrynJ

Çalışması gerekir, çünkü stok tablosu endekslenir ve olası tüm ayarları dikkate alır. Hisse senedi endeksinizin güncel olduğundan emin olmalısınız
Marius

Onayladığınız için teşekkürler. Bu, bu verileri elde etmek için hoş bir "hafif" yaklaşım gibi görünüyor.
BrynJ

Stok kalemi tablosu yerine hisse senedi durum endeksi tablosunu kullanmak gerçekten de en iyi çözümdür.
Fabian Schmengler

Mage :: getModel ('cataloginventory / stock_status') -> addStockStatusToSelect ($ collection-> getSelect (), $ website) işlevine ilk argüman olarak ürün seçimini göndermek zorunda kaldım.
minlare

2

Örneğiniz "use config" değerini dikkate almaz.

Nasıl addInStockFilterToCollectionçalıştığına bir göz atalım :

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

Tamam, başka bir yönteme devrediyor:

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

Bu, envanter tablosuna aşağıdaki koşullarla katılır:

  1. Ürün küresel yapılandırmayı kullanmaz VE "evet" set "stok yönetme" vardır VE stoğa

    VEYA

  2. Ürün genel yapılandırmayı kullanmıyor VE "stoğu yönet", "hayır" olarak ayarlanmış

    VEYA

  3. Ürün global yapılandırmayı kullanıyor VE global yapılandırma "stok yönet = evet" ise, stokta

Koşulları aşağıdaki gibi ters çevirmeniz gerekir:

  1. Ürün genel yapılandırmayı kullanmıyor VE "stok yönet" seçeneği "evet" olarak ayarlandı VE stokta yok

    VEYA

  2. Ürün global yapılandırmayı kullanıyor VE global yapılandırma "stok yönet = evet" VE stokta yok

Açıklama: Yalnızca in_stock'un gerçekten denetlendiği koşulları alıyorsunuz ve karşılaştırmayı 0 olarak değiştiriyorsunuz. , "stokta yok" sorgusuna dahil etmiyoruz.

O zaman bu kodunuz:

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

Harika detaylı cevap. Mage_CatalogInventory_Model_StockModeli genişletmek için bunun için bir modül oluşturmayı önerir misiniz ?
BrynJ

1
Yeniden yazma veya genişletme yok. Bu yöntemi kullanmadığı herhangi bir yere koyabilirsiniz $this. Düz fonksiyon da olabilir. Ayrı bir modül oluşturacağım ve yardımcı bir yöntem haline getireceğim (veya başka bir modül için buna ihtiyacınız varsa, bu modülün yardımcısına ekleyin)
Fabian Schmengler

1

Aşağıdaki kod snippet'i, 'Etkinleştir', Görünürlük 'kataloğu, arama' ve Stok Durumu 'stokta kalmadı' kategorisine sahip ürünleri size geri verecektir.

$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

Bunu deneyebilirsiniz.

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

Ya da bunu deneyebilirsin

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

% 100 emin değilim.


Teşekkürler @AmitBera. Lütfen cevaplarınız için bir bağlam sağlayabilir ve farklılıkları açıklayabilir misiniz?
BrynJ
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.