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

Я ввійшов у систему, але він повертається до нуля. І я роблю це в класі блоків.
Павло

Який клас сеансу ви використовуєте?
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()неправдиво завжди. Я роблю те саме в класі контролера, і це чудово працює.
Павло

Нарешті, це працює. Я не впевнений, що я змінив.
Павло

можливо ви відключили кеш повного сторінки?
davideghz

Так, це кеш У мене був той самий випуск<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
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" для блоку у своєму макеті:

<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метод.

Файл: постачальник / магент / модуль-замовник / Модель / 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.