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()возвращают true в моем классе контроллера, но возвращают false в моем классе блока. Почему?
Пол

Ответы:


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"/>
Джулиано Варгас

Я отключил кэш, который по-прежнему возвращает
ноль

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
Doni Wibowo

@DoniWibowo это правда, но вы должны быть осторожны при кэшировании страниц с динамическими данными в первую очередь. Например, вы не хотите отображать одно и то же имя для всех клиентов.
Раду

1

Кажется, это работает, когда вы передаете объект Context родительскому классу перед созданием сеанса клиента:

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 сбрасывает все сеансы клиента, когда FPC включен.

Пожалуйста, используйте cacheable = "false" для bloick в вашем макете:

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

В этом случае Magento 2 игнорирует эту страницу из-за кеширования.


как использовать cacheable = "false" на страницах CMS?
Джафар Пинджар

0

Если вам нужен только customer_idтогда без загрузки всего объекта (см. Метод getCustomerметода), вы можете получить его, просто используя getCustomerIdметод.

Как getIdметод также вызывает getCustomerIdметод.

файл: vendor / magento / module-customer / Model / Session.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

Сначала создайте экземпляр в файле header.phtml, как показано ниже, а также, если доступно более одного хранилища и кто-то хочет получать почту только в одном из хранилищ.

введите описание изображения здесь

<?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 и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.