So finden Sie heraus, ob der Kunde in Magento 2 angemeldet ist oder nicht.
Wenn der Kunde angemeldet ist, wie erhalte ich Kundendaten aus der Sitzung?
magento2
customer
login
customer-account
customer-session
Rakesh Jesadiya
quelle
quelle
text/x-magento-init
den Anmeldestatus in einem Magento JS-Modul ( ) überprüfen müssen, zusätzlichen Aufwand sparen können, indem Sie die ObjectManager-Instanziierung vermeiden und den Status an das Konfigurationsobjekt des Moduls übergeben und stattdessen den Anmeldelink von abfragen innerhalb des JS-Moduls, zB:var isLoggedIn = $('.authorization-link > a').attr('href').indexOf('/login')<0;
Antworten:
Mit dem folgenden Code können Sie die Kundenanmeldung überprüfen oder nicht überall
Vom Controller
quelle
Wichtiger Hinweis: Man sollte niemals den Objektmanager direkt anrufen
Also hier ist, wie man es auf saubere Weise macht
In jeder Klasse außer Vorlagen
Sie müssen zuerst die folgende Klasse in Ihren Konstruktor einfügen
/Magento/Customer/Model/Session
:Dann können Sie in Ihrer Klasse Folgendes anrufen:
In einer Vorlage
Es erfordert ein wenig mehr Arbeit in einer Vorlage, da Sie eine Voreinstellung für den Block einrichten müssen, der die Vorlage so sauber macht:
Dann müssen Sie in Ihrem benutzerdefinierten Block-Contrusktor die gleiche Abhängigkeitsinjektion wie für eine beliebige Klasse durchführen (siehe oben).
Der zusätzliche Schritt besteht darin, eine öffentliche Methode zu erstellen, mit der in Ihrer Vorlage überprüft werden kann, ob ein Kunde angemeldet ist oder nicht
Dann können Sie in Ihrer Vorlage Folgendes aufrufen:
Alternative, wenn die Kundensitzung noch nicht initialisiert ist
Es gibt noch einen anderen Weg, der die Verwendung
Magento\Framework\App\Http\Context
anstelle von impliziertMagento/Customer/Model/Session
Sie können dann anrufen,
$this->_context->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH)
anstatt$this->_session->isLoggedIn()
zu überprüfen, ob der Kunde angemeldet ist oder nicht.Wie auch immer diese Methode zu unterschiedlichen Ergebnissen führen mag , ich empfehle Ihnen, diese großartige Antwort zu lesen, um weitere Informationen zu erhalten: https://magento.stackexchange.com/a/92133/2380
quelle
<preference ... />
Tag in einem benutzerdefinierten Thema platziert werden? Was ist genauBlock\That\Renders\The\Template
undVendor\Module\Block\Your\Custom\Block
?class Html extends \Magento\Framework\View\Element\Template
in den ich das Sitzungsobjekt im Konstruktor einfügen kann. Ich benutze diesen Block innerhalb meines benutzerdefinierten Themas auf diese Weise (von Layout XML - Dateien):<block class="Vendor\ThemeName\Block\Html" template="Vendor_ModuleName::html/my-custom-template.phtml"/>
. Ich möchte den angemeldeten Benutzer in der Vorlagendatei überprüfenmy-custom-template.phtml
. Wie soll ich das Tag `<Einstellung ... /> verwenden?Es ist möglich via
Magento\Framework\App\Http\Context
oder viaMagento\Customer\Model\Session
. Das Ergebnis kann jedoch unterschiedlich sein:PageCache
Modul eingeschaltet ist (wahrscheinlich immer in Produktion), beachten Sie, dass die Kundensitzung\Magento\PageCache\Model\Layout\DepersonalizePlugin::afterGenerateXml
auf allen zwischenspeicherbaren Seiten gelöscht wird, sobald die Layouterstellung gestartet wird . Wenn Sie jetzt überprüfen, ob der Kunde über den HTTP-Kontext angemeldet ist, wird weiterhin "Ja" angezeigt, aber in der Kundensitzung sind keine Kundendaten mehr verfügbar. Daher ist vor dem Zugriff auf Daten in der Kundensitzung eine erneute Überprüfung erforderlich. Dies kann leicht im Block passieren, während dies im Action Controller unwahrscheinlich ist, da nicht erwartet wird, dass Sie dort das Layout manuell generieren. Es wird generiert, nachdem der Action Controller die Instanz von zurückgibtResultInterface
Erwägen Sie die Verwendung einer Kundensitzung, wenn diese bereits initialisiert ist, um das Risiko beschriebener Inkonsistenzen zu vermeiden, wenn PageCache aktiviert ist (true für Aktionscontroller). Verwenden Sie andernfalls den HTTP-Kontext.
quelle
quelle
Keine dieser Lösungen hat bei mir funktioniert. Einige Seiten scheinen angemeldet zu sein, andere nicht. Es scheint, dass dies der Fehler ist:
https://github.com/magento/magento2/issues/3294
Am Ende habe ich einen Helfer erstellt, den ich in meinen Vorlagen aufrufen konnte:
Dann könnte ich den Helfer in meinen Vorlagen wie folgt verwenden:
quelle
->getCustomer()->getName()
mit dem Kontext aufrufen , denn wenn ich die Sitzung benutze, funktioniert das nicht für alle Seiten.Um sich als Benutzer bei der Vorlage anzumelden, können Sie den Helfer einfach in einer einzigen Zeile aufrufen:
quelle
Keine der hier beschriebenen Lösungen hat in Magento 2.1 mit aktiviertem Ganzseiten-Cache und Lack im Produktionsmodus zuverlässig funktioniert. Endlich fand ich eine Lösung, die 100% der Zeit funktionierte, wenn das gesamte Caching aktiviert war, nachdem ich die Idee von erhalten hatte
vendor/magento/module-theme/view/frontend/templates/html/header.phtml
. Hier ist meine Lösung, die einen "Anmelden" -Link anzeigt, wenn der Benutzer abgemeldet ist, und einen "Abmelden" -Link, wenn der Benutzer angemeldet ist:UPDATE: Seit v2.1.5 ist diese Lösung nicht mehr zuverlässig. Eine Lösung finden Sie in Ausgabe 9156 .
quelle
cachable="false"
in Layout-XML für diesen Block, aber Firnis wird es anscheinend immer noch zwischengespeichert. Ich bin nicht sicher, ob dies ein Fehler ist oder nicht, aber Knockout ist ein guter Weg, um dies zu umgehen. Der einzige Nachteil ist, dass es aufgrund der KO-Bindung zu einer kleinen Verzögerung kommt, bevor der Anmelde- / Abmeldelink angezeigt wird.Es gibt viele Antworten, die ungefähr so lauten ...
GET OBJECT MANAGER LADE KLASSENMODELL HOCH DO STUFF
Dies ist die falsche Methode, die in Magento 2.0 verwendet wird. In 2.0 sind die automatisch generierten Objektfabriken der richtige Weg. Sie können sie in nahezu jeder Klasse in Ihren Konstruktor einfügen und verwenden. Beispiel:
quelle
\Magento\Customer\Model\SessionFactory $sessionFactory
.Hallo habe Antwort hier:
Quelle .
Ersetzt get with create funktioniert nun einwandfrei:
quelle
ObjectManager
direkt verwendenDies ist auch eine der Lösungen "Überprüfen Sie, ob der Kunde in Magento2 angemeldet ist oder nicht".
Versuchen Sie den folgenden Code:
quelle
Versuchen Sie den folgenden Code:
Für die Verwendung des obigen Codes in der HTML-Datei können Sie die Funktion isLoggedIn () folgendermaßen aufrufen:
Hoffe diese Hilfe danke.
quelle
Ich habe die beste Lösung. Es basiert auf der Authentifizierung des Kunden . In einigen Fällen funktionierte die Kundensitzung nicht, aber meine Lösung wird jedes Mal funktionieren. Lass uns mal sehen.
Vielen Dank.
quelle
Aktuelle funktionierende Lösung (IMHO)
quelle
Wenn Sie überprüfen möchten, ob der Kunde angemeldet ist oder nicht, verwenden Sie diesen Code in den HTML-Dateien.
quelle
ObjectManager
direkt verwenden und Sie sollten niemals diese Art von Code in einer Vorlage verwenden. Sie sollten Funktionen in Ihrer Blockklasse erstellen, um dies zu verwalten.quelle
Eine andere Antwort:
Was denkst du?
quelle
Das Abrufen des protokollierten Status aus dem Sitzungsmodell funktioniert nicht, wenn Sie ihn nach dem Aktivieren des Standard-FPC-Caches von Magento verwenden möchten. In diesem Fall sollten Sie stattdessen SessionFactory verwenden.
Die Sitzung wird nicht gestartet, wenn die FPC-Zwischenspeicherung aktiviert ist. Details: https://github.com/magento/magento2/issues/3294#issuecomment-328464943
Um dies zu lösen, müssen Sie
SessionFactory
zum Beispiel verwenden:quelle
Ich habe viele Möglichkeiten bei Google ausprobiert, aber keine der Lösungen funktioniert. Also habe ich die Kernfunktionalität überprüft und eine PHP-Datei erstellt, um zu überprüfen, ob ein Kunde angemeldet ist oder nicht, ohne den Objekt-Manager zu verwenden.
Weitere Informationen finden Sie hier http://blog.webtechnologycodes.com/customer-loggedin-check-magento2
quelle