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();
}
Pablo
fuente
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();
    }
}
Sohel Rana
fuente
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
Desactivé la
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ó

Príncipe Patel
fuente
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>
Marcin Żurek
fuente
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();
    }
}
ax_pernot
fuente
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é.

Khan arman
fuente
¿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();
}
Caballero017
fuente
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
    }
?>
SHEESHRAM
fuente