खोज…


टिप्पणियों

मैगनेटो में निर्मित छह अलग-अलग प्रकार के उत्पाद हैं।

  • सरल

एक एकल शेयर इकाई

  • विन्यास

सबसे पहले मिश्रित उत्पादों। ग्राहकों को अपने उत्पाद को कॉन्फ़िगर करने और टोकरी में एक एकल साधारण उत्पाद जोड़ने की अनुमति दें।

  • समूहीकृत

दूसरा मिश्रित उत्पाद, एक समूहीकृत उत्पाद सरल उत्पादों से संबंधित है और ग्राहकों को प्रत्येक आइटम की मात्रा चुनने की क्षमता प्रदान करता है।

  • बंडल

तीसरा मिश्रित उत्पाद प्रकार, एक बंडल एक उत्पाद के रूप में खरीदने के लिए एक साथ सरल उत्पादों से संबंधित है।

  • वास्तविक

डिलीवरी के लिए कोई भौतिक वस्तु की आवश्यकता नहीं है, उदाहरण के लिए सेवाएं

  • डाउनलोड करने योग्य

भौतिक उत्पाद के बजाय एक डिजिटल। अधिकांश उत्पाद प्रकार Mage_Catalog मॉड्यूल के भाग के रूप में कार्यान्वित किए जाते हैं, Mage_Bundle और Mage_Downloadable के अलावा।

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

डाउनलोड करने योग्य और बंडल उत्पादों के डेटाबेस में अतिरिक्त टेबल होते हैं, इस बीच बाकी सभी अन्य उत्पाद प्रकारों के बीच साझा किए जाते हैं। विन्यास योग्य उत्पादों में बाल उत्पादों, कैटलॉग_प्रोडक्ट_सुपर_लिंक से जुड़ने के लिए एक अतिरिक्त तालिका है।

कस्टम उत्पाद प्रकार

एक उत्पाद प्रकार बनाने के लिए जो अंतर्निहित उत्पाद प्रकारों में से एक का विस्तार करता है, इसी उत्पाद प्रकार के मॉडल को बढ़ाया जाना चाहिए। अन्यथा नए उत्पाद प्रकार को Mage_Catalog_Model_Product_Type_Abstract वर्ग का विस्तार करना चाहिए।

मॉड्यूल के config.xml में एक प्रविष्टि भी आवश्यक है:

अधिक जटिल उत्पादों को अन्य अनुकूलित क्षेत्रों की आवश्यकता हो सकती है, जैसे कि मूल्य मॉडल और अनुक्रमणिका डेटा।

मूल्य गणना

किसी एक उत्पाद के साथ काम करते समय, मूल्य की गणना हमेशा मक्खी पर की जाती है। कीमत EAV विशेषता उत्पाद के साथ भरी हुई है और अंतिम मूल्य मूल्य मॉडल, Mage_Catalog_Model_Product_Type_Price द्वारा गणना की जाती है।

कुछ उत्पाद प्रकार इससे अलग तरीके से निपटते हैं। जिस स्थिति में वे इस वर्ग का विस्तार करते हैं और अपना तर्क लागू करते हैं। उदाहरण के लिए, कॉन्फ़िगर करने योग्य उत्पाद overFinalPrice () को अधिलेखित करता है और अतिरिक्त तर्क जोड़ता है। यह कस्टम मॉडल इसके बाद <price_model> टैग के साथ config.xml में निर्दिष्ट किया जा सकता है।

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

अंतिम मूल्य को कैटलॉग_प्रोडक्ट_गेट_फाइनल_प्राइस इवेंट के पर्यवेक्षकों द्वारा समायोजित किया जा सकता है। डिफ़ॉल्ट रूप से, केवल Mage_CatalogRule मॉड्यूल इस ईवेंट का अवलोकन करता है।

उत्पादन मूल्य को ओवरराइड करने का एक और तरीका यह है कि इसे केवल उत्पाद पर सेट किया जाए। यदि कीमत निर्धारित की जाती है, तो उत्पाद इसे पुनर्गणना नहीं करेगा।

उत्पाद की कीमत सामान्य मूल्य से अलग है (हालांकि कीमत की गणना करते समय ध्यान में रखा जाता है)। यह एक ग्राहक समूह के साथ एक सूची के रूप में लागू किया जाता है और प्रत्येक स्तर के लिए न्यूनतम मात्रा के पात्र हैं। कैटलॉग / उत्पाद / दृश्य / tierprices.phtml टेम्प्लेट का उपयोग करके तालिका में टीयर की कीमतें प्रदर्शित की जाती हैं।

अंतिम कीमत की गणना करते समय कस्टम उत्पाद विकल्प संसाधित होते हैं। प्रत्येक विकल्प की अपनी कीमत निर्धारित होती है, जो अंतिम मूल्य में जुड़ जाती है।

समूह, स्तरीय और विशेष मूल्य सभी को एक ही समय में माना जाता है ($priceModel->getBasePrice()) और तीन में से सबसे छोटी एक (या यदि आप नियमित मूल्य शामिल करते हैं तो) को आधार उत्पाद मूल्य के रूप में चुना जाता है।

कर

Mage_Tax मॉड्यूल किसी उत्पाद की कर वर्ग का उपयोग करता है और लागू करने के लिए सही दर की पहचान करने के लिए उत्पाद की कीमत कर के समावेशी या अनन्य है या नहीं।

उत्पादों पर कर की गणना के लिए निम्नलिखित कारकों का उपयोग किया जाता है:

  • उत्पाद कर वर्ग
  • पहले से शामिल कर की राशि
  • बिलिंग और शिपिंग पते
  • ग्राहक कर वर्ग
  • स्टोर सेटिंग्स

स्तरित नेविगेशन

स्तरित नेविगेशन के प्रतिपादन के लिए जिम्मेदार वर्ग हैं:

  • Mage_Catalog_Block_Layer_View

    फिल्टर और विकल्प को संभालता है

  • Mage_Catalog_Block_Layer_State

वर्तमान में क्या फ़िल्टर किया जा रहा है -Controls

कस्टम स्रोत मॉडल के साथ विशेषताओं पर स्तरित नेविगेशन को लागू करने के लिए Mage_Catalog_Model_Layer_Filter_Abstract :: apply () विधि को उत्पाद संग्रह कैसे फ़िल्टर किया जाना चाहिए यह निर्धारित करने के लिए ओवरराइट करने की आवश्यकता होगी।

स्तरित नेविगेशन को Mage_Catalog_Block_Layer_View और Mage_Catalog_Block_Layer_State ब्लॉकों द्वारा गाया जाता है, जो व्यक्तिगत फ़िल्टर के लिए फ़िल्टर ब्लॉक का उपयोग करते हैं।

बहुस्तरीय नेविगेशन अधिकांश फिल्टर, जैसे मूल्य, उत्पाद विशेषता सूचकांक, दशमलव उत्पाद सूचकांक के लिए सूचकांक तालिका का उपयोग करता है।

श्रेणियाँ

डेटाबेस में श्रेणियाँ

श्रेणी पदानुक्रम को एक श्रेणी की मूल आईडी संग्रहीत करके प्रबंधित किया जाता है। पूर्ण पदानुक्रम पथ स्तंभ (स्लेश अलग आईडी) में दिखाया गया है। 0. के पेरेंट_ड के साथ एक विशेष श्रेणी है। यह सही रूट श्रेणी है और मैगेंटो में परिभाषित अन्य रूट श्रेणियों में से प्रत्येक साझा माता-पिता के रूप में इसका उपयोग करता है।

डेटाबेस से एक श्रेणी के पेड़ को पढ़ने और प्रबंधित करने के लिए दो अलग-अलग वर्गों का उपयोग किया जाता है यदि फ्लैट कैटलॉग सक्षम किया जाता है, तो Mage_Catalog_Model_Resource_Category_Tree और Mage_Catalog_Model_Resource_Category_Flat।

फ्लैट श्रेणियों का लाभ यह है कि यह क्वेरी के लिए त्वरित है। हालांकि, हर बार बदलाव होने पर ईएवी टेबल से इसे फिर से बनाने की जरूरत है।

getChildren()

तत्काल बच्चों की आईडी से अल्पविराम से अलग स्ट्रिंग लौटाता है

getAllChildren()

सभी बच्चों के आईडी की एक स्ट्रिंग या सरणी देता है

getChildrenCategories()

तत्काल बच्चों की श्रेणियों का एक संग्रह देता है NB यदि फ्लैट कैटलॉग सक्षम किया गया है, तो लौटी एकमात्र बाल श्रेणियां शामिल हैं जिनमें शामिल होंगे_में_मेनू = 1. दोनों ही मामलों में, केवल सक्रिय श्रेणियों को वापस किया जाता है।

कैटलॉग मूल्य नियम

कैटलॉग मूल्य नियम तिथि, उत्पाद, वेबसाइट और ग्राहक समूह के आधार पर उत्पादों पर छूट लागू करते हैं।

जब getFinalPrice() को किसी उत्पाद पर कॉल किया जाता है, तो ईवेंट कैटलॉग_प्रोडक्ट_गेट_फाइनल_प्राइस निकाल दिया जाता है। यह Mage_CatalogRule_Model_Observer द्वारा मनाया जाता है जो तब उत्पाद पर लागू होने वाले किसी भी कैटलॉग मूल्य नियम की तलाश करेगा। यदि लागू हो, तो यह डेटाबेस मूल्य तालिका को देखता है और एक वैरिएन डेटा फ़ील्ड फाइनल_प्राइस के रूप में उत्पाद मॉडल पर वापस कीमत लिखता है।

डेटाबेस के भीतर, कैटलॉग टेबल नियमों, उनकी स्थितियों और उनके कार्यों का वर्णन करता है। कैटलॉग_प्रोडक्ट में मिलान किए गए उत्पाद और कुछ नियम जानकारी शामिल हैं। इस बीच कैटलॉग_प्रोडक्ट_प्राइस में नियम लागू होने के बाद की कीमत शामिल है।

अनुक्रमण और फ्लैट टेबल्स

फ्लैट सूची तालिकाओं को सूची सूचकांक द्वारा प्रबंधित किया जाता है। यदि अनुक्रमणिका का स्वत: पुनर्निर्माण सक्षम किया जाता है, तो कैटलॉग इंडेक्सर्स को हर बार किसी उत्पाद, श्रेणी या किसी भी संबंधित संस्थाओं को अद्यतन किए जाने पर पुनर्निर्मित किया जाता है। _AfterSave () विधि अनुक्रमणिका प्रक्रिया को कॉल करती है। अन्यथा उन्हें मैन्युअल रूप से व्यवस्थापक के माध्यम से फिर से अनुक्रमित करना होगा।

उत्पाद प्रकार मूल्य सूचकांक और स्टॉक इंडेक्स को प्रभावित करता है, जहां उत्पाद इन इंडेक्स के लिए अपने डेटा को संभालने के लिए अपने स्वयं के कस्टम इंडेक्सर्स (config.xml में) को परिभाषित कर सकते हैं।

Mage_Index मॉड्यूल फ्रेमवर्क प्रदान करता है जिसके साथ साइट के प्रदर्शन को अनुकूलित करने में मदद करने के लिए कस्टम इंडेक्स बनाए जा सकते हैं। Mage_Index_Model_Indexer_Abstract वर्ग को एक नया सूचकांक बनाने के लिए बढ़ाया जाना चाहिए, जिससे _registerEvent () और _processEvent () विधियों को लागू किया जा सके। इसे config.xml में पंजीकृत करना न भूलें:

<global>
    <index>
        <indexer>
            <{name}>{model}</{name}>
        </indexer>
    </index>
</global>

Mage_Catalog_Model_Product_Type

/**
 * Magento
 *
 * NOTICE OF LICENSE
 *
 * This source file is subject to the Open Software License (OSL 3.0)
 * that is bundled with this package in the file LICENSE.txt.
 * It is also available through the world-wide-web at this URL:
 * http://opensource.org/licenses/osl-3.0.php
 * If you did not receive a copy of the license and are unable to
 * obtain it through the world-wide-web, please send an email
 * to [email protected] so we can send you a copy immediately.
 *
 * DISCLAIMER
 *
 * Do not edit or add to this file if you wish to upgrade Magento to newer
 * versions in the future. If you wish to customize Magento for your
 * needs please refer to http://www.magentocommerce.com for more information.
 *
 * @category    Mage
 * @package     Mage_Catalog
 * @copyright   Copyright (c) 2012 Magento Inc. (http://www.magentocommerce.com)
 * @license     http://opensource.org/licenses/osl-3.0.php  Open Software License (OSL 3.0)
 */

/**
 * Product type model
 *
 * @category    Mage
 * @package     Mage_Catalog
 * @author      Magento Core Team 
 */
class Mage_Catalog_Model_Product_Type
{
    /**
     * Available product types
     */
    const TYPE_SIMPLE       = 'simple';
    const TYPE_BUNDLE       = 'bundle';
    const TYPE_CONFIGURABLE = 'configurable';
    const TYPE_GROUPED      = 'grouped';
    const TYPE_VIRTUAL      = 'virtual';

    const DEFAULT_TYPE      = 'simple';
    const DEFAULT_TYPE_MODEL    = 'catalog/product_type_simple';
    const DEFAULT_PRICE_MODEL   = 'catalog/product_type_price';

    static protected $_types;
    static protected $_compositeTypes;
    static protected $_priceModels;
    static protected $_typesPriority;

    /**
     * Product type instance factory
     *
     * @param   Mage_Catalog_Model_Product $product
     * @param   bool $singleton
     * @return  Mage_Catalog_Model_Product_Type_Abstract
     */
    public static function factory($product, $singleton = false)
    {
        $types = self::getTypes();
        $typeId = $product->getTypeId();

        if (!empty($types[$typeId]['model'])) {
            $typeModelName = $types[$typeId]['model'];
        } else {
            $typeModelName = self::DEFAULT_TYPE_MODEL;
            $typeId = self::DEFAULT_TYPE;
        }

        if ($singleton === true) {
            $typeModel = Mage::getSingleton($typeModelName);
        }
        else {
            $typeModel = Mage::getModel($typeModelName);
            $typeModel->setProduct($product);
        }
        $typeModel->setConfig($types[$typeId]);
        return $typeModel;
    }

    /**
     * Product type price model factory
     *
     * @param   string $productType
     * @return  Mage_Catalog_Model_Product_Type_Price
     */
    public static function priceFactory($productType)
    {
        if (isset(self::$_priceModels[$productType])) {
            return self::$_priceModels[$productType];
        }

        $types = self::getTypes();

        if (!empty($types[$productType]['price_model'])) {
            $priceModelName = $types[$productType]['price_model'];
        } else {
            $priceModelName = self::DEFAULT_PRICE_MODEL;
        }

        self::$_priceModels[$productType] = Mage::getModel($priceModelName);
        return self::$_priceModels[$productType];
    }

    static public function getOptionArray()
    {
        $options = array();
        foreach(self::getTypes() as $typeId=>$type) {
            $options[$typeId] = Mage::helper('catalog')->__($type['label']);
        }

        return $options;
    }

    static public function getAllOption()
    {
        $options = self::getOptionArray();
        array_unshift($options, array('value'=>'', 'label'=>''));
        return $options;
    }

    static public function getAllOptions()
    {
        $res = array();
        $res[] = array('value'=>'', 'label'=>'');
        foreach (self::getOptionArray() as $index => $value) {
            $res[] = array(
               'value' => $index,
               'label' => $value
            );
        }
        return $res;
    }

    static public function getOptions()
    {
        $res = array();
        foreach (self::getOptionArray() as $index => $value) {
            $res[] = array(
               'value' => $index,
               'label' => $value
            );
        }
        return $res;
    }

    static public function getOptionText($optionId)
    {
        $options = self::getOptionArray();
        return isset($options[$optionId]) ? $options[$optionId] : null;
    }

    static public function getTypes()
    {
        if (is_null(self::$_types)) {
            $productTypes = Mage::getConfig()->getNode('global/catalog/product/type')->asArray();
            foreach ($productTypes as $productKey => $productConfig) {
                $moduleName = 'catalog';
                if (isset($productConfig['@']['module'])) {
                    $moduleName = $productConfig['@']['module'];
                }
                $translatedLabel = Mage::helper($moduleName)->__($productConfig['label']);
                $productTypes[$productKey]['label'] = $translatedLabel;
            }
            self::$_types = $productTypes;
        }

        return self::$_types;
    }

    /**
     * Return composite product type Ids
     *
     * @return array
     */
    static public function getCompositeTypes()
    {
        if (is_null(self::$_compositeTypes)) {
            self::$_compositeTypes = array();
            $types = self::getTypes();
            foreach ($types as $typeId=>$typeInfo) {
                if (array_key_exists('composite', $typeInfo) && $typeInfo['composite']) {
                    self::$_compositeTypes[] = $typeId;
                }
            }
        }
        return self::$_compositeTypes;
    }

    /**
     * Return product types by type indexing priority
     *
     * @return array
     */
    public static function getTypesByPriority()
    {
        if (is_null(self::$_typesPriority)) {
            self::$_typesPriority = array();
            $a = array();
            $b = array();

            $types = self::getTypes();
            foreach ($types as $typeId => $typeInfo) {
                $priority = isset($typeInfo['index_priority']) ? abs(intval($typeInfo['index_priority'])) : 0;
                if (!empty($typeInfo['composite'])) {
                    $b[$typeId] = $priority;
                } else {
                    $a[$typeId] = $priority;
                }
            }

            asort($a, SORT_NUMERIC);
            asort($b, SORT_NUMERIC);

            foreach (array_keys($a) as $typeId) {
                self::$_typesPriority[$typeId] = $types[$typeId];
            }
            foreach (array_keys($b) as $typeId) {
                self::$_typesPriority[$typeId] = $types[$typeId];
            }
        }
        return self::$_typesPriority;
    }
}

मानक उत्पाद प्रकारों का वर्णन करें (सरल, विन्यास योग्य, बंडल)

सरल

साधारण उत्पाद प्रकार का उपयोग उस के लिए किया जाना चाहिए जिसमें आम तौर पर एक एकल कॉन्फ़िगरेशन (एक-आकार-फिट-सभी) हो। इसमें आइटम शामिल हो सकते हैं जैसे:

  • क्रेयॉन्स का एक बॉक्स, छोटा (24 रंग)
  • क्रेयॉन्स का एक बॉक्स, बड़ा (64 रंग)
  • सुपरहिटटेक 26 ”एचडी कंप्यूटर मॉनिटर
  • बैरक ओबामा एक्शन फिगर (6))

समूहीकृत

समूहीकृत उत्पाद आपको अपने स्टोर में एक या अधिक मौजूदा उत्पादों का उपयोग करके एक नया उत्पाद बनाने की अनुमति देते हैं। उदाहरण के लिए, मान लें कि आपके पास एक "बैरक ओबामा एक्शन फिगर" और एक "जॉर्ज डब्ल्यू बुश एक्शन फिगर" पहले से ही आपके स्टोर में है और आप उन्हें एक बंडल के रूप में बेचना चाहते हैं। आप बस एक नया समूहीकृत उत्पाद बनाएंगे (चलो इसे "ओबामा + बुश (दोनों को प्राप्त करें और दो बार खर्च करें!)" कहेंगे, फिर "संबद्ध उत्पाद" टैब के माध्यम से समूह में दोनों कार्रवाई के आंकड़े जोड़ें।

नोट: दुर्भाग्य से, आप उत्पाद पृष्ठ से सीधे एक विशेष "समूह" मूल्य निर्धारित करने में सक्षम नहीं हैं। एक साथ आइटम खरीदने के लिए छूट की पेशकश करने के लिए, आपको एक नया शॉपिंग कार्ट मूल्य नियम बनाना होगा।

विन्यास

विन्यास योग्य उत्पाद: यह उत्पाद आपके ग्राहकों को वैरिएंट का चयन करने में सक्षम बनाता है जो वे विकल्प चुनकर चाहते हैं। उदाहरण के लिए, आप टी-शर्ट को दो रंगों और तीन आकारों में बेच सकते हैं। आप व्यक्तिगत उत्पादों (प्रत्येक अपने SKU के साथ) के रूप में छह सरल उत्पाद बनाएंगे और फिर इन छह को एक कॉन्फ़िगर करने योग्य उत्पाद में जोड़ेंगे जहां ग्राहक आकार और रंग चुन सकते हैं, और फिर इसे अपनी कार्ट में जोड़ सकते हैं। सरल उत्पादों के लिए कस्टम विकल्प का उपयोग करके बहुत समान कार्यक्षमता संभव है। एक विन्यास योग्य उत्पाद और कस्टम विकल्पों सहित एक उत्पाद के बीच अंतर यह है कि कस्टम विकल्पों की खरीद के दौरान व्यक्तिगत विकल्पों के लिए इन्वेंट्री की जाँच या अद्यतन नहीं किया जाता है।

वास्तविक

वर्चुअल प्रोडक्ट्स वे होते हैं, जिनमें भौतिक या डिजिटल समकक्ष नहीं होता है। वे जहाज नहीं करते हैं, न ही उनके पास डाउनलोड लिंक है। इस उत्पाद प्रकार का उपयोग सेवाओं के लिए किया जा सकता है:

  • घर की सफाई
  • 1-वर्ष न्यूज़लैटर सदस्यता

नोट: यदि "सब्सक्रिप्शन" के लिए वर्चुअल उत्पादों का उपयोग किया जाता है, तो यह ध्यान रखना महत्वपूर्ण है कि ऑटो-नवीनीकरण सदस्यता को प्रबंधित करने का कोई अंतर्निहित तरीका नहीं है। Magento में किए गए सभी उत्पाद, उत्पाद प्रकार की परवाह किए बिना, एक बार की खरीदारी हैं।

बंडल

यह उत्पाद प्रकार अन्य ईकामर्स सॉफ़्टवेयर में "किट" के रूप में भी जाना जाता है। यह उत्पाद प्रकार उन परिस्थितियों के लिए आदर्श है जहाँ उपयोगकर्ता को कई विन्यास विकल्प चुनने हैं, लेकिन कम से कम एक विकल्प। इसमें उत्पाद शामिल हो सकते हैं जैसे:

  • अनुकूलन कंप्यूटर सिस्टम
  • अनुकूलन Tuxedos / सूट
  • बंडलों का उपयोग करने पर वीडियो ट्यूटोरियल के लिए यहां क्लिक करें

डाउनलोड करने योग्य

डाउनलोड करने योग्य उत्पाद आभासी उत्पादों के समान हैं, सिवाय इसके कि उनमें डाउनलोड के लिए एक या अधिक डिजिटल फ़ाइलों को जोड़ने की क्षमता शामिल है। फ़ाइलें या तो व्यवस्थापक इंटरफ़ेस के माध्यम से अपलोड की जा सकती हैं, या सीधे FTP के माध्यम से सर्वर पर अपलोड की जा सकती हैं और फिर URL द्वारा जोड़ी जा सकती हैं। जब कोई ग्राहक डाउनलोड करने योग्य उत्पाद खरीदता है, तो Magento एक सुरक्षित, एन्क्रिप्टेड लिंक उत्पन्न करेगा (ताकि ग्राहक उस फ़ाइल को डाउनलोड करने के लिए उस ग्राहक की फ़ाइल का वास्तविक स्थान न देख सकें)।

इस श्रेणी में उत्पाद शामिल हो सकते हैं जैसे:

  • संगीत / MP3s
  • कंप्यूटर सॉफ्टवेयर

नोट : यदि आपने अपनी साइट के लिए SSL सक्षम किया है, तो IE के सभी संस्करणों के अंतर्गत डाउनलोड विफल हो सकते हैं क्योंकि IE में बग है जो सुरक्षित कनेक्शन को डाउनलोड करने से रोकता है यदि नो-कैश हेडर सेट है। यह आसानी से htaccess फ़ाइल में नो कैश और नो-स्टोर हेडर को हटाकर या डाउनलोड लिंक को गैर-सुरक्षित करने के लिए मजबूर करके तय किया जा सकता है।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow