Magento 2 - Redirigez le client vers une page personnalisée après la connexion

9

Quelle classe devrais-je remplacer pour rediriger un client vers une page spécifique après la connexion?

J'ai essayé de définir Redirect Customer to Account Dashboard after Logging inla configuration du magasin, mais cela ne fonctionne pas.

Paul
la source
Vous activez ou désactivez Guest Checkout?
Khoa TruongDinh
J'ai désactivé le paiement des invités.
Paul
Et votre problème actuel?
Khoa TruongDinh
Le code que vous avez fourni est un peu différent de mon magento. Peut-être à partir de différentes versions. Et je ne comprends pas pourquoi il est lié aux cookies. Je l'ai finalement résolu en remplaçant la classe LoginPost. J'ai posté ma réponse ci-dessous. Merci!
Paul
1
Ma version de Magento est la v2.0.8
Paul

Réponses:

28

Un plugin est une meilleure solution dans ce cas, car votre classe étendue peut avoir besoin d'être mise à jour lors de la mise à jour de Magento 2.

Voici une solution utilisant un plugin après sur LoginPost-> execute () comme suggéré par Xenocide8998.

/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;
    }

}
cjohansson
la source
1
Ça marche bien. Une chose est quand vous devez $ result-> setPath ('/'); à votre chemin personnalisé, n'utilisez pas "/" avant l'URL, par exemple. $ result-> setPath ('client / tableau de bord /');
Shuvankar Paul
Bonne approche avec plugin
Hafiz Arslan
Perfect Work merci
HaFiz Umer
Votre seul problème avec cela est que si le client essaie de se connecter et échoue, vous allez toujours accéder à la page d'accueil. Il n'y a aucun moyen d'attraper les connexions qui ont échoué.
andy jones
comment puis-je transmettre l'URL de la page actuelle à ce plugin?
Rahul
6

Je l'ai résolu en remplaçant la classe LoginPost

etc / di.xml

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

Fournisseur / Module / Contrôleur / Compte / 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;
    }

}
Paul
la source
12
Je pense que l'utilisation d'un plugin avec le afterExecute()serait une option plus propre
Xenocide8998
2
Ce n'est pas une bonne approche et ne causera que des problèmes à l'avenir. Le plugin est la voie à suivre.
phagento
pouvons-nous rediriger le tableau de bord du compte vers la page d'historique des commandes par défaut?
jafar pinjar
0

Que le stockage local actuel a provoqué notre problème.
Si nous activons ou désactivons Redirect Customer to Account Dashboard after Logging inet Guest Checkout dans la configuration, cette fonctionnalité fonctionnera bien. Cependant, nous devons effacer votre stockage local.

Nous pouvons vérifier le stockage local localStorage.getItem('mage-cache-storage').

Regarde:

fournisseur / magento / module-checkout / view / 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 définira le cookie en $.cookie('login_redirect', this.options.url.checkout)fonction customerDatadu stockage local.

Depuis le contrôleur vendor/magento/module-customer/Controller/Account/LoginPost.php. Il vérifiera l'URL de redirection du cookie.

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

Version de Magento:

-Magento version 2.1.0

Khoa TruongDinh
la source
0

J'ai résolu ceci en passant le référent dans le contrôleur de module personnalisé.

Étape1 `

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);
    }
}`

Étape 2

Accédez à Admin: Store> Configuration> Clients> Configuration du client> Options de connexion> Rediriger le client vers le tableau de bord du compte après la connexion> Non

Charul Tyagi
la source