Magento 2 Obtenga la identificación del cliente de la sesión en una clase de bloque


12

¿Cómo obtener la identificación del cliente de la sesión? Intenté esto pero no funcionó.

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
Si el cliente inició sesión, puede obtener la identificación del cliente; de ​​lo contrario, se devolverá nulo utilizando '$ this -> _ customerSession-> getCustomer () -> getId ()'
Sohel Rana

He iniciado sesión pero devuelve nulo. Y lo estoy haciendo en la clase de bloque.
Paul

¿Qué clase de sesión usas?
Sohel Rana

Acabo de encontrar que $this->session->isLoggedIn()return es verdadero en mi clase de controlador pero return false en mi clase de bloque. ¿Por qué?
Paul

44
El bloque tiene que establecerse cacheable=falsever Magento 2 - Obtener ID de cliente de sesión en una clase de bloque
Lukas Komarek

Respuestas:


25

Es una copia de trabajo. Puedes comparar con tu clase de bloque. Aquí uso Form como clase de bloque

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
Hice exactamente lo mismo pero sigue siendo nulo. Y $this->customerSession->isLoggedIn()es falso siempre. Hago lo mismo en una clase de controlador y funciona bien.
Paul

Finalmente funciona. No estoy seguro de lo que he cambiado.
Paul

¿Ha deshabilitado la caché de página completa tal vez?
davideghz

Sí, fue el caché. He tenido el mismo problema<block class="Vendor\Block\Bla\Bla" name="block.name" template="Wed2b_Suppliers::template/template.phtml" cacheable="false"/>
Juliano Vargas


4

Debe inyectar la \Magento\Customer\Model\Session $customerSession,clase para obtener la identificación del cliente de la sesión del 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 : Solo obtendrá la identificación del cliente si el cliente inició sesión y la sesión del cliente se inicializó


4

Cuando define el bloque que usa la sesión, debe deshabilitar la memoria caché.

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

2
esto hará que toda la página y todas las páginas que usan este bloque sean FALTADAS por el FPC
Doni Wibowo

@DoniWibowo es cierto, pero debe tener cuidado al almacenar en caché páginas con datos dinámicos en primer lugar. No desea mostrar el mismo nombre para todos los clientes, por ejemplo.
Radu

1

Parece funcionar cuando pasa el objeto Context a la clase padre antes de crear una instancia de la sesión del 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
Impar. Yo observo lo mismo. Gracias por la ayuda. Me pregunto por qué esto hace la diferencia.
nshiff

0

Si bien estamos inyectando sesión de cliente en bloque para recuperar datos de cliente registrados y no estamos obteniendo datos de cliente del bloque porque Magento 2 restablece todas las sesiones de cliente cuando FPC está habilitado.

Utilice cacheable = "false" para bloick en su diseño:

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

En este caso, Magento 2 ignora esta página del almacenamiento en caché.


¿Cómo usar cacheable = "false" en páginas cms?
jafar pinjar

0

Si solo necesita el customer_identonces sin cargar todo el objeto (vea método getCustomermétodo) puede obtenerlo simplemente usando el getCustomerIdmétodo.

Como getIdmétodo también se llama getCustomerIdmétodo.

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

Primero, cree una instancia en el archivo header.phtml como se muestra a continuación y también si hay más de una tienda disponible y desea recibir correo en solo una de las tiendas.

ingrese la descripción de la imagen aquí

<?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
    }
?>
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.