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();
}
Paul
la source
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
4
Le bloc doit être défini, cacheable=falsevoir Magento 2 - Obtenir l'ID client de la session dans une classe de bloc
Lukas Komarek

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();
    }
}
Sohel Rana
la source
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

Prince Patel
la source
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>
Marcin Żurek
la source
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();
    }
}
ax_pernot
la source
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.

Khan arman
la source
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();
}
Knight017
la source
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
    }
?>
SHEESHRAM
la source