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.