is_salable कहाँ से आता है?


27

नोट: यदि आप PHP कोड द्वारा उत्पादों को संपादित कर रहे हैं, तो बाद में उन्हें फिर से अनुक्रमित करें, अपने स्वयं के घंटे बचाने के लिए काम करने की कोशिश करें कि वे मुझे नीचे क्यों नहीं दिखा रहे हैं ...

मैं हलकों में चक्कर लगा रहा हूं कि कैसे is_salableकिसी उत्पाद के लिए सेट करने की कोशिश कर रहा हूं , और इस तरह से काम करता हूं कि मेरे उत्पाद अब क्यों दिखाई दे रहे हैं।

कोड में केवल एक ही स्थान है जो मुझे मिल सकता है जो इसे सेट करता है:

$salable = $this->isAvailable();

लेकिन मैं यह कैसे या कहाँ से बाहर काम नहीं कर सकता, जब मैं isAvailableइसे का पालन करें बस वापस चारों ओर लूप लगता है ...।

/app/code/core/Mage/Catalog/Model/Product.php

    public function isSalable()
    {
        Mage::dispatchEvent('catalog_product_is_salable_before', array(
            'product'   => $this
        ));

        $salable = $this->isAvailable();

    $object = new Varien_Object(array(
        'product'    => $this,
        'is_salable' => $salable
    ));
    Mage::dispatchEvent('catalog_product_is_salable_after', array(
        'product'   => $this,
        'salable'   => $object
    ));
    return $object->getIsSalable();
}

निम्नलिखित $ इस-> उपलब्ध नहीं है () यहाँ से यह कुछ लाइनों जाता है:

**public function isAvailable()
{ 
    return $this->getTypeInstance(true)->isSalable($this);
}**

इसके बाद ऐप / कोड / कोर / Mage / कैटलॉग / मॉडल / उत्पाद / प्रकार / विन्यास योग्य है। कॉल करने योग्य है

public function isSalable($product = null)
{
    $salable = parent::isSalable($product);

    if ($salable !== false) {
        $salable = false;
        if (!is_null($product)) {
            $this->setStoreFilter($product->getStoreId(), $product);
        }
        foreach ($this->getUsedProducts(null, $product) as $child) {
            if ($child->isSalable()) {
                $salable = true;
                break;
            }
        }
    }

    return $salable;
}

जो अभिभावक को कॉल करता है: /app/code/core/Mage/Catalog/Model/Product/Type/Abstract.php's isSalable:

public function isSalable($product = null)
{
    $salable = $this->getProduct($product)->getStatus() == Mage_Catalog_Model_Product_Status::STATUS_ENABLED;
    if ($salable && $this->getProduct($product)->hasData('is_salable')) {
        $salable = $this->getProduct($product)->getData('is_salable');
    }
    elseif ($salable && $this->isComposite()) {
        $salable = null;
    }

    return (boolean) (int) $salable;
}

जो सिर्फ is_saleable मान पर डेटा कॉल करता / करती है? क्या मैंने उस पर नज़र रखी? यह मूल्य कहां से आ रहा है?

मैंने is_salable के लिए अपनी स्थापना पर एक पुनरावर्ती grep जारी किया, निश्चित रूप से यह किसी भी रेखा को दिखाना चाहिए जहां यह सेट है, लेकिन मुझे कोई अधिकार नहीं दिखता है:

grep -r is_salable *
app/code/core/Mage/CatalogInventory/Model/Stock/Status.php:            $object = new Varien_Object(array('is_in_stock' => $product->getData('is_salable')));
app/code/core/Mage/XmlConnect/Block/Wishlist.php:                $itemXmlObj->addChild('is_salable', (int)$item->getProduct()->isSalable());
app/code/core/Mage/XmlConnect/Block/Catalog/Product.php:            $item->addChild('is_salable', (int)$product->isSalable());
app/code/core/Mage/XmlConnect/Block/Cart/Crosssell.php:                $itemXmlObj->addChild('is_salable', 0);
app/code/core/Mage/XmlConnect/Block/Cart/Crosssell.php:                $itemXmlObj->addChild('is_salable', (int)$product->isSalable());
app/code/core/Mage/Catalog/Model/Product.php:        Mage::dispatchEvent('catalog_product_is_salable_before', array(
app/code/core/Mage/Catalog/Model/Product.php:            'is_salable' => $salable
app/code/core/Mage/Catalog/Model/Product.php:        Mage::dispatchEvent('catalog_product_is_salable_after', array(
app/code/core/Mage/Catalog/Model/Product.php:        if ($this->hasData('is_salable')) {
app/code/core/Mage/Catalog/Model/Product.php:            return $this->getData('is_salable');
app/code/core/Mage/Catalog/Model/Product/Type/Abstract.php:        if ($salable && $this->getProduct($product)->hasData('is_salable')) {
app/code/core/Mage/Catalog/Model/Product/Type/Abstract.php:            $salable = $this->getProduct($product)->getData('is_salable');

मिल गया:

grep -r setIsSalable *
app/code/core/Mage/CatalogInventory/Model/Stock/Status.php:        $product->setIsSalable($stockStatus);
app/code/core/Mage/CatalogInventory/Model/Stock/Status.php:                    $product->setIsSalable($status);

यह सेटिसेबल था जिसे मैंने केवल सेटिसेबल के बजाय देखने के लिए नहीं सोचा / पता नहीं था

जवाबों:


18

isAvailable() इस तरह दिखता है:

public function isAvailable()
{
    return $this->getTypeInstance(true)->isSalable($this)
        || Mage::helper('catalog/product')->getSkipSaleableCheck();
}

इसका मतलब यह है कि विधि का परिणाम उत्पाद प्रकार पर निर्भर करता है।
प्रत्येक उत्पाद प्रकार में एक isSalable()विधि है:

  • Mage_Catalog_Model_Product_Type_Grouped::isSalable() - समूहीकृत उत्पादों के लिए
  • Mage_Catalog_Model_Product_Type_Configurable::isSalable() - विन्यास योग्य उत्पादों के लिए
  • Mage_Catalog_Model_Product_Type_Abstract::isSalable()- बाकी उत्पाद प्रकारों के लिए चूंकि सभी उत्पाद प्रकार विस्तारित होते हैं Mage_Catalog_Model_Product_Type_Abstract
    मुझे लगता है कि कॉल $this->getTypeInstance(true)आपको भ्रमित करता है। विधि getTypeInstance()उत्पाद मॉडल का एक उदाहरण नहीं लौटाती है, बल्कि एक उत्पाद प्रकार का एक उदाहरण है।

[संपादित करें]
एक साधारण उत्पाद के लिए इसे कहा जाता है Mage_Catalog_Model_Product_Type_Grouped::isSalable()। यह विधि जाँचती है कि उत्पाद सक्षम है या नहीं। यदि नहीं तो falseवापस कर दिया जाता है। यदि यह सक्षम है, तो यह जांचता है कि क्या यह एक संपत्ति है is_salableजो आपके पर्यवेक्षकों में से एक द्वारा निर्धारित की जा सकती है।
यदि इसके पास ऐसी कोई संपत्ति नहीं है, तो यह जाँचता है कि क्या उत्पाद प्रकार उदाहरण है $this->isComposite()। अगर ऐसा है तो यह बिक्री योग्य नहीं है।
विन्यास योग्य उत्पादों के लिए यह जाँच करता है कि क्या ऊपर की शर्तें पूरी हुई हैं और अगर विन्यास योग्य से जुड़ा कोई साधारण उत्पाद है जो कि बिक्री योग्य है (फिर ऊपर की शर्तों के साथ)
तो समूहित उत्पाद के लिए ही किया जाता है लेकिन एक अलग तरीके से।

निष्कर्ष में is_salableअस्तित्व में नहीं है। लेकिन सिर्फ अगर आपके पास एक पर्यवेक्षक है जो उस संपत्ति को सेट करता है जो यह ध्यान में रखता है कि क्या उत्पाद बेचा जा रहा है।
यहाँ कोर से एक उदाहरण है: विधि Mage_CatalogInventory_Model_Stock_Status::assignProduct()कैलोरी $product->setIsSalable()
के लिए एक ही चला जाता है Mage_CatalogInventory_Model_Stock_Status::addStockStatusToProducts
अंतिम को ईवेंट द्वारा बुलाया जाता है catalog_product_collection_load_after


फिर से आपकी मदद के लिए बहुत बहुत धन्यवाद, मैं पता लगाया था कि isAalable और isuralable.php के isSalable के लिए उपलब्ध नहीं है, जो बस Abstract.php के isSalable कहता है, लेकिन यह सब जाँच है 'issalable' है, लेकिन मुझे इसकी कोई सेटिंग नहीं मिली है ?? मैं ऊपर अपना कोड निशान जोड़ूंगा।
हेडन थ्रिंग

मेरे सवाल में जोड़ा गया
हेडन थ्रिंग

2
हाँ वहाँ है। मैंने अपने उत्तर में इसका उल्लेख किया है catalog_product_collection_load_after। लेकिन यह सिर्फ एक उदाहरण है। वहाँ भी है cataloginventory/observer::addInventoryDataजो कॉल assignProductसेट करता है is_salable। वहाँ दूसरों को हो सकता है लेकिन मैं सभी के लिए नहीं देखा था।
मारियस

1
मेरे पास ऐसा करने के लिए कोई विश्वसनीय तरीका नहीं है। हो सकता है कि उन सभी घटनाओं को प्राप्त करें catalog_product_जो उन घटनाओं पर पर्यवेक्षकों द्वारा बुलाए गए तरीकों के साथ शुरू और डिबग करते हैं। और देखें कि कोई कॉल करता है setIsSalableयाsetData('is_salable')
Marius

1
XmlConnect आपको अपनी वेबसाइट पर अपना मोबाइल एप्लिकेशन कनेक्ट करने की अनुमति देता है। अनदेखी करो इसे।
मारियस

2

यदि बिक्री योग्य रिटर्न गलत है, तो रिइंडेक्सिंग भी डेटा को रिइंडेक्स जारी कर सकता है


0

यदि रेनडेक्सिंग और डिबगिंग के बाद is_salable to कोई अंत नहीं है और आपके कॉन्फ़िगर करने योग्य उत्पाद अभी भी स्टॉक से बाहर दिखाई दे रहा है, तो सुनिश्चित करें कि सभी सिंपल के स्टेटस को सक्षम कर दिया गया है, सभी स्टोर व्यू में। मैं सिर्फ दो घंटे बर्बाद कर रहा था सोच रहा था कि एक विन्यास योग्य स्टॉक से कोई फर्क नहीं पड़ता कि मैंने क्या किया था, जब तक कि मैंने सभी स्टोर के विचारों की जांच नहीं की और पाया कि कुछ शरीर ने स्थिति को अक्षम कर दिया था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.