पर्यवेक्षक का उपयोग करके या ग्राहक ग्रिड को ओवरराइड करके ग्राहक ग्रिड में कॉलम जोड़ना


28

मुझे ग्राहक ग्रिड पर एक कॉलम जोड़ने और उस कॉलम में मान दिखाने के मुद्दे का सामना करना पड़ रहा है।

यहाँ पर्यवेक्षक कोड है जो मैं कॉलम दिखाने की कोशिश कर रहा हूँ: -

if ($block->getType() == 'adminhtml/customer_grid') {
          $customer = $observer->getCustomer();
          $collection = Mage::getResourceModel('customer/customer_collection');
        $block->addColumnAfter('mobile', array(
                'header'    => 'Mobile No.',
                'type'      => 'text',
                'index'     => 'mobile',
            ), 'email');
        }   

यह कॉलम जोड़ता है लेकिन इसके अंतर्गत कोई मान नहीं दिखाए जाते हैं।


आप यह किस घटना पर कर रहे हैं? संभवतः ग्रिड संग्रह में मोबाइल कॉलम नहीं है और आपको इस कॉलम को संग्रह में जोड़ना होगा। यह$block->getCollection()
Zefiryn

@ ज़ेफिरिन मैं ऐसा कैसे कर सकता हूँ ?? मैं पर्यवेक्षक का उपयोग करके संग्रह में मोबाइल कॉलम कैसे जोड़ सकता हूं?
कुलदीप

1
@ कूलदीप दूसरा जवाब बेहतर है क्योंकि यह कोड के दोहराव से बचता है। आप उस एक को स्वीकार करना चाह सकते हैं।
एलेक्स

जवाबों:


25

ग्राहक ग्रिड में एक कॉलम जोड़ने के लिए, आपको ब्लॉक में 2 चीजों को ओवरराइड करने की आवश्यकता है Mage_Adminhtml_Block_Customer_Grid

  • _prepareCollection - संग्रह में अपनी विशेषता जोड़ने के लिए
  • _prepareColumns - अपने ग्रिड में कॉलम जोड़ने के लिए।

इसके लिए आपको एक नया एक्सटेंशन बनाना चाहिए। चलो इसे बुलाओ Easylife_Customer। इसके लिए आपको निम्नलिखित फाइलों की आवश्यकता होगी:
app/etc/module/Easylife_Customer.xml- घोषणा फ़ाइल

<?xml version="1.0"?>
<config>
    <modules>
        <Easylife_Customer>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Customer /><!-- your module should depend on Mage_Customer -->
                <Mage_Adminhtml /><!-- your module should depend on Mage_Adminhtml also -->
            </depends>
        </Easylife_Customer>
    </modules>
</config>

app/code/local/Easylife/Customer/etc/config.xml - कॉन्फ़िगरेशन फ़ाइल

<?xml version="1.0"?>
<config>
    <modules>
        <Easylife_Customer>
            <version>0.0.1</version>
        </Easylife_Customer>
    </modules>
    <global>
        <blocks>
            <adminhtml>
                <rewrite>
                    <customer_grid>Easylife_Customer_Block_Adminhtml_Customer_Grid</customer_grid><!-- rewrite the customer grid -->
                </rewrite>
            </adminhtml>
        </blocks>
    </global>
</config>

app/code/local/Easylife/Customer/Block/Adminhtml/Customer/Grid.php- ग्राहक ग्रिड का अपना संस्करण। कोड में मेरी टिप्पणी पढ़ें:

<?php
class Easylife_Customer_Block_Adminhtml_Customer_Grid extends Mage_Adminhtml_Block_Customer_Grid{
    /**
     * override the _prepareCollection to add an other attribute to the grid
     * @return $this
     */
    protected function _prepareCollection(){
        $collection = Mage::getResourceModel('customer/customer_collection')
            ->addNameToSelect()
            ->addAttributeToSelect('email')
            ->addAttributeToSelect('created_at')
            ->addAttributeToSelect('group_id')
            //if the attribute belongs to the customer, use the line below
            ->addAttributeToSelect('mobile')
            //if the attribute belongs to the customer address, comment the line above and use the one below
            //->joinAttribute('mobile', 'customer_address/mobile', 'default_billing', null, 'left')
            ->joinAttribute('billing_postcode', 'customer_address/postcode', 'default_billing', null, 'left')
            ->joinAttribute('billing_city', 'customer_address/city', 'default_billing', null, 'left')
            ->joinAttribute('billing_telephone', 'customer_address/telephone', 'default_billing', null, 'left')
            ->joinAttribute('billing_region', 'customer_address/region', 'default_billing', null, 'left')
            ->joinAttribute('billing_country_id', 'customer_address/country_id', 'default_billing', null, 'left');

        $this->setCollection($collection);
        //code from Mage_Adminhtml_Block_Widget_Grid::_prepareCollection()
        //since calling parent::_prepareCollection will render the code above useless
        //and you cannot call in php parent::parent::_prepareCollection()
        if ($this->getCollection()) {

            $this->_preparePage();

            $columnId = $this->getParam($this->getVarNameSort(), $this->_defaultSort);
            $dir      = $this->getParam($this->getVarNameDir(), $this->_defaultDir);
            $filter   = $this->getParam($this->getVarNameFilter(), null);

            if (is_null($filter)) {
                $filter = $this->_defaultFilter;
            }

            if (is_string($filter)) {
                $data = $this->helper('adminhtml')->prepareFilterString($filter);
                $this->_setFilterValues($data);
            }
            else if ($filter && is_array($filter)) {
                $this->_setFilterValues($filter);
            }
            else if(0 !== sizeof($this->_defaultFilter)) {
                $this->_setFilterValues($this->_defaultFilter);
            }

            if (isset($this->_columns[$columnId]) && $this->_columns[$columnId]->getIndex()) {
                $dir = (strtolower($dir)=='desc') ? 'desc' : 'asc';
                $this->_columns[$columnId]->setDir($dir);
                $this->_setCollectionOrder($this->_columns[$columnId]);
            }

            if (!$this->_isExport) {
                $this->getCollection()->load();
                $this->_afterLoadCollection();
            }
        }

        return $this;
    }

    /**
     * override the _prepareColumns method to add a new column after the 'email' column
     * if you want the new column on a different position just change the 3rd parameter
     * of the addColumnAfter method to the id of your desired column
     */
    protected function _prepareColumns(){
        $this->addColumnAfter('mobile', array(
            'header'    => Mage::helper('customer')->__('Mobile'),
            'index'     => 'mobile'
        ),'email');
        return parent::_prepareColumns();
    }
}

कैश साफ़ करें और आप तैयार रहें।


थैंक्यू यार तुम रॉक..यह आकर्षण की तरह काम किया: डी .. बहुत बहुत धन्यवाद।
कुलदीप

जैसा कि मैंने इस उत्तर में पाया , आप एक दादा-दादी की विधि को इसके वर्ग नाम से कह सकते हैं, इस तरह से:Mage_Adminhtml_Block_Widget_Grid::_prepareCollection();
kiatng

यह दादा दादी के मेथोट नहीं कह रहा है। आप गैर स्थैतिक विधि को एटिटिक कह रहे हैं। यह ठीक नहीं है।
मेरियस

39

प्रेक्षकों का तरीका:

अपनी config.xml फ़ाइल में 2 पर्यवेक्षकों की घोषणा करें: एक को ग्रिड ब्लॉक में अपने कॉलम को जोड़ने के लिए और दूसरा संबंधित विशेषता से डेटा लोड करने के लिए:

<adminhtml>
    <events>
        <core_block_abstract_to_html_before>
            <observers>
                <{observer_name}>
                    <type>singleton</type>
                    <class>{namespace}_{module}/observer</class>
                    <method>beforeBlockToHtml</method>
                </{observer_name}>
            </observers>
        </core_block_abstract_to_html_before>
        <eav_collection_abstract_load_before>
            <observers>
                <{observer_name}>
                    <class>{namespace}_{module}/observer</class>
                    <method>beforeCollectionLoad</method>
                </{observer_name}>
            </observers>
        </eav_collection_abstract_load_before>
    </events>
</adminhtml>

उपयुक्त विधियों के साथ एक पर्यवेक्षक वर्ग बनाएँ:

class {Namespace}_{Module}_Model_Observer
{
    public function beforeBlockToHtml(Varien_Event_Observer $observer)
    {
        $grid = $observer->getBlock();

        /**
         * Mage_Adminhtml_Block_Customer_Grid
         */
        if ($grid instanceof Mage_Adminhtml_Block_Customer_Grid) {
            $grid->addColumnAfter(
                '{column_code}',
                array(
                    'header' => Mage::helper('{Module}_customer')->__('{{column_name}}'),
                    'index'  => '{column_code}'
                ),
                'entity_id'
            );
        }
    }

    public function beforeCollectionLoad(Varien_Event_Observer $observer)
    {
        $collection = $observer->getCollection();
        if (!isset($collection)) {
            return;
        }

        /**
         * Mage_Customer_Model_Resource_Customer_Collection
         */
        if ($collection instanceof Mage_Customer_Model_Resource_Customer_Collection) {
            /* @var $collection Mage_Customer_Model_Resource_Customer_Collection */
            $collection->addAttributeToSelect('{attribute_code}');
        }
    }
}

1
निश्चित रूप से सबसे अच्छा विकल्प। कोई फिर से लिखना
सिल्वेन रे

दुर्भाग्य से यह सीएसवी निर्यात के लिए काम नहीं करता है - कॉलम वहां गायब है।
एलेक्स

यह उत्पाद ग्रिड पेज के लिए कैसा होगा?
ठंढा विष

पर्यवेक्षक की तुलना में
रिवाइटर

मैं केवल Mage_Adminhtml_Block_Widget_Grid :: Mage_Adminhtml_Block_Widget_Grid () पर ईवेंट का उपयोग करने की अनुशंसा करूंगा जो अधिक विशिष्ट है।
बजे क्रिस्टोफ फेरेबूफ

9

मैं एलेक्स टिप्पणी का जवाब:

CSV में निर्यात करने के लिए भी उपयोग करें

core_block_abstract_prepare_layout_before

के बजाय

core_block_abstract_to_html_before

4

यह मानते हुए कि तब $blockका एक उदाहरण हैMage_Adminhtml_Block_Customer_Grid

$block->getCollection()ग्रिड में उपयोग किए गए ग्राहक संग्रह को वापस करना चाहिए, जो इसका एक उदाहरण है Mage_Customer_Model_Resource_Customer_Collection। जब आप कोड Mage_Adminhtml_Block_Customer_Grid::_prepareCollection()देखेंगे तो आप देखेंगे कि आप उस संग्रह में एक विशेषता कैसे जोड़ सकते हैं।

यह होना चाहिए (हालांकि परीक्षण नहीं)

यह मानते हुए कि ग्राहक इकाई में एक विशेषता मोबाइल जोड़ा गया है

$block->getCollection()
      ->addAttributeToSelect('mobile');

या यदि मोबाइल है और विशेषता बिलिंग पता इकाई में जोड़ा गया है

$block->getCollection()
      ->joinAttriubte('mobile','customer_address/mobile','defaul_billing',null,'left');

नमस्कार @Zefiryn, मैंने आपके द्वारा भेजे गए दोनों कोड आज़माए, लेकिन उनमें से कोई भी काम नहीं कर रहा है
कुलदीप

मुझे बताएं कि आप इस घटना को किस पर्यवेक्षक के रूप में चला रहे हैं
Zefiryn

यह एक अच्छा दृष्टिकोण है लेकिन केवल ग्रिड निर्यात करते समय काम करता है। ऐसा इसलिए होता है क्योंकि इसके अंत में Mage_Adminhtml_Block_Widget_Grid::_prepareCollectionकहा जाता है $this->getCollection()->load():। इसका मतलब है कि संग्रह में किसी भी अन्य संशोधन को अनदेखा किया गया है। लेकिन, जैसा मैंने कहा, ग्रिड निर्यात के लिए यह एक बहुत अच्छा तरीका है। निर्यात करते समय loadविधि को बहुत बाद तक नहीं कहा जाता है।
मेरियस


2

दूसरा रास्ता:

अपने कस्टम मॉड्यूल के साथ ग्राहक ग्रिड ब्लॉक को फिर से लिखें और setCollection()अपनी कस्टम विशेषता लाने के लिए फ़ंक्शन का उपयोग करें।

एप्लिकेशन / कोड / [स्थानीय या समुदाय] /YourCompany/YourModule/etc/config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <yourcompany_yourmodule>
            <version>0.1.0</version>
        </yourcompany_yourmodule>
    </modules>
    <global>
        <blocks>
            <adminhtml>
                <rewrite>
                    <customer_grid>YourCompany_YourModule_Block_Customer_Grid</customer_grid>
                </rewrite>
            </adminhtml>
        </blocks>
    </global>
</config>

ऐप / कोड / [स्थानीय या समुदाय] /YourCompany/YourModule/Block/Customer/Gor.pp

<?php

class YourCompany_YourModule_Block_Customer_Grid extends Mage_Adminhtml_Block_Customer_Grid
{
    public function setCollection($collection)
    {
        // your field/attribute to fetch, assuming it to be 'mobile'
        $collection->addAttributeToSelect('mobile'); 
        parent::setCollection($collection);
    }

    protected function _prepareColumns()
    {
        parent::_prepareColumns();

        $this->addColumn('mobile', array(
                'header'=> Mage::helper('customer')->__('Mobile'),
                'index' => 'mobile',
                'type'  => 'text',
                'width' => '100px',
        ));

        // show your new column named 'mobile' after ZIP column
        $this->addColumnsOrder('mobile', 'billing_postcode');

        return parent::_prepareColumns();
    }
}

1
आपके लिए धन्यवाद कोड। अब हम ग्राहक ग्रिड में इस विशेषता को प्रदर्शित करने का आदेश कैसे देते हैं?
प्रिन्स पटेल

आप addColumnsOrderफ़ंक्शन का उपयोग करके कॉलम को आदेश दे सकते हैं । कृपया अद्यतन उत्तर की जाँच करें।
मुकेश चपागैन

मैंने इस $ का उपयोग किया-> addColumnAfter () लेकिन $ this-> addColumnsOrder () भी आपके उत्तर के लिए धन्यवाद काम कर रहा है।
प्रिंस पटेल

IMHO उपयोग सेट-कॉलेक्शन () वास्तव में सबसे अच्छा समाधान है (मैं सभी लोडकॉलिनेशन इवेंट में पर्यवेक्षक को जोड़ना पसंद नहीं करता, बहुत अच्छा प्रदर्शन-वार नहीं लगता ...)
Fra

0

मुझे कुछ डिफ़ॉल्ट कॉलम हटाने और ग्राहक ग्रिड में अतिरिक्त कॉलम जोड़ने की आवश्यकता थी। मैंने कॉलम को विन्यास योग्य बनाने का निर्णय लिया। पहले मैंने system.xml में 2 मल्टीसेलेक्ट बॉक्स जोड़े :

<config>
    <sections>
        <extendedcustomer translate="label" module="extendedcustomer">
            <label>Extended Customer</label>
            <tab>customer</tab>
            <sort_order>100</sort_order>
            <show_in_default>1</show_in_default>
            <show_in_website>1</show_in_website>
            <show_in_store>1</show_in_store>
            <groups>
                <manage_grid translate="label">
                    <label>Manage Customer Grid in Backend</label>
                    <frontend_type>text</frontend_type>
                    <sort_order>10</sort_order>
                    <show_in_default>1</show_in_default>
                    <show_in_website>1</show_in_website>
                    <show_in_store>1</show_in_store>
                    <fields>
                        <remove translate="label">
                            <label>Remove Columns</label>
                            <frontend_type>multiselect</frontend_type>
                            <source_model>extendedcustomer/source_gridColumn</source_model>
                            <sort_order>10</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>1</show_in_store>
                        </remove>
                        <add translate="label">
                            <label>Add Columns</label>
                            <frontend_type>multiselect</frontend_type>
                            <source_model>extendedcustomer/source_attributeCode</source_model>
                            <sort_order>20</sort_order>
                            <show_in_default>1</show_in_default>
                            <show_in_website>1</show_in_website>
                            <show_in_store>1</show_in_store>
                        </add>                       
                    </fields>
                </manage_grid>
            </groups>
        </extendedcustomer>
    </sections>
</config>

स्रोत मॉडल सीधे आगे हैं:

class SomeCo_ExtendedCustomer_Model_Source_GridColumn
{
    public function toOptionArray()
    {     
        return [
            ['value' => 'name', 'label' => 'Name'],
            ['value' => 'email', 'label' => 'Email'],
            ['value' => 'group', 'label' => 'Group'],
            ['value' => 'billing_telephone', 'label' => 'Telephone'],
            ['value' => 'billing_postcode', 'label' => 'ZIP'],
            ['value' => 'billing_country_id', 'label' => 'Country'],
            ['value' => 'billing_region', 'label' => 'State/Province'],
            ['value' => 'customer_since', 'label' => 'Customer Since'],
            ['value' => 'website_id', 'label' => 'Website'],
            ['value' => 'action', 'label' => 'Action']
        ];
    }
}

दूसरा स्रोत मॉडल

class SomeCo_ExtendedCustomer_Model_Source_AttributeCode
{
    public function toOptionArray()
    {     
        $collection = Mage::getResourceModel('customer/attribute_collection')
            ->addFieldToSelect(['attribute_code', 'frontend_label'])
            ->addFieldToFilter('frontend_label', ['notnull'=>'notnull'])
            ->addFieldToFilter('is_user_defined', 1);
        $options = [];
        foreach ($collection as $item) {
            $options[] = [
                'value'     => $item->getData('attribute_code'),
                'label'     => $item->getData('frontend_label')
            ];
        }
        return $options;
    }
}

फिर ग्रिड क्लास को ओवरराइड करें:

class SomeCo_ExtendedCustomer_Block_Adminhtml_Customer_Grid extends Mage_Adminhtml_Block_Customer_Grid
{
    public function __construct()
    {
        parent::__construct();
        if ($remove = Mage::getStoreConfig('extendedcustomer/manage_grid/remove')) {
            $remove = explode(',', $remove);
        } else {
            $remove = false;
        }
        $this->setRemoveList($remove);

        if ($add = Mage::getStoreConfig('extendedcustomer/manage_grid/add')) {
            $add = explode(',', $add);
        } else {
            $add = false;
        }
        $this->setAddList($add);
    }

    protected function _prepareCollection()
    {
        if ($remove = $this->getRemoveList()) {
            $collection = Mage::getResourceModel('customer/customer_collection');
            if (!in_array('name', $remove)) {
                $collection->addNameToSelect();
            }
            foreach (['postcode', 'city', 'telephone', 'region', 'country_id'] as $suffix) {
                if (!in_array('billing_'.$suffix, $remove)) {
                    $collection->joinAttribute('billing_'.$suffix, 'customer_address/'.$suffix, 'default_billing', null, 'left');
                }
            }
        } else {
            $collection = Mage::getResourceModel('customer/customer_collection')
                ->addNameToSelect()
                //->addAttributeToSelect('email') // static attributes are added by default
                //->addAttributeToSelect('created_at')
                //->addAttributeToSelect('group_id')
                ->joinAttribute('billing_postcode', 'customer_address/postcode', 'default_billing', null, 'left')
                ->joinAttribute('billing_city', 'customer_address/city', 'default_billing', null, 'left')
                ->joinAttribute('billing_telephone', 'customer_address/telephone', 'default_billing', null, 'left')
                ->joinAttribute('billing_region', 'customer_address/region', 'default_billing', null, 'left')
                ->joinAttribute('billing_country_id', 'customer_address/country_id', 'default_billing', null, 'left');
        }

        if ($add = $this->getAddList()) {
            $collection->addAttributeToSelect($add);
        }

        $this->setCollection($collection);

        return Mage_Adminhtml_Block_Widget_Grid::_prepareCollection(); // call grandParent
    }

    protected function _prepareColumns()
    {
        $this->addColumn('entity_id', array(
            'header'    => Mage::helper('customer')->__('ID'),
            'width'     => '50px',
            'index'     => 'entity_id',
            'type'  => 'number',
        ));

        $remove = $this->getRemoveList();

        if (!$remove || !in_array('name', $remove)) {           
            $this->addColumn('name', array(
                'header'    => Mage::helper('customer')->__('Name'),
                'index'     => 'name'
            ));
        }

        if ($add = $this->getAddList()) {
            $collection = Mage::getResourceModel('customer/attribute_collection')
                ->addFieldToSelect(['attribute_code', 'frontend_label', 'source_model'])
                ->addFieldToFilter('attribute_code', ['in' => $add]);
            foreach ($collection as $item) {
                if ($source = $item->getSourceModel()) {
                    $this->addColumn($item->getAttributeCode(), array(
                        'header'    =>  $item->getFrontendLabel(),
                        'width'     =>  '100',
                        'index'     =>  $item->getAttributeCode(),
                        'type'      =>  'options',
                        'options'   =>  Mage::getSingleton($source)->toOptionHash(false)
                    ));
                } else {
                    $this->addColumn($item->getAttributeCode(), array(
                        'header'    => $item->getFrontendLabel(),
                        'width'     => '150',
                        'index'     => $item->getAttributeCode()
                    ));
                }
            }
        }

        if (!$remove || !in_array('email', $remove)) {            
            $this->addColumn('email', array(
                'header'    => Mage::helper('customer')->__('Email'),
                'width'     => '150',
                'index'     => 'email'
            ));
        }

        if (!$remove || !in_array('group', $remove)) {
            $groups = Mage::getResourceModel('customer/group_collection')
                ->addFieldToFilter('customer_group_id', array('gt'=> 0))
                ->load()
                ->toOptionHash();

            $this->addColumn('group', array(
                'header'    =>  Mage::helper('customer')->__('Group'),
                'width'     =>  '100',
                'index'     =>  'group_id',
                'type'      =>  'options',
                'options'   =>  $groups,
            ));
        }

        if (!$remove || !in_array('billing_telephone', $remove)) {
            $this->addColumn('Telephone', array(
                'header'    => Mage::helper('customer')->__('Telephone'),
                'width'     => '100',
                'index'     => 'billing_telephone'
            ));
        }

        if (!$remove || !in_array('billing_postcode', $remove)) {
            $this->addColumn('billing_postcode', array(
                'header'    => Mage::helper('customer')->__('ZIP'),
                'width'     => '90',
                'index'     => 'billing_postcode',
            ));
        }

        if (!$remove || !in_array('billing_country_id', $remove)) {
            $this->addColumn('billing_country_id', array(
                'header'    => Mage::helper('customer')->__('Country'),
                'width'     => '100',
                'type'      => 'country',
                'index'     => 'billing_country_id',
            ));
        }

        if (!$remove || !in_array('billing_region', $remove)) {
            $this->addColumn('billing_region', array(
                'header'    => Mage::helper('customer')->__('State/Province'),
                'width'     => '100',
                'index'     => 'billing_region',
            ));
        }

        if (!$remove || !in_array('customer_since', $remove)) {
            $this->addColumn('customer_since', array(
                'header'    => Mage::helper('customer')->__('Customer Since'),
                'type'      => 'datetime',
                'align'     => 'center',
                'index'     => 'created_at',
                'gmtoffset' => true
            ));
        }

        if (!$remove || !in_array('website_id', $remove)) {
            if (!Mage::app()->isSingleStoreMode()) {
                $this->addColumn('website_id', array(
                    'header'    => Mage::helper('customer')->__('Website'),
                    'align'     => 'center',
                    'width'     => '80px',
                    'type'      => 'options',
                    'options'   => Mage::getSingleton('adminhtml/system_store')->getWebsiteOptionHash(true),
                    'index'     => 'website_id',
                ));
            }
        }

        if (!$remove || !in_array('action', $remove)) {
            $this->addColumn('action',
                array(
                    'header'    =>  Mage::helper('customer')->__('Action'),
                    'width'     => '100',
                    'type'      => 'action',
                    'getter'    => 'getId',
                    'actions'   => array(
                        array(
                            'caption'   => Mage::helper('customer')->__('Edit'),
                            'url'       => array('base'=> '*/*/edit'),
                            'field'     => 'id'
                        )
                    ),
                    'filter'    => false,
                    'sortable'  => false,
                    'index'     => 'stores',
                    'is_system' => true,
            ));
        }

        $this->addExportType('*/*/exportCsv', Mage::helper('customer')->__('CSV'));
        $this->addExportType('*/*/exportXml', Mage::helper('customer')->__('Excel XML'));
        return Mage_Adminhtml_Block_Widget_Grid::_prepareColumns();
    }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.