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 in
trong cấu hình cửa hàng nhưng nó không hoạt động.
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 in
trong cấu hình cửa hàng nhưng nó không hoạt động.
Câu trả lời:
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;
}
}
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;
}
}
afterExecute()
tùy chọn sẽ sạch hơn
Đó 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 in
và 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 customerData
bộ 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
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