Magento 2 - Chuyển hướng khách hàng đến trang tùy chỉnh sau khi đăng nhập


8

Lớp nào tôi nên ghi đè để chuyển hướng khách hàng đến một trang cụ thể sau khi đăng nhập?

Tôi đã cố gắng thiết lập Redirect Customer to Account Dashboard after Logging introng cấu hình cửa hàng nhưng nó không hoạt động.


Bạn kích hoạt hoặc vô hiệu hóa Guest Checkout?
Khoa TruongDinh

Tôi đã vô hiệu hóa kiểm tra khách.
Paul

Làm thế nào về vấn đề hiện tại của bạn?
Khoa TruongDinh

Mã bạn cung cấp hơi khác so với magento của tôi. Có lẽ nó từ các phiên bản khác nhau. Và tôi không hiểu tại sao nó lại liên quan đến cookie. Cuối cùng tôi đã giải quyết nó bằng cách ghi đè lớp LoginPost. Tôi đã đăng câu trả lời của tôi dưới đây. Cảm ơn!
Paul

1
Phiên bản magento của tôi là v2.0.8
Paul

Câu trả lời:


26

Một plugin là một giải pháp tốt hơn trong trường hợp này vì lớp mở rộng của bạn có thể cần được cập nhật khi Magento 2 cập nhật.

Đây là một giải pháp sử dụng plugin sau trên LoginPost-> exec () theo đề xuất của 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
Nó hoạt động tốt. Một điều là khi bạn cần $ result-> setPath ('/'); ví dụ, đường dẫn tùy chỉnh của bạn không sử dụng "/" trước URL. $ result-> setPath ('khách hàng / bảng điều khiển /');
Shuvankar Paul 17/12/18

Cách tiếp cận tốt bằng cách sử dụng plugin
Hafiz Arslan

Công việc hoàn hảo cảm ơn bạn
HaFiz Umer

Vấn đề duy nhất của bạn với điều này là nếu khách hàng cố gắng đăng nhập và thất bại, thì bạn vẫn sẽ truy cập trang chủ. Không có cách nào để đăng nhập thất bại.
andy jones

Làm cách nào tôi có thể chuyển url trang hiện tại cho plugin này?
Raul

6

Tôi đã giải quyết nó bằng cách ghi đè lớp LoginPost

vv / di.xml

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

Nhà cung cấp / Mô-đun / Trình điều khiển / Tài khoản / 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
Tôi nghĩ rằng sử dụng một plugin với afterExecute()tùy chọn sẽ sạch hơn
Xenocide8998

2
Đây không phải là một cách tiếp cận tốt và sẽ chỉ gây ra vấn đề trong tương lai. Plugin là con đường để đi.
phagento

Theo mặc định, chúng tôi có thể chuyển hướng từ bảng điều khiển tài khoản sang trang lịch sử đặt hàng bán hàng không?
Jafar pinjar

0

Đó là lưu trữ cục bộ hiện tại gây ra vấn đề của chúng tôi.
Nếu chúng tôi bật hoặc tắt Redirect Customer to Account Dashboard after Logging invà Guest Checkout trong Cấu hình, tính năng này sẽ hoạt động tốt. Tuy nhiên, chúng tôi cần phải xóa bộ nhớ cục bộ của bạn.

Chúng tôi có thể kiểm tra lưu trữ cục bộ localStorage.getItem('mage-cache-storage').

Hãy xem:

nhà cung cấp / magento / kiểm tra mô-đun / xem / 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 sẽ đặt cookie $.cookie('login_redirect', this.options.url.checkout)dựa trên customerDatabộ nhớ cục bộ.

Từ bộ điều khiển vendor/magento/module-customer/Controller/Account/LoginPost.php. Nó sẽ kiểm tra URL chuyển hướng từ cookie.

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

Phiên bản Magento:

-Magento phiên bản 2.1.0


0

Tôi giải quyết điều này bằng cách đi qua referer trong bộ điều khiển mô-đun tùy chỉnh.

Bước 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);
    }
}`

Bước 2

Chuyển đến Quản trị viên: Cửa hàng> Cấu hình> Khách hàng> Cấu hình khách hàng> Tùy chọn đăng nhập> Chuyển hướng khách hàng đến Bảng điều khiển tài khoản sau khi đăng nhập> Không

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.