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();
}
$this->session->isLoggedIn()
zwracany jest true w mojej klasie kontrolera, ale zwraca false w mojej klasie blokowej. Dlaczego?cacheable=false
patrz Magento 2 - Uzyskaj identyfikator klienta z sesji w klasie blokowejOdpowiedzi:
To kopia robocza. Możesz porównać ze swoją klasą bloków. Tutaj używam formularza jako klasy blokowej
źródło
$this->customerSession->isLoggedIn()
zawsze jest fałszywe. Robię to samo w klasie kontrolerów i działa dobrze.<block class="Vendor\Block\Bla\Bla" name="block.name" template="Wed2b_Suppliers::template/template.phtml" cacheable="false"/>
Musisz wstrzyknąć
\Magento\Customer\Model\Session $customerSession,
klasę, aby uzyskać identyfikator klienta z sesji klienta.UWAGA : Identyfikator klienta otrzymasz tylko wtedy, gdy klient jest zalogowany i zainicjowana sesja klienta
źródło
Kiedy definiujesz blok, który używa sesji, musisz wyłączyć dla niego pamięć podręczną.
źródło
Wydaje się, że działa, gdy przekazujesz obiekt Context do klasy nadrzędnej przed wystąpieniem sesji klienta:
źródło
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:
W takim przypadku Magento 2 zignoruje tę stronę z buforowania.
źródło
Jeśli potrzebujesz tylko
customer_id
tego bez ładowania całego obiektu (patrz metodagetCustomer
metody), możesz to uzyskać po prostu za pomocągetCustomerId
metody.Jako
getId
metoda wywołuje równieżgetCustomerId
metodę.źródło
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.
źródło