Magento 2 एक ब्लॉक वर्ग में सत्र से ग्राहक आईडी प्राप्त करें


12

सत्र से ग्राहक आईडी कैसे प्राप्त करें? मैंने यह कोशिश की लेकिन काम नहीं किया।

protected $_customerBonusPointFactory;
protected $_customerSession;

public function __construct(Session $customerSession, \Magento\Framework\View\Element\Template\Context $context) {
    $this->_customerSession = $customerSession;
    parent::__construct($context);
}

public function _prepareLayout() {
    var_dump($this->_customerSession->getCustomer()->getId());
    exit();
    return parent::_prepareLayout();
}

2
यदि ग्राहक लॉग-इन करता है तो आप ग्राहक आईडी प्राप्त कर सकते हैं अन्यथा यह '$ this -> _ customerSession-> getCustomer () -> getId ()'
Sohel Rana

मैंने लॉग इन किया है, लेकिन यह अशक्त है। और मैं इसे ब्लॉक क्लास में कर रहा हूं।
पॉल

आप किस सत्र की कक्षा का उपयोग करते हैं?
सोहेल राणा

मैंने अभी-अभी पाया कि $this->session->isLoggedIn()अपने नियंत्रक वर्ग में सही लौटा लेकिन मेरे ब्लॉक वर्ग में गलत है। क्यों?
पॉल

जवाबों:


25

इसकी कॉपी काम कर रही है। आप अपने ब्लॉक वर्ग के साथ तुलना कर सकते हैं। यहां मैं फॉर्म को ब्लॉक क्लास के रूप में उपयोग करता हूं

namespace Vendor\Module\Block;


class Form extends \Magento\Framework\View\Element\Template
{
    protected $customerSession;

    /**
     * Construct
     *
     * @param \Magento\Framework\View\Element\Template\Context $context
     * @param \Magento\Customer\Model\Session $customerSession
     * @param array $data
     */
    public function __construct(
        \Magento\Framework\View\Element\Template\Context $context,
        \Magento\Customer\Model\Session $customerSession,
        array $data = []
    ) {
        parent::__construct($context, $data);

        $this->customerSession = $customerSession;
    }

    public function _prepareLayout()
    {

        var_dump($this->customerSession->getCustomer()->getId());
        exit();
        return parent::_prepareLayout();
    }
}

1
मैंने ठीक वैसा ही किया लेकिन यह अभी भी अशक्त है। और $this->customerSession->isLoggedIn()हमेशा झूठा होता है। मैं एक नियंत्रक वर्ग में ऐसा ही करता हूं और यह ठीक काम करता है।
पॉल

अंत में, यह काम करता है। मुझे यकीन नहीं है कि मैंने क्या बदल दिया है।
पॉल

क्या आपने पूर्ण पृष्ठ कैश अक्षम कर दिया है?
डेविडेगज़

हां यह कैश था मुझे एक ही मुद्दा था<block class="Vendor\Block\Bla\Bla" name="block.name" template="Wed2b_Suppliers::template/template.phtml" cacheable="false"/>
वर्गास

मैंने कैश को अभी भी निष्क्रिय कर दिया है
Ajwad Syed

4

\Magento\Customer\Model\Session $customerSession,ग्राहक सत्र से ग्राहक आईडी प्राप्त करने के लिए आपको कक्षा को इंजेक्ट करने की आवश्यकता है ।

protected $_customerSession;

public function __construct(
    ...
    \Magento\Customer\Model\Session $customerSession,
    ...
) {
    ...
    $this->_customerSession = $customerSession;
    ...
}

public function getCustomer()
{
    echo $this->_customerSession->getCustomer()->getId(); //Print current customer ID

    $customerData = $this->_customerSession->getCustomer(); 
    print_r($customerData->getData()); //Print current Customer Data
}

नोट : यदि ग्राहक लॉग इन और ग्राहक सत्र आरंभीकृत करता है तो आपको केवल ग्राहक आईडी मिलती है


4

जब आप ब्लॉक को परिभाषित करते हैं जो सत्र का उपयोग करते हैं तो आपको इसके लिए कैश को अक्षम करना होगा।

 <block class="Vendor\Module\Block\Index" name="Name"
 template="Vendor_Module::template/path.phtml" cacheable="false">
 </block>

2
यह पूरे पृष्ठ का कारण बनेगा और इस ब्लॉक का उपयोग करने वाले प्रत्येक पृष्ठ को FPC द्वारा MISSed किया जाएगा
Doni Wibowo

@DoniWibowo सच है, लेकिन पहली जगह में गतिशील डेटा वाले पृष्ठों को कैशिंग करने के लिए आपको सावधानी बरतने की आवश्यकता है। आप उदाहरण के लिए सभी ग्राहकों के लिए एक ही नाम प्रदर्शित नहीं करना चाहते हैं।
राडू

1

जब आप ग्राहक सत्र को तत्काल करने से पहले मूल कक्षा में संदर्भ ऑब्जेक्ट पास करते हैं तो यह काम करने लगता है:

class History extends \Magento\Framework\View\Element\Template
{

    /**
     * @var Session
     */
    protected $_session;

    public function __construct(
        Template\Context $context,
        \Magento\Customer\Model\Session $session,
        array $data
    )
    {
        parent::__construct($context, $data);
        $this->_session = $session;
    }

    public function _prepareLayout()
    {

        var_dump($this->_session->getCustomerId());
        exit();
        return parent::_prepareLayout();
    }
}

2
अजीब। मैं उसी चीज का निरीक्षण करता हूं। सहायता के लिए धनयवाद। मुझे आश्चर्य है कि इससे फर्क क्यों पड़ता है।
nshiff

0

जबकि हम ग्राहक डेटा में लॉग इन को पुनः प्राप्त करने के लिए ब्लॉक में ग्राहक सत्र को इंजेक्ट कर रहे हैं और हमें ब्लॉक से ग्राहक डेटा नहीं मिल रहा है क्योंकि एफपीसी सक्षम होने पर Magento 2 सभी ग्राहक सत्रों को रीसेट कर देता है।

कृपया अपने लेआउट में ब्लिक के लिए कैशेबल = "गलत" का उपयोग करें:

<referenceContainer name="content"> 
        <block class="Arman\Test\Block\List" name="list" template="Arman_Test::list.phtml" cacheable="false"> 
        </block>
    </referenceContainer>  

इस मामले में, Magento 2 कैशिंग से इस पृष्ठ को अनदेखा करता है।


cms पेजों में cacheable = "false" का उपयोग कैसे करें?
जाफर पिंजर

0

यदि आपको customer_idसंपूर्ण ऑब्जेक्ट को लोड किए बिना केवल तब की आवश्यकता है (विधि getCustomerविधि देखें ) तो आप इसे केवल getCustomerIdविधि का उपयोग करके प्राप्त कर सकते हैं ।

जैसे getIdविधि को विधि भी कहते हैं getCustomerId

फ़ाइल: विक्रेता / मैगनेटो / मॉड्यूल-ग्राहक / मॉडल / सत्र.php

/**
 * Retrieve customer model object
 *
 * @return Customer
 * use getCustomerId() instead
 */
public function getCustomer()
{
    if ($this->_customerModel === null) {
        $this->_customerModel = $this->_customerFactory->create()->load($this->getCustomerId());
    }

    return $this->_customerModel;
}


/**
 * Retrieve customer id from current session
 *
 * @api
 * @return int|null
 */
public function getCustomerId()
{
    if ($this->storage->getData('customer_id')) {
        return $this->storage->getData('customer_id');
    }
    return null;
}

/**
 * Retrieve customer id from current session
 *
 * @return int|null
 */
public function getId()
{
    return $this->getCustomerId();
}

0

सबसे पहले, नीचे के रूप में शीर्ष लेख में एक उदाहरण बनाएं। एक से अधिक स्टोर उपलब्ध होने पर भी और केवल एक ही स्टोर में मेल प्राप्त करना चाहते हैं।

यहाँ छवि विवरण दर्ज करें

<?php
    $objectManager =  \Magento\Framework\App\ObjectManager::getInstance();        
    $storeManager  = $objectManager->get('\Magento\Store\Model\StoreManagerInterface');
    $storeID       = $storeManager->getStore()->getStoreId(); 
    $storeName     = $storeManager->getStore()->getName();
?>

<?php
    $customerSession = $om->get('Magento\Customer\Model\Session');
    if($customerSession->isLoggedIn()) {
            echo $customerSession->getCustomer()->getId(); // get ID
    }
?>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.