Connectez-vous et redirigez le client vers son site Web

10

Dans un Magento multi-sites multi-sites, j'aimerais forcer les utilisateurs à se connecter au même site Web qu'ils ont enregistré. Ils peuvent utiliser n'importe quel formulaire de connexion, dans n'importe quel site Web, mais le formulaire doit vérifier leurs informations d'identification et les rediriger vers le site Web approprié.

J'ai essayé de vérifier le site Web du client et je l'ai forcé à se connecter. Cela ne fonctionne pas très bien cependant. L'utilisateur est connecté au site Web actuel, pas à celui qu'il a enregistré.

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

Des idées?

zekia
la source
Si vous vous connectez à partir d'un site, connectez-vous automatiquement à notre site?
Amit Bera
Je ne sais pas si vous comprenez votre question. L'utilisateur doit être connecté et rediriger vers le site Web qu'il a enregistré. Pas les deux sites Web
zekia
Supposons que le client s'inscrive sur le site Web A. Client Essayez de vous connecter à partir du site Web B, puis le client doit rediriger vers WebsiteA avec qutologin sur websiteA. droite?
Amit Bera
Oui, c'est exact
zekia

Réponses:

10

Tout d'abord, vous devez apporter quelques modifications au paramètre.

Partager des comptes clients entre plusieurs sites Web

Vous devez configurer cette fonction ici: System -> Configuration -> Customer Configuration -> Share Customer Accounts.

Définissez ce paramètre sur Global pour partager chaque client sur tous les sites Web .

entrez la description de l'image ici

Partager la connexion entre les sites Web

Pour conserver la session lors du basculement entre les magasins sur un site Web différent , activez «Utiliser SID sur le frontend» dans Système> Configuration> Général> Web :

entrez la description de l'image ici

Forcer les utilisateurs à rediriger vers le même site Web qu'ils ont enregistré

Connexion forcée du client au même site Web qu'il a enregistré lorsque nous avons essayé de nous connecter à partir d'un autre site Web.

Utilisation customer_login

Définissez l'événement sur 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> 

Classe d'observateur:

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

}

REMARQUE:

J'AI TESTÉ CE CODE SUR MES SITES WEB MAGENTO DEMO STORE.

Ces deux sites Web fonctionnent à partir de la même instance de Magento en utilisant le concept de site Web.

entrez la description de l'image ici

Amit Bera
la source
1
C'est une façon correcte de gérer ce problème. Mais avec cette méthode, un client du site Web A peut passer une commande sur le site Web B. Il peut s'agir d'une restriction par rapport aux spécifications du projet.
Franck Garnier
à droite, cela dépend des spécifications du projet
Amit Bera
Est-il possible d'empêcher les clients de passer commande à partir d'un autre site Web? Il s'agit d'une configuration multi-magasins de détail / de gros, de sorte que les clients de détail ne devraient pas être autorisés à se connecter au site Web de gros
zekia
oui, c'est possible
Amit Bera
J'ai quelques questions?. comment définissez-vous qu'un client est détaillant ou grossiste?
Amit Bera
1

vous pouvez réécrire la méthode ci-dessous pour vos besoins

réécrire sous la classe

Mage_Customer_Model_Session setCustomerAsLoggedIn méthode

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
la source
Voulez-vous dire que je devrais placer le code que j'ai publié dans setCustomerAsLoggedIn (), au lieu de login ()? Postez une réponse plus détaillée s'il vous plaît.
zekia
1

Utilisez l' customer_loginévénement pour éviter de modifier / réécrire / remplacer les fichiers de base.

Dans votre 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>

Votre classe d'observateur ( /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); 
    }
}

Notez que vous devrez attribuer différents groupes de clients aux clients de différentes vues de magasin.

Vous pouvez également attribuer l'attribut client et les définir lors de l'inscription via un champ caché dans le formulaire d'inscription au lieu d'attribuer des groupes de clients.

Vivek Kumar
la source