Magento 2 Uzyskaj identyfikator klienta z sesji w klasie blokowej

12

Jak uzyskać identyfikator klienta z sesji? Próbowałem tego, ale nie działa.

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();
}
Paweł
źródło
2
Jeśli klient jest zalogowany, możesz uzyskać identyfikator klienta, w przeciwnym razie zwróci wartość null, używając „$ this -> _ customerSession-> getCustomer () -> getId ()”
Sohel Rana
Zalogowałem się, ale zwraca wartość null. I robię to w klasie blokowej.
Paul
Z której klasy sesji korzystasz?
Sohel Rana,
Właśnie odkryłem, że $this->session->isLoggedIn()zwracany jest true w mojej klasie kontrolera, ale zwraca false w mojej klasie blokowej. Dlaczego?
Paul
4
Blok musi być ustawiony, cacheable=falsepatrz Magento 2 - Uzyskaj identyfikator klienta z sesji w klasie blokowej
Lukas Komarek

Odpowiedzi:

25

To kopia robocza. Możesz porównać ze swoją klasą bloków. Tutaj używam formularza jako klasy blokowej

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
źródło
1
Zrobiłem dokładnie to samo, ale nadal zwraca wartość zero. I $this->customerSession->isLoggedIn()zawsze jest fałszywe. Robię to samo w klasie kontrolerów i działa dobrze.
Paul
Wreszcie działa. Nie jestem pewien, co zmieniłem.
Paul,
czy mógłeś wyłączyć pełną pamięć podręczną stron?
davideghz
Tak, to była pamięć podręczna, miałem ten sam problem<block class="Vendor\Block\Bla\Bla" name="block.name" template="Wed2b_Suppliers::template/template.phtml" cacheable="false"/>
Juliano Vargas,
Wyłączyłem
4

Musisz wstrzyknąć \Magento\Customer\Model\Session $customerSession,klasę, aby uzyskać identyfikator klienta z sesji klienta.

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
}

UWAGA : Identyfikator klienta otrzymasz tylko wtedy, gdy klient jest zalogowany i zainicjowana sesja klienta

Książę Patel
źródło
4

Kiedy definiujesz blok, który używa sesji, musisz wyłączyć dla niego pamięć podręczną.

 <block class="Vendor\Module\Block\Index" name="Name"
 template="Vendor_Module::template/path.phtml" cacheable="false">
 </block>
Marcin Żurek
źródło
2
spowoduje to, że cała strona, a każda strona korzystająca z tego bloku zostanie pominięta przez FPC
Doni Wibowo
@DoniWibowo to prawda, ale musisz przede wszystkim zachować ostrożność podczas buforowania stron z danymi dynamicznymi. Na przykład nie chcesz wyświetlać tej samej nazwy dla wszystkich klientów.
Radu,
1

Wydaje się, że działa, gdy przekazujesz obiekt Context do klasy nadrzędnej przed wystąpieniem sesji klienta:

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
źródło
2
Dziwny. Obserwuję to samo. Dziękuję za pomoc. Zastanawiam się, dlaczego to robi różnicę.
nshiff
0

Podczas gdy wstrzykujemy sesję klienta w bloku, aby odzyskać zalogowane dane klienta i nie otrzymujemy danych klienta z bloku, ponieważ Magento 2 resetuje wszystkie sesje klienta, gdy FPC jest włączony.

Proszę użyć cacheable = "false" dla bloick w twoim układzie:

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

W takim przypadku Magento 2 zignoruje tę stronę z buforowania.

Khan Arman
źródło
jak używać cacheable = "false" na stronach cms?
jafar pinjar
0

Jeśli potrzebujesz tylko customer_idtego bez ładowania całego obiektu (patrz metoda getCustomermetody), możesz to uzyskać po prostu za pomocą getCustomerIdmetody.

Jako getIdmetoda wywołuje również getCustomerIdmetodę.

plik: 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
źródło
0

Najpierw utwórz instancję w pliku header.phtml, jak poniżej, a także, jeśli dostępny jest więcej niż jeden sklep i chcesz otrzymywać pocztę tylko w jednym ze sklepów.

wprowadź opis zdjęcia tutaj

<?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
źródło