简体   繁体   English

将客户重定向到客户登录网站的产品页面 Magento 2

[英]Redirect customer to product page from where customer logged in to website Magento 2

In Magento 2, I have a custom login form in Header.在 Magento 2 中,我在 Header 中有一个自定义登录表单。

If a customer is on the product page for eg:如果客户在产品页面上,例如:

http://www.testwebsite.com/catalog/product/view/id/10 http://www.testwebsite.com/catalog/product/view/id/10

and login from header form then customer should redirect to the same product page instead of Customer Dashboard.并从 header 表单登录,然后客户应重定向到同一产品页面而不是客户仪表板。

I have tried plugin code from this link .我已经尝试过此链接中的插件代码。

Below is my custom header form code -下面是我的自定义 header 表单代码 -

<?php 

$objectManager = \Magento\Framework\App\ObjectManager::getInstance(); 
$customerSession = $objectManager->get('Magento\Customer\Model\Session'); 

$urlInterface = \Magento\Framework\App\ObjectManager::getInstance()->get('Magento\Framework\UrlInterface');
$currenturl =  $urlInterface->getCurrentUrl();

if(!$customerSession->isLoggedIn()) {?>
<div class="header-login-main">
    <form action="<?php echo $this->getUrl('customer/account/loginPost');?>" method="post" id="login-form" novalidate="novalidate">
        <input name="form_key" value="" type="hidden">
        <div class="header-login" style="">
            <span>Email</span>
            <input name="login[username]" id="email" class="input-text" title="Email" data-validate="{required:true, 'validate-email':true}" aria-required="true" type="email">
        </div>
        <div class="header-login">
            <span>Password</span>
            <input name="login[password]" id="pass" class="input-text" title="Password" data-validate="{required:true}" aria-required="true" type="password">

        </div>
        <div class="header-login1">
            <button type="submit" class="action login primary" name="send" id="send2"><span>Login</span>
        </div>
    </form>
    <a href="<?php echo $this->getUrl('customer/account/forgotpassword');?>" class="f-right" style="padding: 3px 5px;">Reset Your Password?</a>
</div>

<?php } ?> 

Plugin Code -插件代码 -

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

}

I want to redirect the customer to $currenturl.我想将客户重定向到 $currenturl。 Link tutorial can be able to redirect to the home page.链接教程可以重定向到主页。 Please suggest what needs to be done to achieve to redirect the customer to the current page.请建议需要做什么才能将客户重定向到当前页面。

Try the below:试试下面的:

Header Login Form:- Header 登录表格:-

<?php 

$objectManager = \Magento\Framework\App\ObjectManager::getInstance(); 
$customerSession = $objectManager->get('Magento\Customer\Model\Session'); 

$urlInterface = \Magento\Framework\App\ObjectManager::getInstance()->get('Magento\Framework\UrlInterface');
$currenturl =  $urlInterface->getCurrentUrl();

if(!$customerSession->isLoggedIn()) {?>
<div class="header-login-main">
    <form action="<?php echo $this->getUrl('customer/account/loginPost');?>" method="post" id="login-form" novalidate="novalidate">
        <input name="form_key" value="" type="hidden">
        <input type="hidden" name='referer' value="<?php echo $currenturl ?>">
        <div class="header-login" style="">
            <span>Email</span>
            <input name="login[username]" id="email" class="input-text" title="Email" data-validate="{required:true, 'validate-email':true}" aria-required="true" type="email">
        </div>
        <div class="header-login">
            <span>Password</span>
            <input name="login[password]" id="pass" class="input-text" title="Password" data-validate="{required:true}" aria-required="true" type="password">

        </div>
        <div class="header-login1">
            <button type="submit" class="action login primary" name="send" id="send2"><span>Login</span>
        </div>
    </form>
    <a href="<?php echo $this->getUrl('customer/account/forgotpassword');?>" class="f-right" style="padding: 3px 5px;">Reset Your Password?</a>
</div>

<?php } ?> 

Plugin Code: -插件代码: -

<?php
namespace Vendor\Module\Plugin;
class LoginPostPlugin
{
    protected $request;
    public function __construct(
       \Magento\Framework\App\RequestInterface $request
    ) {
       $this->request = $request;
    }
    public function getPostReferer()
    {
        return $this->request->getPostValue('referer');
    }

    /**
     * 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($this->getPostReferer());
        return $result;
    }    
}

Please try with the following code I have set the current url to the instant of $resultRedirect like this: $resultRedirect->setUrl($currenturl);请尝试使用以下代码我已将当前 url 设置为 $resultRedirect 的瞬间,如下所示: $resultRedirect->setUrl($currenturl);

<?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;
use Magento\Catalog\Api\ProductRepositoryInterface;

class LoginPost extends \Magento\Customer\Controller\Account\LoginPost {

    public function execute() {
        $urlInterface = \Magento\Framework\App\ObjectManager::getInstance()->get('Magento\Framework\UrlInterface');

        $sku = '24-MB01'; //Edit as per your product sku
        $_product = $this->productRepository->get($sku);
        $currenturl = $_product->getProductUrl();

        if ($this->session->isLoggedIn() || !$this->formKeyValidator->validate($this->getRequest())) {
            /** @var \Magento\Framework\Controller\Result\Redirect $resultRedirect */
            $resultRedirect = $this->resultRedirectFactory->create();
            //$resultRedirect->setPath('home');
            $resultRedirect->setUrl($currenturl);
            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');
        $resultRedirect->setUrl($currenturl);
        return $resultRedirect;
    }

}

If you have a plugin that receives the Magento\Customer\Controller\Account\LoginPost object you could get the referer URL like: $subject->_redirect->getRefererUrl() .如果您有一个接收Magento\Customer\Controller\Account\LoginPost object 的插件,您可以获得引荐来源 URL,例如: $subject->_redirect->getRefererUrl() Then return this URL然后返回这个 URL

$productURL = $subject->_url->getUrl($subject->_redirect->getRefererUrl());
return $subject->_redirect($productURL);

I'm not 100% sure if this URL will actually be the URL you want but worth a try.我不是 100% 确定这个 URL 是否真的是你想要的 URL 但值得一试。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Magento-从外部页面重定向后客户未登录 - Magento - Customer Not Logged in After Redirect From External Page 只有当客户登录时,我才想重定向到 Magento 页面(产品/类别等)。否则它应该重定向到客户登录页面 - I want to redirect to Magento Pages (Product/Categories etc.) only if Customer is Logged in. Otherwise it Should Redirect to Customer Login page Magento - 将点击评论页面的客户重定向到产品页面 - Magento - Redirect customer who hits review page to product page Magento审查已登录客户使用一种产品的情况 - Magento review for logged in customer on one product Magento检查客户是否从magento外部登录 - Magento Check if customer is logged in from outside of magento 跟踪客户在Magento中将产品添加到购物车的位置 - Tracking from where customer add product to cart in Magento Magento从产品查看页面上删除客户评论区 - Magento remove customer review block from product view page Magento产品详细信息-受用户登录限制+客户组? - Magento Product Detailed Info - Restrict By User Logged in + Customer Group? Magento 1 - 在 Magento 登录后将客户重定向回产品 - Magento 1 - Redirect customer back to product after login in Magento 从Magento中的客户检索产品订阅警报 - Retrieve product subscription alerts from a customer in Magento
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM