Magento 2 Kunden-ID aus Sitzung in einer Blockklasse abrufen


11

Wie erhalte ich eine Kunden-ID aus der Sitzung? Ich habe es versucht, aber nicht funktioniert.

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
Wenn der Kunde angemeldet ist, können Sie die Kunden-ID erhalten, andernfalls wird sie mit '$ this -> _ customerSession-> getCustomer () -> getId ()'
— Sohel Rana

Ich habe mich angemeldet, aber es wird null zurückgegeben. Und ich mache es in der Blockklasse.
— Paul

Welche Sitzungsklasse verwenden Sie?
— Sohel Rana

Ich habe gerade festgestellt, dass $this->session->isLoggedIn()in meiner Controller-Klasse true zurückgegeben wird, in meiner Block-Klasse jedoch false. Warum?
— Paul

4
Block muss gesetzt werden cacheable=falsesiehe Magento 2 - Kunden-ID von Sitzung in einer Blockklasse erhalten
— Lukas Komarek

Antworten:


23

Es ist eine Arbeitskopie. Sie können mit Ihrer Blockklasse vergleichen. Hier benutze ich Form als Blockklasse

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
Ich habe genau das Gleiche getan, aber es gibt immer noch null zurück. Und $this->customerSession->isLoggedIn()ist immer falsch. Ich mache das gleiche in einer Controller-Klasse und es funktioniert gut.
— Paul

Endlich funktioniert es. Ich bin mir nicht sicher, was ich geändert habe.
— Paul

Haben Sie vielleicht den Ganzseiten-Cache deaktiviert?
— Davidghz

Ja, es war Cache, ich hatte das gleiche Problem<block class="Vendor\Block\Bla\Bla" name="block.name" template="Wed2b_Suppliers::template/template.phtml" cacheable="false"/>
— Juliano Vargas

Ich habe den Cache deaktiviert, immer noch null
— Ajwad Syed

4

Wenn Sie einen Block definieren, der eine Sitzung verwendet, müssen Sie den Cache dafür deaktivieren.

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

2
Dies führt dazu, dass die gesamte Seite und jede Seite, die diesen Block verwendet, von der FPC
— Doni Wibowo

@DoniWibowo das ist wahr, aber Sie müssen vorsichtig sein, wenn Sie Seiten mit dynamischen Daten zwischenspeichern. Sie möchten beispielsweise nicht für alle Kunden den gleichen Namen anzeigen.
— Radu

3

Sie müssen eine \Magento\Customer\Model\Session $customerSession,Klasse injizieren , um die Kunden-ID aus der Kundensitzung zu erhalten.

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
}

HINWEIS : Sie erhalten die Kunden-ID nur, wenn der Kunde angemeldet und die Kundensitzung initialisiert ist


1

Es scheint zu funktionieren, wenn Sie das Context-Objekt an die übergeordnete Klasse übergeben, bevor Sie die Kundensitzung instanziieren:

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
Seltsam. Ich beobachte das Gleiche. Danke für die Hilfe. Ich frage mich, warum das einen Unterschied macht.
— Nshiff

0

Während wir eine Kundensitzung in einen Block einspeisen, um angemeldete Kundendaten abzurufen, erhalten wir keine Kundendaten aus dem Block, da Magento 2 alle Kundensitzungen zurücksetzt, wenn FPC aktiviert ist.

Bitte verwenden Sie cacheable = "false" für Bloick in Ihrem Layout:

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

In diesem Fall ignoriert Magento 2 das Zwischenspeichern dieser Seite.


Wie verwende ich cacheable = "false" auf CMS-Seiten?
— Jafar Pinjar

0

Wenn Sie nur das customer_iddann ohne Laden des gesamten Objekts benötigen (siehe getCustomerMethodenmethode), können Sie es durch einfaches Verwenden der getCustomerIdMethode erhalten.

Als getIdMethode ruft auch getCustomerIdMethode auf.

Datei: 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

Erstellen Sie zunächst eine Instanz in der Datei header.phtml wie folgt und auch, wenn mehr als ein Geschäft verfügbar ist und Sie nur in einem der Geschäfte E-Mails erhalten möchten.

Geben Sie hier die Bildbeschreibung ein

<?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
    }
?>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.