स्टॉक आइटमों के उत्पाद संग्रह को कैसे प्राप्त करें - addInStockFilterToCollection () के विपरीत?


9

मुझे एक श्रेणी के उत्पादों को दो सूचियों में प्रदर्शित करने की आवश्यकता है - एक स्टॉक आइटम के लिए, दूसरा स्टॉक आइटम से बाहर के लिए।

मैं उपयोग कर रहा हूँ

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

स्टॉक आइटम के लिए मेरे उत्पाद संग्रह को फ़िल्टर करने के लिए, लेकिन स्टॉक आइटम से बाहर फ़िल्टर करने के लिए एक समतुल्य विधि नहीं दिखाई देती है - मैंने Mage_CatalogInventory_Model_Stockमॉडल को देखा है, जो कि पूर्वोक्त विधि परिभाषित है।

मैंने स्टॉक उत्पादों को पुनः प्राप्त करने के लिए निम्न उदाहरण देखा है:

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

... लेकिन निश्चित रूप से यह इसे प्राप्त करने का एकमात्र या सर्वोत्तम तरीका नहीं है?

जवाबों:


3

मान लीजिए कि $collectionआपका उत्पाद संग्रह है जो आप इस तरह बनाते हैं:

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

अब इसे अपने संग्रह में करें। यह स्टॉक स्टेटस टेबल के साथ कलेक्शन में शामिल होता है।

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

अब आप स्टॉक उत्पादों को फ़िल्टर कर सकते हैं:

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

क्या यह काम नहीं करेगा कि प्रत्येक उत्पाद की सूची के लिए कौन से विन्यास विकल्प निर्धारित हैं? (जैसे एक ऐसा उत्पाद है जो स्टॉक में स्टॉक से बाहर या स्टॉक से प्रबंधित नहीं है?)
ब्रायनजे

यह काम करना चाहिए, क्योंकि स्टॉक टेबल अनुक्रमित है और यह सभी संभव सेटिंग्स को ध्यान में रखता है। आप सुनिश्चित करें कि आपके शेयर सूचकांक अप टू डेट है करना है बस
मेरियस

पुष्टि करने के लिए धन्यवाद। यह इस डेटा को प्राप्त करने के लिए एक अच्छा "हल्का" दृष्टिकोण की तरह लगता है।
15

स्टॉक आइटम तालिका के बजाय स्टॉक स्टेटस इंडेक्स टेबल का उपयोग करना वास्तव में सबसे अच्छा समाधान है।
फेबियन शेंगलर

मुझे फंक्शन मेसेज के पहले तर्क के रूप में उत्पाद का चयन करना था।
मीनलारे

2

आपका उदाहरण खाते में "कॉन्फ़िगरेशन का उपयोग करें" के लिए मान नहीं लेता है।

आइए नजर डालते हैं कि कैसे addInStockFilterToCollectionकाम करता है:

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

ठीक है, यह एक और विधि को सौंप रहा है:

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

यह निम्न स्थितियों के साथ इन्वेंट्री टेबल में शामिल होता है:

  1. उत्पाद वैश्विक कॉन्फ़िगरेशन का उपयोग नहीं करता है और "हाँ" करने के लिए "स्टॉक का प्रबंधन" करता है और स्टॉक में है

    या

  2. उत्पाद वैश्विक कॉन्फ़िगरेशन का उपयोग नहीं करता है और "स्टॉक" को "नहीं" पर सेट करता है

    या

  3. उत्पाद वैश्विक कॉन्फ़िगरेशन का उपयोग करता है और यदि वैश्विक कॉन्फ़िगरेशन "स्टॉक = हां" प्रबंधित करें, स्टॉक में है

आपको निम्नानुसार शर्तों को पलटना होगा:

  1. उत्पाद वैश्विक विन्यास का उपयोग नहीं करता है और "हां" के लिए "स्टॉक का प्रबंधन" करता है और स्टॉक में नहीं है

    या

  2. उत्पाद वैश्विक कॉन्फ़िगरेशन का उपयोग करता है और वैश्विक कॉन्फ़िगरेशन "स्टॉक प्रबंधित करें = हां" और स्टॉक में नहीं है

स्पष्टीकरण: आप केवल उन स्थितियों को लेते हैं जहां in_stock वास्तव में जाँच की जाती है और उनकी तुलना 0. में बदल जाती है। जिन स्थितियों में in_stock जाँच नहीं की जाती है ("स्टॉक प्रबंधित करें" = "नहीं") का अर्थ है कि स्टॉक में उत्पाद हमेशा स्टॉक की स्थिति की परवाह किए बिना रहता है , इसलिए हम उन्हें हमारे "आउट ऑफ स्टॉक" क्वेरी में शामिल नहीं करते हैं।

फिर यह आपका कोड है:

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

शानदार विस्तृत जवाब। तो आप Mage_CatalogInventory_Model_Stockमॉडल का विस्तार करने के लिए इसके लिए एक मॉड्यूल बनाने का सुझाव देंगे ?
BrynJ

1
कोई पुनर्लेखन या विस्तार नहीं। आप इस विधि को कहीं भी रख सकते हैं क्योंकि यह उपयोग नहीं करता है $this। यह सादे कार्य भी हो सकता है। मैं एक अलग मॉड्यूल बनाऊंगा और इसे एक सहायक विधि (या यदि आपको किसी अन्य मॉड्यूल के लिए इसकी आवश्यकता है, तो इसे उस मॉड्यूल के सहायक में जोड़ें)
Fabian Schmengler

1

निम्नलिखित कोड स्निपेट आपको ऐसी श्रेणी के उत्पाद लौटाएगा जिनके पास स्थिति 'सक्षम', दृश्यता 'कैटलॉग, खोज' और स्टॉक उपलब्धता 'स्टॉक से बाहर' है।

$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

आप यह कोशिश कर सकते हैं।

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

या आप यह कोशिश कर सकते हैं

  $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% यकीन नहीं है।


साभार @AmitBera क्या आप कृपया अपने उत्तरों के लिए कुछ संदर्भ प्रदान कर सकते हैं, और मतभेदों की व्याख्या कर सकते हैं?
ब्रायनज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.