Magento 2 Ottieni l'ID cliente dalla sessione in una classe di blocchi


12

Come ottenere l'ID cliente dalla sessione? Ho provato questo ma non funziona.

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 il cliente ha effettuato l'accesso, è possibile ottenere l'ID cliente, altrimenti viene restituito null utilizzando '$ this -> _ customerSession-> getCustomer () -> getId ()'
Sohel Rana,

Ho effettuato l'accesso ma restituisce null. E lo sto facendo nella classe di blocco.
Paul

Quale classe di sessione usi?
Sohel Rana,

Ho appena scoperto che $this->session->isLoggedIn()restituiscono true nella mia classe controller ma restituiscono false nella mia classe block. Perché?
Paul

4
Il blocco deve essere impostato cacheable=falsevedi Magento 2 - Ottieni l'ID cliente dalla sessione in una classe di blocco
Lukas Komarek,

Risposte:


25

È una copia funzionante. Puoi confrontare con la tua classe di blocco. Qui uso Form come classe di blocco

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
Ho fatto esattamente lo stesso, ma restituisce comunque null. Ed $this->customerSession->isLoggedIn()è sempre falso. Faccio lo stesso in una classe di controller e funziona benissimo.
Paul

Finalmente funziona. Non sono sicuro di cosa sono cambiato.
Paolo

hai disabilitato la cache a tutta pagina forse?
davideghz,

Sì, era cache ho avuto lo stesso problema<block class="Vendor\Block\Bla\Bla" name="block.name" template="Wed2b_Suppliers::template/template.phtml" cacheable="false"/>
Juliano Vargas,

Ho disabilitato ancora la cache, il suo ritorno è null
Ajwad Syed,

4

Devi inserire la \Magento\Customer\Model\Session $customerSession,classe per ottenere l'ID cliente dalla sessione 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 : ottieni l'ID cliente solo se il cliente ha effettuato l'accesso e la sessione cliente è stata inizializzata


4

Quando si definisce il blocco che utilizza la sessione, è necessario disabilitare la cache.

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

2
questo farà sì che l'intera pagina e tutte le pagine che utilizzano questo blocco vengano perse dall'FPC
Doni Wibowo,

@DoniWibowo è vero, ma devi prima fare attenzione quando si memorizzano nella cache pagine con dati dinamici. Ad esempio, non si desidera visualizzare lo stesso nome per tutti i clienti.
Radu,

1

Sembra funzionare quando si passa l'oggetto Context alla classe genitore prima di creare un'istanza della sessione 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
Dispari. Osservo la stessa cosa. Grazie per l'aiuto. Mi chiedo perché questo faccia la differenza.
nshiff

0

Mentre stiamo iniettando la sessione del cliente in blocco per recuperare i dati dei clienti registrati e non stiamo ottenendo i dati del cliente dal blocco perché Magento 2 ha ripristinato tutte le sessioni del cliente quando è abilitato FPC.

Si prega di utilizzare cacheable = "false" per bloick nel layout:

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

In questo caso, Magento 2 ignora questa pagina dalla cache.


come usare cacheable = "false" nelle pagine cms?
jafar pinjar

0

Se hai bisogno solo di customer_idallora senza caricare l'intero oggetto (vedi metodo getCustomermetodo) puoi ottenerlo semplicemente usando il getCustomerIdmetodo.

Come getIdmetodo chiama anche getCustomerIdmetodo.

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

Innanzitutto, creare un'istanza nel file header.phtml come di seguito e anche se è disponibile più di un negozio e si desidera ricevere posta in uno solo dei negozi.

inserisci qui la descrizione dell'immagine

<?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
    }
?>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.