Zaloguj się i przekieruj klienta do jego strony internetowej

10

Na wielostronnej stronie Magento chciałbym zmusić użytkowników do zalogowania się na tej samej stronie, którą zarejestrowali. Mogą używać dowolnego formularza logowania na dowolnej stronie internetowej, ale formularz powinien sprawdzić swoje dane uwierzytelniające i przekierować je na odpowiednią stronę internetową.

Próbowałem sprawdzić stronę internetową klienta i zmusić go do zalogowania się. Jednak nie działa całkiem dobrze. Użytkownik zostaje zalogowany do bieżącej witryny, a nie tej, którą zarejestrował.

W aplikacji / 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;
}

Jakieś pomysły?

zekia
źródło
Jeśli logujesz się z jednej strony, to automatycznie logujesz się na naszej stronie?
Amit Bera
Nie jestem pewien, czy rozumiem twoje pytanie. Użytkownik powinien być zalogowany i przekierować na stronę internetową, którą zarejestrował. Nie obie strony
Zekia
Załóżmy, że klient zarejestrował się na stronie A. Klient Spróbuj spróbować zalogować się na stronie B, a następnie klient powinien przekierować na stronę A z qutologin na stronie A. dobrze?
Amit Bera
Tak,
zgadza się

Odpowiedzi:

10

Najpierw musisz wprowadzić zmiany w ustawieniach.

Udostępniaj konta klientów między wieloma witrynami

Należy skonfigurować tę funkcję tutaj: System -> Configuration -> Customer Configuration -> Share Customer Accounts.

Ustaw to ustawienie na Globalne, aby udostępniać każdego klienta wszystkim stronom internetowym .

wprowadź opis zdjęcia tutaj

Udostępnij logowanie między stronami internetowymi

Aby zachować sesję podczas przełączania między sklepami w różnych witrynach internetowych , włącz „Użyj SID w interfejsie użytkownika” w System> Konfiguracja> Ogólne> Internet :

wprowadź opis zdjęcia tutaj

Zmuś użytkowników do przekierowania na tę samą stronę internetową, którą zarejestrowali

Zdecydowanie klient loguje się do tej samej witryny, którą zarejestrował, gdy próbowaliśmy zalogować się z innej strony.

Posługiwać się customer_login

Zdefiniuj zdarzenie w pliku 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> 

Klasa obserwatora:

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

}

UWAGA:

TESTUJĘ TEN KOD na STRONACH MOJEJ MAGENTO DEMO.

Ta strona internetowa działa z tej samej instancji Magento przy użyciu koncepcji strony internetowej.

wprowadź opis zdjęcia tutaj

Amit Bera
źródło
1
To poprawny sposób na rozwiązanie tego problemu. Ale dzięki tej metodzie klient w witrynie A może złożyć zamówienie w witrynie B. Może to być ograniczenie ze specyfikacji projektu.
Franck Garnier
tak, to zależy od specyfikacji projektu
Amit Bera
Czy można uniemożliwić klientom zamawianie z innej strony internetowej? Jest to konfiguracja dla wielu sklepów detalicznych / hurtowych, więc klienci detaliczni nie powinni mieć możliwości logowania się do hurtowni
Zekia
tak, jest to możliwe
Amit Bera
Mam kilka pytań ?. jak definiujesz klienta, który jest sprzedawcą lub hurtownikiem?
Amit Bera
1

możesz przepisać poniższą metodę dla swoich wymagań

przepisz poniżej klasy

Mage_Customer_Model_Session setCustomerAsLoggedIn metoda

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;
}
Murtuza Zabuawala
źródło
Czy masz na myśli, że powinienem umieścić kod, który opublikowałem w setCustomerAsLoggedIn (), zamiast login ()? Proszę podać bardziej szczegółową odpowiedź.
zekia
1

Użyj customer_loginzdarzenia, aby uniknąć zmiany / przepisania / zastąpienia plików podstawowych.

W pliku 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>

Twoja klasa obserwatorów ( /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); 
    }
}

Pamiętaj, że będziesz musiał przypisać różne grupy klientów do klientów o różnych widokach sklepu.

Możesz także przypisać atrybut klienta i ustawić go podczas rejestracji za pomocą ukrytego pola w formularzu rejestracyjnym zamiast przypisywania grup klientów.

Vivek Kumar
źródło