Magento 2 Obter ID do cliente da sessão em uma classe de bloco


12

Como obter o ID do cliente da sessão? Eu tentei isso, mas não funcionou.

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
Se o cliente logado então você pode obter ID de cliente Caso contrário, é nulo de retorno usando '$ this -> _ customerSession-> GetCustomer () -> getId ()'
Sohel Rana

Eu entrei, mas ele retorna nulo. E eu estou fazendo isso na aula de bloco.
Paulo

Qual classe de sessão você usa?
Sohel Rana

Acabei de descobrir que $this->session->isLoggedIn()return true na minha classe controller, mas return false na minha classe block. Por quê?
Paulo

4
Bloco tem de ser definido cacheable=falsever Magento 2 - Obter ID do cliente da sessão em uma classe bloco
Lukas Komarek

Respostas:


24

É cópia de trabalho. Você pode comparar com a sua classe de bloqueio. Aqui eu uso Form como classe de bloco

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
Eu fiz exatamente o mesmo, mas ele ainda retorna nulo. E $this->customerSession->isLoggedIn()é falso sempre. Eu faço o mesmo em uma classe de controlador e funciona bem.
Paulo

Finalmente, funciona. Não tenho certeza do que mudei.
Paul

você desativou o cache de página inteira, talvez?
Davideghz

Sim, foi de cache Eu tive mesmo problema<block class="Vendor\Block\Bla\Bla" name="block.name" template="Wed2b_Suppliers::template/template.phtml" cacheable="false"/>
Juliano Vargas

Eu desativei o cache ainda está retornando nulo #
Ajwad Syed 18/08/19

4

Você precisa injetar \Magento\Customer\Model\Session $customerSession,classe para obter o ID do cliente da sessão do cliente.

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
}

NOTA : Você só obtém o ID do cliente se o cliente efetuou login e a sessão do cliente foi inicializada


4

Quando você define o bloco que usa a sessão, é necessário desativar o cache para ele.

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

2
isso fará com que toda a página e todas as páginas que usam este bloco será perdida pelo FPC
Doni Wibowo

@DoniWibowo isso é verdade, mas você precisa ter cuidado ao armazenar em cache páginas com dados dinâmicos. Você não deseja exibir o mesmo nome para todos os clientes, por exemplo.
Radu

1

Parece funcionar quando você passa o objeto Context para a classe pai antes de instanciar a sessão do cliente:

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
Ímpar. Eu observo a mesma coisa. Obrigado pela ajuda. Eu me pergunto por que isso faz diferença.
N

0

Enquanto estamos injetando a sessão do cliente no bloco para recuperar os dados do cliente logado e não estamos obtendo os dados do cliente porque o Magento 2 redefine todas as sessões do cliente quando o FPC está ativado.

Use cacheable = "false" para bloick em seu layout:

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

Nesse caso, o Magento 2 ignora esta página do cache.


como usar cacheable = "false" nas páginas do cms?
Jafar pinjar

0

Se você precisar apenas do customer_iditem sem carregar o objeto inteiro (consulte o método getCustomermethod), poderá obtê-lo simplesmente usando o getCustomerIdmétodo

Como getIdmétodo também chama getCustomerIdmétodo.

arquivo: 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

Primeiro, crie uma instância no arquivo header.phtml como abaixo e também se houver mais de uma loja disponível e alguém desejar receber e-mails em apenas uma delas.

insira a descrição da imagem aqui

<?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
    }
?>
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.