Jak sprawdzić, czy klient jest zalogowany, czy nie w Magento 2.
Jeśli klient jest zalogowany, to jak uzyskać dane klienta z sesji?
magento2
customer
login
customer-account
customer-session
Rakesh Jesadiya
źródło
źródło
text/x-magento-init
), możesz zaoszczędzić trochę pieniędzy, unikając tworzenia instancji ObjectManager i przekazując status do obiektu konfiguracyjnego modułu, zamiast tego pytając o link logowania z w module JS, np .:var isLoggedIn = $('.authorization-link > a').attr('href').indexOf('/login')<0;
Odpowiedzi:
Po kodzie możesz sprawdzić login klienta lub nigdzie
Z kontrolera
źródło
Ważne przypomnienie: Nigdy nie należy bezpośrednio wywoływać Menedżera obiektów
Oto jak to zrobić w czysty sposób
W dowolnej klasie oprócz szablonów
Najpierw musisz wstrzyknąć następującą klasę do swojego konstruktora
/Magento/Customer/Model/Session
:Następnie w klasie możesz zadzwonić:
W szablonie
Wymaga nieco więcej pracy w szablonie, ponieważ będziesz musiał ustawić preferencje dla bloku, który renderuje szablon, aby zrobić to w czysty sposób:
Następnie w niestandardowym kontrolerze bloków musisz wykonać ten sam wstrzyknięcie zależności, jak dla każdej klasy (wyjaśnione powyżej).
Dodatkowy krok tutaj jest stworzenie metody publiczne, które mogą być użyte w szablonie, by sprawdzić, czy klient jest zalogowany, czy nie
Następnie w swoim szablonie możesz zadzwonić:
Alternatywnie, jeśli sesja klienta nie została jeszcze zainicjowana
Jest inny sposób na zrobienie tego, który wymaga użycia
Magento\Framework\App\Http\Context
zamiastMagento/Customer/Model/Session
Następnie możesz zadzwonić
$this->_context->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH)
zamiast$this->_session->isLoggedIn()
sprawdzić, czy klient jest zalogowany, czy nie.Jednak ta metoda może dać różne wyniki , sugeruję przeczytanie tej wspaniałej odpowiedzi, aby uzyskać więcej informacji: https://magento.stackexchange.com/a/92133/2380
źródło
<preference ... />
tag w niestandardowym motywie? Jakie są dokładnieBlock\That\Renders\The\Template
iVendor\Module\Block\Your\Custom\Block
?class Html extends \Magento\Framework\View\Element\Template
którym mogę wstrzyknąć obiekt sesji do konstruktora. Używam tego bloku w moim niestandardowego tematu w ten sposób (z plików XML szablonu)<block class="Vendor\ThemeName\Block\Html" template="Vendor_ModuleName::html/my-custom-template.phtml"/>
. Chciałbym sprawdzić zalogowanego użytkownika w pliku szablonumy-custom-template.phtml
. Jak powinienem używać znacznika `<preferencje ... />?Jest to możliwe za pośrednictwem
Magento\Framework\App\Http\Context
lub za pośrednictwemMagento\Customer\Model\Session
. Wynik może być jednak inny:PageCache
moduł jest włączony (prawdopodobnie zawsze w produkcji), pamiętaj, że jak tylko rozpocznie się generowanie układu, sesja klienta zostanie wyczyszczona\Magento\PageCache\Model\Layout\DepersonalizePlugin::afterGenerateXml
na wszystkich stronach, które można buforować. Oznacza to, że jeśli teraz sprawdzisz, czy klient jest zalogowany przez kontekst HTTP, nadal powie „tak”, ale dane klienta nie będą już dostępne w sesji klienta. Dlatego konieczne jest podwójne sprawdzenie przed próbą uzyskania dostępu do danych w sesji klienta. Może się to łatwo zdarzyć w bloku, chociaż jest mało prawdopodobne w kontrolerze akcji, ponieważ nie oczekuje się, że wygeneruje się tam układ ręcznie, zostanie wygenerowany, gdy kontroler akcji zwróci instancjęResultInterface
Aby wyeliminować ryzyko opisanych niespójności po włączeniu PageCache, rozważ użycie sesji klienta, jeśli jest ona już zainicjowana (dotyczy kontrolerów akcji). W przeciwnym razie użyj kontekstu HTTP.
źródło
źródło
Żadne z tych rozwiązań nie działało dla mnie. Niektóre strony wydają się być zalogowane, a inne nie. Wygląda na to, że to błąd:
https://github.com/magento/magento2/issues/3294
Skończyło się tworzenie pomocnika, który mógłbym wywołać w moich szablonach:
Następnie mógłbym użyć pomocnika w moich szablonach w następujący sposób:
źródło
->getCustomer()->getName()
przy użyciu kontekstu, ponieważ jeśli korzystam z sesji, nie działa ona na wszystkich stronach.Aby zalogować się do użytkownika w szablonie, możesz po prostu zadzwonić do pomocnika w jednej linii:
źródło
Żadne z rozwiązań tutaj nie działało dla mnie niezawodnie w Magento v2.1 z włączoną funkcją Full Page Cache i Varnish w trybie Production. W końcu znalazłem rozwiązanie, które działało w 100% z włączonym buforowaniem po otrzymaniu pomysłu
vendor/magento/module-theme/view/frontend/templates/html/header.phtml
. Oto moje rozwiązanie, które pokazuje link „Zaloguj się”, gdy użytkownik jest wylogowany, oraz link „Wyloguj się”, gdy użytkownik jest zalogowany:AKTUALIZACJA: Od wersji 2.1.5 to rozwiązanie nie jest już niezawodne. Zobacz kwestię 9156 do rozwiązania.
źródło
cachable="false"
w układzie XML dla tego bloku, ale lakier wciąż najwyraźniej buforuje go. Nie jestem pewien, czy to błąd, czy nie, ale Knockout to dobry sposób na obejście tego. Jedynym minusem jest to, że pojawia się niewielkie opóźnienie, zanim pojawi się link Zaloguj / Wyloguj z powodu powiązania KO.Istnieje wiele odpowiedzi na takie pytania ...
POBIERZ KLIENTA OBIEKTU ZAŁADUJ MODEL MODELU ZADAJ
Jest to NIEWŁAŚCIWA metodologia stosowana w Magento2.0. W wersji 2.0 można automatycznie wygenerować fabryki obiektów. Możesz wstrzyknąć je do swojego konstruktora w prawie każdej klasie i użyć ich. Przykład:
źródło
\Magento\Customer\Model\SessionFactory $sessionFactory
.Witam mam odpowiedź tutaj:
Źródło .
Zamienione get na tworzenie działa teraz dobrze:
źródło
ObjectManager
bezpośrednioJest to również jedno z rozwiązań „Sprawdź, czy klient jest zalogowany w Magento2”
Wypróbuj poniższy kod:
źródło
Wypróbuj poniższy kod:
Aby użyć powyższego kodu w pliku phtml, możesz wywołać funkcję isLoggedIn () jako:
Mam nadzieję, że dzięki tej pomocy.
źródło
Mam najlepsze rozwiązanie. Opiera się na uwierzytelnieniu klienta . Część sesji z klientami nie działała, ale za każdym razem moje rozwiązanie będzie działać. Spójrzmy.
Dzięki.
źródło
Aktualne rozwiązanie pracujące (IMHO)
źródło
Jeśli chcesz sprawdzić, czy klient jest zalogowany, czy nie, użyj tego kodu w plikach phtml,
źródło
ObjectManager
bezpośrednio i nigdy nie należy używać tego typu kodu w szablonie. Powinieneś stworzyć funkcje w swojej klasie bloków, aby to zarządzać.źródło
Inna odpowiedź:
Co myślisz?
źródło
Pobieranie statusu zalogowania z modelu sesji nie będzie działać, jeśli chcesz go użyć po włączeniu domyślnej pamięci podręcznej FPC Magento, w takim przypadku powinieneś użyć SessionFactory.
Sesja nie jest inicjowana, jeśli buforowanie FPC jest włączone, szczegóły: https://github.com/magento/magento2/issues/3294#issuecomment-328464943
Aby rozwiązać ten problem, musisz
SessionFactory
na przykład:źródło
Próbowałem wielu sposobów znalezionych w Google, ale żadne z tych rozwiązań nie działa. SO Sprawdziłem więc podstawową funkcjonalność i utworzyłem plik php, aby sprawdzić, czy klient jest zalogowany czy nie bez korzystania z Object Managera.
Aby uzyskać więcej informacji, sprawdź tutaj http://blog.webtechnologycodes.com/customer-loggedin-check-magento2
źródło