Magento 2 Obtenez l'ID client de la session dans une classe de bloc


12

Comment obtenir l'ID client de la session? J'ai essayé cela mais ne fonctionne pas.

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 le client est connecté, vous pouvez obtenir l'identifiant client, sinon il est retourné null en utilisant '$ this -> _ customerSession-> getCustomer () -> getId ()'
Sohel Rana

Je me suis connecté mais il renvoie null. Et je le fais dans la classe de bloc.
Paul

Quelle classe de session utilisez-vous?
Sohel Rana

Je viens de trouver ce $this->session->isLoggedIn()retour vrai dans ma classe de contrôleur mais retourne faux dans ma classe de bloc. Pourquoi?
Paul

Réponses:


25

C'est une copie de travail. Vous pouvez comparer avec votre classe de blocs. Ici, j'utilise Form comme classe de bloc

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
J'ai fait exactement la même chose mais elle retourne toujours null. Et $this->customerSession->isLoggedIn()c'est toujours faux. Je fais de même dans une classe de contrôleur et cela fonctionne très bien.
Paul

Enfin ça marche. Je ne sais pas ce que j'ai changé.
Paul

avez-vous désactivé le cache pleine page peut-être?
davideghz

Oui, c'était le cache J'ai eu le même problème<block class="Vendor\Block\Bla\Bla" name="block.name" template="Wed2b_Suppliers::template/template.phtml" cacheable="false"/>
Juliano Vargas

J'ai désactivé le cache toujours son retour nul
Ajwad Syed

4

Vous devez injecter une \Magento\Customer\Model\Session $customerSession,classe pour obtenir l'ID client de la session client.

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
}

REMARQUE : vous n'obtenez l'ID client que si le client est connecté et que la session client est initialisée


4

Lorsque vous définissez un bloc qui utilise la session, vous devez désactiver le cache pour cela.

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

2
cela entraînera la page entière et chaque page qui utilise ce bloc sera MANQUÉE par le FPC
Doni Wibowo

@DoniWibowo c'est vrai, mais vous devez être prudent lors de la mise en cache des pages avec des données dynamiques en premier lieu. Vous ne voulez pas afficher le même nom pour tous les clients par exemple.
Radu

1

Cela semble fonctionner lorsque vous passez l'objet Context à la classe parent avant d'instancier la session client:

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
Impair. J'observe la même chose. Merci pour l'aide. Je me demande pourquoi cela fait une différence.
nshiff

0

Pendant que nous injectons la session client dans le bloc pour récupérer les données client connectées et que nous n'obtenons pas les données client du bloc parce que Magento 2 réinitialise toutes les sessions client lorsque FPC est activé.

Veuillez utiliser cacheable = "false" pour bloick dans votre mise en page:

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

Dans ce cas, Magento 2 ignore cette page de la mise en cache.


comment utiliser cacheable = "false" dans les pages cms?
jafar pinjar

0

Si vous n'avez besoin que de l' customer_idobjet sans charger l'intégralité de l'objet (voir getCustomerméthode), vous pouvez l'obtenir en utilisant simplement getCustomerIdmethod.

Comme getIdméthode appelle également getCustomerIdméthode.

fichier: vendeur / magento / module-client / 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

Tout d'abord, créez une instance dans le fichier header.phtml comme ci-dessous et aussi si plusieurs magasins sont disponibles et que vous voulez recevoir du courrier dans un seul des magasins.

entrez la description de l'image ici

<?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
    }
?>
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.