skip to Main Content

In Magento 2, I have a custom login form in Header.

If a customer is on the product page for eg :

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.

I have tried plugin code from this link.

Below is my custom header form code –

<?php 

$objectManager = MagentoFrameworkAppObjectManager::getInstance(); 
$customerSession = $objectManager->get('MagentoCustomerModelSession'); 

$urlInterface = MagentoFrameworkAppObjectManager::getInstance()->get('MagentoFrameworkUrlInterface');
$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" 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 VendorModulePlugin;
class LoginPostPlugin
{

    /**
     * Change redirect after login to home instead of dashboard.
     *
     * @param MagentoCustomerControllerAccountLoginPost $subject
     * @param MagentoFrameworkControllerResultRedirect $result
     */
    public function afterExecute(
        MagentoCustomerControllerAccountLoginPost $subject,
        $result)
    {
        $result->setPath('/'); // Change this to what you want
        return $result;
    }

}

I want to redirect the customer to $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.

3

Answers


  1. If you have a plugin that receives the MagentoCustomerControllerAccountLoginPost object you could get the referer URL like : $subject->_redirect->getRefererUrl(). Then return this 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.

    Login or Signup to reply.
  2. Please try with the following code I have set the current url to the instant of $resultRedirect like this : $resultRedirect->setUrl($currenturl);

    <?php
    
    namespace VendorModuleControllerAccount;
    
    use MagentoCustomerModelAccountRedirect as AccountRedirect;
    use MagentoFrameworkAppActionContext;
    use MagentoCustomerModelSession;
    use MagentoCustomerApiAccountManagementInterface;
    use MagentoCustomerModelUrl as CustomerUrl;
    use MagentoFrameworkExceptionEmailNotConfirmedException;
    use MagentoFrameworkExceptionAuthenticationException;
    use MagentoFrameworkDataFormFormKeyValidator;
    use MagentoCatalogApiProductRepositoryInterface;
    
    class LoginPost extends MagentoCustomerControllerAccountLoginPost {
    
        public function execute() {
            $urlInterface = MagentoFrameworkAppObjectManager::getInstance()->get('MagentoFrameworkUrlInterface');
    
            $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 MagentoFrameworkControllerResultRedirect $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;
        }
    
    }
    
    Login or Signup to reply.
  3. Try the below:

    Header Login Form :-

    <?php 
    
    $objectManager = MagentoFrameworkAppObjectManager::getInstance(); 
    $customerSession = $objectManager->get('MagentoCustomerModelSession'); 
    
    $urlInterface = MagentoFrameworkAppObjectManager::getInstance()->get('MagentoFrameworkUrlInterface');
    $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 VendorModulePlugin;
    class LoginPostPlugin
    {
        protected $request;
        public function __construct(
           MagentoFrameworkAppRequestInterface $request
        ) {
           $this->request = $request;
        }
        public function getPostReferer()
        {
            return $this->request->getPostValue('referer');
        }
    
        /**
         * Change redirect after login to home instead of dashboard.
         *
         * @param MagentoCustomerControllerAccountLoginPost $subject
         * @param MagentoFrameworkControllerResultRedirect $result
         */
        public function afterExecute(
            MagentoCustomerControllerAccountLoginPost $subject,
            $result)
        {
            $result->setPath($this->getPostReferer());
            return $result;
        }    
    }
    
    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search