Magento 2: redirige al cliente a una página personalizada después de iniciar sesión


9

¿Qué clase debería anular para redirigir a un cliente a una página específica después de iniciar sesión?

He intentado establecer Redirect Customer to Account Dashboard after Logging inen la configuración de la tienda pero no funciona.


¿Habilita o deshabilita el pago de invitado?
Khoa TruongDinh

He inhabilitado el pago de invitados.
Paul

¿Qué tal tu problema actual?
Khoa TruongDinh

El código que proporcionó es un poco diferente de mi magento. Quizás sea de diferentes versiones. Y no entiendo por qué está relacionado con las cookies. Finalmente lo resolví anulando la clase LoginPost. Publiqué mi respuesta a continuación. ¡Gracias!
Paul

1
Mi versión de magento es v2.0.8
Paul

Respuestas:


28

Un complemento es una mejor solución en este caso porque su clase extendida podría necesitar actualizarse cuando Magento 2 se actualice.

Aquí hay una solución que utiliza un complemento posterior en LoginPost-> execute () como lo sugiere 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;
    }

}

1
Funciona bien. Una cosa es cuando necesita $ result-> setPath ('/'); a su ruta personalizada no use "/" antes de URL, por ejemplo. $ result-> setPath ('customer / dashboard /');
Shuvankar Paul

Buen enfoque utilizando el complemento
Hafiz Arslan

Trabajo perfecto gracias
HaFiz Umer

Su único problema con esto es que si el cliente intenta iniciar sesión y falla, aún así accederá a la página de inicio. No hay ninguna forma de detectar inicios de sesión fallidos.
andy jones

¿Cómo puedo pasar la URL de la página actual a este complemento?
Rahul

6

Lo resolví anulando la clase LoginPost

etc / di.xml

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

Proveedor / Módulo / Controlador / Cuenta / 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
Creo que usar un complemento con afterExecute()sería una opción más limpia
Xenocide8998

2
Este no es un buen enfoque y solo causará problemas en el futuro. El complemento es el camino a seguir.
phagento

¿podemos redirigir desde el panel de la cuenta a la página del historial de pedidos de ventas de forma predeterminada?
jafar pinjar

0

Que el almacenamiento local actual causó nuestro problema.
Si habilitamos o deshabilitamos Redirect Customer to Account Dashboard after Logging iny Guest Checkout en Configuración, esta característica funcionará bien. Sin embargo, necesitamos borrar su almacenamiento local.

Podemos verificar el almacenamiento local localStorage.getItem('mage-cache-storage').

Echar un vistazo:

vendor / 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 configurará la cookie en $.cookie('login_redirect', this.options.url.checkout)función customerDatadel almacenamiento local.

Del controlador vendor/magento/module-customer/Controller/Account/LoginPost.php. Verificará la URL de redireccionamiento desde la cookie.

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

Versión de Magento:

-Magento versión 2.1.0


0

Resolví esto pasando el árbitro en el controlador de módulo personalizado.

Paso1 `

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

Paso 2

Vaya a Admin: Tienda> Configuración> Clientes> Configuración del cliente> Opciones de inicio de sesión> Redirigir al cliente al panel de la cuenta después de iniciar sesión> No

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.