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();
}
Paul
quelle
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();
    }
}
Sohel Rana
quelle
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>
Marcin Żurek
quelle
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

Prinz Patel
quelle
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();
    }
}
ax_pernot
quelle
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.

Khan Arman
quelle
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();
}
Knight017
quelle
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
    }
?>
SHEESHRAM
quelle