কীভাবে স্টক আইটেমগুলির বাইরে পণ্য সংগ্রহ করবেন - অ্যাডস্টকফিল্টারটোকলকশন () এর বিপরীতে?


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

প্রতিটি পণ্য জায়ের জন্য কনফিগারেশন বিকল্পগুলি নির্ধারণ করা কি এই কাজ করে? (উদাঃ এমন একটি পণ্য যা মজুত বা স্টক আউট মজুত থাকে না?)
BrynJ

এটি কাজ করা উচিত, কারণ স্টক টেবিলটি সূচিবদ্ধ এবং এটি সম্ভাব্য সমস্ত সেটিংস অ্যাকাউন্টে নেয়। আপনাকে কেবল নিশ্চিত করতে হবে যে আপনার স্টক সূচি আপ টু ডেট রয়েছে
মারিয়াস

জানানোর জন্য ধন্যবাদ. এই ডেটা পাওয়ার জন্য এটি একটি দুর্দান্ত "লাইটওয়েট" পদ্ধতির মতো বলে মনে হচ্ছে।
BrynJ

স্টক আইটেম টেবিলের পরিবর্তে স্টক স্থিতি সূচক টেবিলটি ব্যবহার করা সত্যিই সেরা সমাধান।
ফ্যাবিয়ান শেমংলার

আমি পণ্যটি প্রথম আর্গুমেন্ট হিসাবে নির্বাচনটি প্রেরণ করতে হয়েছিল Mage :: getModel ('કેટটালিনেন্টারি / স্টক_স্ট্যাটাস') -> অ্যাডস্টকস্ট্যাটাসটোসলেট ($ সংগ্রহ-> getSelect (), $ ওয়েবসাইট);
minlare

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. পণ্য বিশ্বব্যাপী কনফিগারেশন ব্যবহার করে এবং বিশ্বব্যাপী কনফিগারেশন হ'ল "স্টক = হ্যাঁ পরিচালনা করুন" এবং স্টকের মধ্যে নেই

ব্যাখ্যা: আপনি কেবলমাত্র শর্তাদি গ্রহণ করেন যেখানে ইন_স্টকটি প্রকৃতভাবে পরীক্ষা করা হয় এবং তুলনাটি 0 এর সাথে পরিবর্তন করেন _ শর্তাদি যেখানে ইন_স্টক চেক করা হয় না ("স্টক পরিচালনা করুন" = "না") এর অর্থ হ'ল স্টক স্থিতি ছাড়াই পণ্য সর্বদা স্টক থাকে , সুতরাং আমরা তাদের আমাদের "স্টক আউট" কোয়েরিতে অন্তর্ভুক্ত করি না।

তাহলে এটি আপনার কোড:

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। এটি পাশাপাশি প্লেইন ফাংশন হতে পারে। আমি একটি পৃথক মডিউল তৈরি করব এবং এটি একটি সহায়ক পদ্ধতি তৈরি করব (বা অন্য মডিউলের জন্য আপনার যদি এটির প্রয়োজন হয় তবে
এটিটিকে

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%।


ধন্যবাদ @ অমিতবেরা। আপনি দয়া করে আপনার উত্তরগুলির জন্য কিছু প্রসঙ্গ সরবরাহ করতে পারেন, এবং পার্থক্যগুলি ব্যাখ্যা করতে পারেন?
BrynJ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.