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.