Magento 2-ログイン後にお客様をカスタムページにリダイレクト


9

ログイン後に顧客を特定のページにリダイレクトするためにどのクラスをオーバーライドする必要がありますか?

Redirect Customer to Account Dashboard after Logging inストア構成で設定しようとしましたが、機能しません。


ゲストチェックアウトを有効または無効にしますか?
Khoa TruongDinh 16

ゲストのチェックアウトを無効にしました。
Paul

あなたの現在の問題はどうですか?
Khoa TruongDinh 16

あなたが提供したコードは私のmagentoとは少し異なります。多分それは異なるバージョンからです。そして、それがcookieに関連している理由がわかりません。最後に、LoginPostクラスをオーバーライドして解決しました。以下に回答を掲載しました。ありがとう!
Paul

1
私のmagentoバージョンはv2.0.8です
Paul

回答:


28

この場合、Magento 2の更新時に拡張クラスの更新が必要になる可能性があるため、プラグインの方が優れたソリューションです。

Xenocide8998で提案されているように、LoginPost-> execute()でプラグインを使用したソリューションを次に示します。

/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
それはうまくいきます。1つは、$ result-> setPath( '/');が必要な場合です。たとえば、カスタムパスのURLの前に「/」を使用しないでください。$ result-> setPath( 'customer / dashboard /');
Shuvankar Paul 2018

プラグインを使用した適切なアプローチ
Hafiz Arslan

パーフェクトワークありがとう
HaFiz Umer

これに関する唯一の問題は、顧客がログインを試みて失敗した場合でも、ホームページにアクセスすることです。失敗したログインをキャッチする方法はありません。
アンディジョーンズ

このプラグインに現在のページのURLを渡すにはどうすればよいですか?
Rahul、

6

LoginPostクラスをオーバーライドして解決しました

etc / di.xml

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

ベンダー/モジュール/コントローラー/アカウント/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
でプラグインを使用するafterExecute()方がきれいなオプションだと思います
Xenocide8998

2
これは良いアプローチではなく、将来的に問題が発生するだけです。プラグインは進むべき道です。
ファージト

デフォルトでアカウントダッシュボードから注文履歴ページにリダイレクトできますか?
jafar pinjar

0

現在のローカルストレージが問題の原因であること。構成でゲストチェックアウト
を有効または無効にするRedirect Customer to Account Dashboard after Logging inと、この機能は適切に機能します。ただし、ローカルストレージを消去する必要があります。

ローカルストレージを確認できますlocalStorage.getItem('mage-cache-storage')

見てください:

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はローカルストレージからのCookie $.cookie('login_redirect', this.options.url.checkout)を設定しcustomerDataます。

コントローラーからvendor/magento/module-customer/Controller/Account/LoginPost.php。CookieからリダイレクトURLをチェックします。

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

Magentoバージョン:

-Magentoバージョン2.1.0


0

カスタムモジュールコントローラーでリファラーを渡すことでこれを解決しました。

ステップ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);
    }
}`

ステップ2

[管理]> [ストア]> [構成]> [顧客]> [顧客の構成]> [ログインオプション]> [ログイン後に顧客をアカウントダッシュボードにリダイレクト]> [いいえ]に移動します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.