Magento 2 - Leiten Sie den Kunden nach der Anmeldung zur benutzerdefinierten Seite weiter


9

Welche Klasse sollte ich überschreiben, um einen Kunden nach der Anmeldung auf eine bestimmte Seite umzuleiten?

Ich habe versucht, Redirect Customer to Account Dashboard after Logging inin der Store-Konfiguration festzulegen, aber es funktioniert nicht.


Sie aktivieren oder deaktivieren Guest Checkout?
Khoa TruongDinh

Ich habe das Auschecken von Gästen deaktiviert.
Paul

Wie wäre es mit Ihrer aktuellen Ausgabe?
Khoa TruongDinh

Der von Ihnen angegebene Code unterscheidet sich ein wenig von meinem Magento. Vielleicht aus verschiedenen Versionen. Und ich verstehe nicht, warum es mit Cookies zusammenhängt. Ich habe es schließlich gelöst, indem ich die LoginPost-Klasse überschrieben habe. Ich habe meine Antwort unten gepostet. Vielen Dank!
Paul

1
Meine Magento-Version ist v2.0.8
Paul

Antworten:


27

Ein Plugin ist in diesem Fall eine bessere Lösung, da Ihre erweiterte Klasse möglicherweise aktualisiert werden muss, wenn Magento 2 aktualisiert wird.

Hier ist eine Lösung mit einem After-Plugin für LoginPost-> execute (), wie von Xenocide8998 vorgeschlagen.

/Vendor/Module/etc/frontend/di.xml::

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
  <type name="\Magento\Customer\Controller\Account\LoginPost">
    <plugin name="vendor_module_loginpostplugin" type="\Vendor\Module\Plugin\LoginPostPlugin" sortOrder="1" />
  </type>
</config>

/Vendor/Module/Plugin/LoginPostPlugin.php::

<?php

/**
 *
 */
namespace Vendor\Module\Plugin;

/**
 *
 */
class LoginPostPlugin
{

    /**
     * Change redirect after login to home instead of dashboard.
     *
     * @param \Magento\Customer\Controller\Account\LoginPost $subject
     * @param \Magento\Framework\Controller\Result\Redirect $result
     */
    public function afterExecute(
        \Magento\Customer\Controller\Account\LoginPost $subject,
        $result)
    {
        $result->setPath('/'); // Change this to what you want
        return $result;
    }

}

1
Es funktioniert gut. Eine Sache ist, wenn Sie $ result-> setPath ('/') benötigen; Verwenden Sie für Ihren benutzerdefinierten Pfad beispielsweise nicht "/" vor der URL. $ result-> setPath ('customer / dashboard /');
Shuvankar Paul

Guter Ansatz mit Plugin
Hafiz Arslan

Perfekte Arbeit danke
HaFiz Umer

Ihr einziges Problem dabei ist, dass Sie immer noch auf die Startseite gelangen, wenn der Kunde versucht, sich anzumelden, und dies fehlschlägt. Es gibt keine Möglichkeit, fehlgeschlagene Anmeldungen abzufangen.
Andy Jones

Wie kann ich die aktuelle Seiten-URL an dieses Plugin übergeben?
Rahul

6

Ich habe es behoben, indem ich die LoginPost-Klasse überschrieben habe

etc / di.xml

<preference for="Magento\Customer\Controller\Account\LoginPost" type="Vendor\Module\Controller\Account\LoginPost" />

Anbieter / Modul / Controller / Konto / LoginPost.php

<?php

namespace Vendor\Module\Controller\Account;

use Magento\Customer\Model\Account\Redirect as AccountRedirect;
use Magento\Framework\App\Action\Context;
use Magento\Customer\Model\Session;
use Magento\Customer\Api\AccountManagementInterface;
use Magento\Customer\Model\Url as CustomerUrl;
use Magento\Framework\Exception\EmailNotConfirmedException;
use Magento\Framework\Exception\AuthenticationException;
use Magento\Framework\Data\Form\FormKey\Validator;

/**
 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
 */
class LoginPost extends \Magento\Customer\Controller\Account\LoginPost {

    public function execute() {
        if ($this->session->isLoggedIn() || !$this->formKeyValidator->validate($this->getRequest())) {
            /** @var \Magento\Framework\Controller\Result\Redirect $resultRedirect */
            $resultRedirect = $this->resultRedirectFactory->create();
            $resultRedirect->setPath('home');
            return $resultRedirect;
        }

        if ($this->getRequest()->isPost()) {
            $login = $this->getRequest()->getPost('login');
            if (!empty($login['username']) && !empty($login['password'])) {
                try {
                    $customer = $this->customerAccountManagement->authenticate($login['username'], $login['password']);
                    $this->session->setCustomerDataAsLoggedIn($customer);
                    $this->session->regenerateId();
                } catch (EmailNotConfirmedException $e) {
                    $value = $this->customerUrl->getEmailConfirmationUrl($login['username']);
                    $message = __(
                            'This account is not confirmed.' .
                            ' <a href="%1">Click here</a> to resend confirmation email.', $value
                    );
                    $this->messageManager->addError($message);
                    $this->session->setUsername($login['username']);
                } catch (AuthenticationException $e) {
                    $message = __('Invalid login or password.');
                    $this->messageManager->addError($message);
                    $this->session->setUsername($login['username']);
                } catch (\Exception $e) {
                    $this->messageManager->addError(__('Invalid login or password.'));
                }
            } else {
                $this->messageManager->addError(__('A login and a password are required.'));
            }
        }

        $resultRedirect = $this->resultRedirectFactory->create();
        $resultRedirect->setPath('home');
        return $resultRedirect;
    }

}

12
Ich denke, ein Plugin mit dem afterExecute()wäre eine sauberere Option
Xenocide8998

2
Dies ist kein guter Ansatz und wird nur in Zukunft Probleme verursachen. Plugin ist der richtige Weg.
Phagento

Können wir standardmäßig vom Konto-Dashboard zur Seite mit dem Kundenauftragsverlauf umleiten?
Jafar Pinjar

0

Dass der aktuelle lokale Speicher unser Problem verursacht hat.
Wenn wir Redirect Customer to Account Dashboard after Logging inGuest Checkout in der Konfiguration aktivieren oder deaktivieren , funktioniert diese Funktion gut. Wir müssen jedoch Ihren lokalen Speicher löschen.

Wir können den lokalen Speicher überprüfen localStorage.getItem('mage-cache-storage').

Schau mal:

Hersteller / Magento / Modul-Checkout / Ansicht / Frontend / Web / js / sidebar.js

var cart = customerData.get('cart'),
customer = customerData.get('customer');
if (!customer().firstname && cart().isGuestCheckoutAllowed === false) {
    // set URL for redirect on successful login/registration. It's postprocessed on backend.
    $.cookie('login_redirect', this.options.url.checkout);
    if (this.options.url.isRedirectRequired) {
        location.href = this.options.url.loginUrl;
    } else {
        authenticationPopup.showModal();
    }

    return false;
}

Magento setzt das Cookie $.cookie('login_redirect', this.options.url.checkout)basierend auf customerDatadem lokalen Speicher.

Von der Steuerung vendor/magento/module-customer/Controller/Account/LoginPost.php. Es wird die Weiterleitungs-URL aus dem Cookie überprüft.

$redirectUrl = $this->accountRedirect->getRedirectCookie();
if (!$this->getScopeConfig()->getValue('customer/startup/redirect_dashboard') && $redirectUrl) {
    ......
    return $resultRedirect;
}

Magento-Version:

-Magento Version 2.1.0


0

Ich habe dieses Problem behoben, indem ich den Referer in der benutzerdefinierten Modulsteuerung übergeben habe.

Schritt 1 `

use Magento\Framework\App\Action\Context;
use Magento\Framework\View\Result\PageFactory;
use Magento\Customer\Model\Session;
use Magento\Framework\UrlInterface;

class Approve extends \Magento\Framework\App\Action\Action {

    /** 
    * @var \Magento\Framework\View\Result\Page 
    */
    protected $resultPageFactory;

    /** 
    * $param \Magento\Framework\App\Action\Context $context */

    /**
    * @param CustomerSession
    */

    protected $_customerSession;

    protected $_urlInterface;

    public function __construct(
        Context $context,
        PageFactory $resultPageFactory,
        Session $customerSession,
        UrlInterface $urlInterface
    )
    {
        $this->resultPageFactory = $resultPageFactory;
        $this->_customerSession  = $customerSession;
        $this->_urlInterface     = $urlInterface;
        parent::__construct($context);

    }

    public function execute(){
        $url  = $this->_urlInterface->getUrl('*/*/*', ['_current' => true, '_use_rewrite' => true]); 
// here pass custom url or you can either use current url on which you are currently and want to come back after logged in.

        $loginUrl = $this->_urlInterface->getUrl('customer/account/login', array('referer' => base64_encode($url)));
        if($this->_customerSession->isLoggedIn()){
            return $this->resultPageFactory->create();
        }
        $this->_redirect($loginUrl);
    }
}`

Schritt 2

Gehen Sie zu Admin: Store> Konfiguration> Kunden> Kundenkonfiguration> Anmeldeoptionen> Kunden nach der Anmeldung zum Konto-Dashboard umleiten> Nein

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.