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.

Pablo
fuente
¿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;
    }

}
cjohansson
fuente
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;
    }

}
Pablo
fuente
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

Khoa TruongDinh
fuente
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

Charul Tyagi
fuente