Magento 2: So leiten Sie den Kunden zur Anmeldeseite um

7

Wie kann ich überprüfen, ob der Kunde angemeldet ist oder nicht? Wenn der Kunde nicht angemeldet ist, wie kann er dann zur Anmeldeseite weitergeleitet werden ?

Ich möchte dies aus der .phtmlDatei tun . Bitte helfen Sie mir dabei.

Krupali
quelle

Antworten:

11

Wenn Sie dies direkt aus der .phtmlDatei heraus tun möchten, verwenden Sie den folgenden Code:

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();

$customerSession = $objectManager->get('\Magento\Customer\Model\Session');
$urlInterface = $objectManager->get('\Magento\Framework\UrlInterface');

if(!$customerSession->isLoggedIn()) {
    $customerSession->setAfterAuthUrl($urlInterface->getCurrentUrl());
    $customerSession->authenticate();
}

Nach dem Login werden Sie automatisch zur aktuellen Ansicht weitergeleitet.

Die Verwendung von Object Manager ist jedoch keine gute Vorgehensweise. Sie sollten nach Möglichkeit die Abhängigkeitsinjektion verwenden.

Bartłomiej Szubert
quelle
3
Direkte Instanzen von Object Manager sind keine bewährten Methoden: magento.stackexchange.com/a/117101/1956
ryanF
Das Magento-Kernteam verwendet es jedoch in wenigen Modellen. Die Frage war, wie man es direkt aus der .phtml-Datei macht, und das ist die Antwort :)
Bartłomiej Szubert
Szubert ... fair genug ... nur gut zu bemerken, nehme ich an.
RyanF
Warum es zu einer unendlichen Umleitungsschleife kommt
Naveenbos
9

@Krupali, wenn Sie fest davon überzeugt sind, dass Ihr Code in einer Vorlage implementiert wird, ist das Beispiel von @Bartlomiej Szubert die bessere Wahl. Im Allgemeinen empfiehlt es sich, diese Implementierungsdetails aus Ihrer Vorlage zu verbergen und die Logik auf etwas anderes (Block oder Helfer) zu abstrahieren.

Hier ist ein Beispiel für eine Hilfsimplementierung:

<?php

namespace Ryan\CustomerRedirect\Helper;

use Magento\Customer\Model\Session;
use Magento\Framework\App\Helper\AbstractHelper;
use Magento\Framework\App\Helper\Context;
use Magento\Framework\UrlInterface;

class Customer extends AbstractHelper
{
    /**
     * @var Session
     */
    private $customerSession;
    /**
     * @var UrlInterface
     */
    private $urlInterface;

    public function __construct(
        Context $context,
        Session $customerSession,
    )
    {
        parent::__construct($context);
        $this->customerSession = $customerSession;
        $this->urlInterface = $context->getUrlBuilder();
    }

    public function redirectIfNotLoggedIn()
    {
        if (!$this->customerSession->isLoggedIn()) {
            $this->customerSession->setAfterAuthUrl($this->urlInterface->getCurrentUrl());
            $this->customerSession->authenticate();
        }
    }
}

Dann können Sie in Ihrer Vorlage Folgendes verwenden:

$this->helper('Ryan\CustomerRedirect\Helper\Customer')->redirectIfNotLoggedIn()

* Der gezeigte Namespace ist ein Beispiel

Auf diese Weise kann Ihr Code an anderer Stelle wiederverwendet werden. Wenn Sie die Implementierungslogik ändern möchten, mit der überprüft wird, ob jemand angemeldet ist, müssen Sie Ihre Vorlage (n) nicht ändern.

ryanF
quelle
Oh ja. Das ist sehr nützlich für mich.
Krupali
1
@ Krupali, ich bin froh, dass dies hilfreich ist. Sie wissen, Sie können zeigen, dass etwas hilfreich ist, indem Sie es abstimmen: D
ryanF
Helfer in Vorlage verwendet eigentlich auch OM, aber nur schön versteckt :)
Bartosz Kubicki
-1
Find the below working code from core file to redirect other page in controller.

<?php

namespace Vendorname\Yourmodulename\Controller\Contact;

use Magento\Customer\Model\Session;
use Magento\Framework\App\Action\Context;
use Magento\Customer\Model\Customer;

class Index extends \Magento\Framework\App\Action\Action
{
    protected $customerSession;

    protected $customers;

    public function __construct(
        Context $context,
        Session $customerSession,
        Customer $customers
    )
    {
        parent::__construct($context);
        $this->customerSession = $customerSession;
        $this->customers = $customers;       
    }

    public function execute()
    {   
        if ($this->customerSession->isLoggedIn()) {

            //Get customer by customerID.
            $customerId = $this->customerSession->getCustomerData()->getId();
            $customer = $this->customers->load($customerId);
            if($customer->getUserRole() != '' && $customer->getUserRole() == 'admin')
            { 
                $this->_view->loadLayout();
                $this->_view->getLayout()->initMessages();
                $this->_view->renderLayout();            
            }
        }
        else{

            $resultRedirect = $this->resultRedirectFactory->create();
            $resultRedirect->setPath('customer/account/login/');
            return $resultRedirect;        
        } 
    }
}   
Jitendra Patel
quelle
1. Bedingung isLoggedIn()sollte durch ersetzt werden, getCustomerGroupId()da isLoggedIndie Prüfung auf der Grundlage der Kunden-ID erfolgt, aber FPC
spült