ログインして顧客を彼のウェブサイトにリダイレクトする


10

mutistore-multiwebsite Magentoで、ユーザーが登録したのと同じWebサイトにログインするように強制したいと思います。彼らはどのWebサイトでも任意のログインフォームを使用できますが、フォームは資格情報を確認し、正しいWebサイトにリダイレクトする必要があります。

お客様のウェブサイトを確認し、ログインを強制しようとしました。それはかなりうまくいきません。ユーザーは、自分が登録しているWebサイトではなく、現在のWebサイトにログインします。

app / code / local / mage / Customer / Session.php

public function login($username, $password)
{
    /**************************************************/
    $customer = Mage::getModel("customer/customer");
    $customer_website = null;


    foreach (Mage::app()->getWebsites() as $website) {
        $customer->setWebsiteId($website->getId());
        $customer->loadByEmail($username);
        //check if user exists
        if($customer->getName()){
            $customer_website = $website->getId();
        }
    }
    /*************************************************/
    $customer = Mage::getModel('customer/customer')->setWebsiteId($customer_website);

    if ($customer->authenticate($username, $password)) {
        $this->setCustomerAsLoggedIn($customer);
        return true;
    }
    return false;
}

何か案は?


あるサイトからログインすると、自動的に私たちのサイトにログインしますか?
アミットベラ

あなたの質問が理解できるかどうかわかりません。ユーザーはログインして、登録したWebサイトにリダイレクトする必要があります。両方のウェブサイトではない
zekia

顧客がWebサイトAで登録するとします。顧客がWebサイトBからログインを試みた後、顧客はWebsiteAでqutologinを使用してWebsiteAにリダイレクトする必要があります。正しい?
アミットベラ

はい、それは正しいです
-zekia

回答:


10

まず、設定を変更する必要があります。

複数のWebサイト間で顧客アカウントを共有する

ここでこの機能を設定する必要があります:System -> Configuration -> Customer Configuration -> Share Customer Accounts

すべての顧客をすべてのWebサイトに共有するには、この設定をグローバルに設定します

ここに画像の説明を入力してください

ウェブサイト間でログインを共有する

異なるWebサイトのストア切り替えるときにセッションを維持するには、[システム]> [構成]> [一般]> [Web]で[フロントエンドでSIDを使用]を有効にします

ここに画像の説明を入力してください

ユーザーが登録したのと同じWebサイトにリダイレクトするように強制する

別のWebサイトからログインしようとしたときに登録したのと同じWebサイトに顧客が強制的にログインます。

使用する customer_login

イベントをconfig.xmlに定義します

<?xml version="1.0"?>
<config>
  <modules>
    <Stackexchange_Magento165528>
      <version>1.0.0</version>
    </Stackexchange_Magento165528>
  </modules>
  <global>
    <models>
      <magento165528>
        <class>Stackexchange_Magento165528_Model</class>
      </magento165528>
    </models>
    <events>
      <customer_login> <!-- identifier of the event we want to catch -->
        <observers>
          <customer_login_handler> <!-- identifier of the event handler -->
            <type>singleton</type> <!-- class method call type; valid are model, object and singleton -->
            <class>magento165528/observer</class> <!-- observers class alias -->
            <method>redirectoSourceDomain</method>  <!-- observer's method to be called -->
            <args></args> <!-- additional arguments passed to observer -->
          </customer_login_handler>
        </observers>
      </customer_login>
    </events>
  </global>
</config> 

オブザーバークラス:

<?php
class Stackexchange_Magento165528_Model_Observer
{

    public function redirectoSourceDomain(Varien_Event_Observer $observer)
    {
        $_customer = $observer->getEvent()->getCustomer();
        /* 
        * Store of website from which website  Customer have registered
        */
        $_customer_resgister_store_id= $_customer->getStoreId();

        if($_customer_resgister_store_id != Mage::app()->getStore()->getStoreId()){
            $allStores=Mage::app()->getStores(); //get list of all stores,websites

            foreach ($allStores as $_eachStoreId => $val){
                $_storeId = Mage::app()->getStore($_eachStoreId)->getId();
                //get url using store id
                if($_customer_resgister_store_id  == $_eachStoreId ){
                $Websiteurl= Mage::app()->getStore($_storeId)->getBaseUrl(Mage_Core_Model_Store::URL_TYPE_WEB);
                $_redirecUrl =  $Websiteurl."customer/account/login?SID=".Mage::getModel("core/session")->getEncryptedSessionId(); 
                /* Force redirect to repective Website */
                Mage::app()->getFrontController()->getResponse()
                            ->setRedirect($_redirecUrl)
                            ->sendResponse();
                        exit;   
                }

            }

        }
        return;
    }

}

注意:

私はこのコードを私のMAGENTO DEMO STORE Webサイトでテストしました。

この2つのWebサイトは、Webサイトの概念を使用して同じmagentoインスタンスから実行されています。

ここに画像の説明を入力してください


1
これは、この問題を処理する正しい方法です。ただし、この方法では、WebサイトAの顧客がWebサイトBに注文を出すことができます。これは、プロジェクト仕様の制限になる場合があります。
フランクガルニエ2017年

右、それはプロジェクトの仕様に依存
Amit Bera

顧客が別のウェブサイトから注文するのを防ぐことは可能ですか?これは小売/卸売りのマルチ
ストア

はい、可能です
Amit Bera

少し質問がありますか?顧客を小売業者または卸売業者とどのように定義しますか?
アミットベラ

1

あなたの要件に合わせて以下のメソッドを書き換えることができます

クラスの下に書き直す

Mage_Customer_Model_Session setCustomerAsLoggedIn 方法

public function setCustomerAsLoggedIn($customer)
{
    $this->setCustomer($customer);
    $this->renewSession();
    Mage::dispatchEvent('customer_login', array('customer'=>$customer));
    // check here customer website ID and redirect to their own registered website  
    return $this;
}

login()ではなく、setCustomerAsLoggedIn()に投稿したコードを配置する必要があるということですか?より詳細な回答を投稿してください。
zekia

1

customer_loginイベントを使用して、コアファイルの変更/書き換え/上書きを回避します。

あなたのconfig.xmlで

<config>
  <global>
    <models>
        ....
    </models>
    <events>
        <customer_login>
            <observers>
                <yourobservername>
                    <type>model</type>
                    <class>yourmodule/path_to_class</class>
                    <method>loginSwitchStore</method>
                </yourobservername>
            </observers>
        </customer_login>    
    </events>
  </global>
</config>

オブザーバークラス(/app/code/local/YourCompany/YourModule/Model/Observer.php):

class YourCompany_YourModule_Model_Observer
{
    public function loginSwitchStore($observer)
    {
        $customer = $observer->getCustomer();

        switch($customer->getCustomerGroup())
        {
            case 1: $storeCode = 'storeview1';break;
            case 2: $storeCode = 'storeview2';break;
            case 3: $storeCode = 'storeview3';break;
        }
        $params = array( '_current' => TRUE, '_use_rewrite' => TRUE, '_store_to_url' => TRUE, '_store' => Mage::app()->getStore($storeCode)->getId() );  
        $url = Mage::getUrl('', $params); 
        Mage::app()->getResponse()->setRedirect($url);

        //add this if you want them to stay in that store even after logout
        Mage::getModel('core/cookie')->set('store', $storeCode); 
    }
}

異なるストアビューの顧客に異なる顧客グループを割り当てる必要があることに注意してください。

顧客グループを割り当てる代わりに、登録フォームの非表示フィールドを介して、顧客属性を割り当て、登録時にそれらを設定することもできます。

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