Faça login e redirecione o cliente para o site dele

10

Em um Magento multi-site mutistore, gostaria de forçar os usuários a fazer login no mesmo site que eles registraram. Eles podem usar qualquer formulário de login, em qualquer site, mas o formulário deve verificar suas credenciais e redirecioná-las para o site correto.

Tentei verificar o site do cliente e forçá-lo a fazer login. Mas não está funcionando muito bem. O usuário é logado no site atual, não no que ele está registrado.

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

Alguma ideia?

zekia
fonte
Se você fizer login em um site, faça login automaticamente em nosso site?
Amit Bera
Não tenho certeza se entendeu sua pergunta. O usuário deve estar logado e redirecionar para o site em que está registrado. Não ambos os sites
zekia
Suponha que o cliente se registre no site A. Cliente Tente fazer login no site B e, em seguida, o cliente deve redirecionar para o site A com a consulta no site A. direita?
Amit Bera
Sim, isso é correto
zekia

Respostas:

10

Primeiro, você precisa fazer algumas alterações na configuração.

Compartilhe contas de clientes entre vários sites

Você deve configurar esse recurso aqui: System -> Configuration -> Customer Configuration -> Share Customer Accounts.

Faça essa configuração como Global para compartilhar todos os clientes com todos os sites .

insira a descrição da imagem aqui

Compartilhar login entre sites

Para manter a sessão ao alternar entre lojas em sites diferentes , ative "Usar SID no front-end" em Sistema> Configuração> Geral> Web :

insira a descrição da imagem aqui

Forçar os usuários a redirecionarem para o mesmo site que eles registraram

Forçosamente, faça o login do cliente no mesmo site que ele registrou quando tentamos fazer o login em outro site.

Usar customer_login

Definir evento para 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 de observador:

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

}

NOTA:

TENHO ESTE CÓDIGO EM MEUS WEBSITES DA LOJA DE MAGENTO DEMO.

Este site dois está sendo executado na mesma instância magento usando o conceito de site.

insira a descrição da imagem aqui

Amit Bera
fonte
1
Esta é uma maneira correta de lidar com esse problema. Mas com esse método, um cliente no site A pode fazer um pedido no site B. Pode ser uma restrição da especificação do projeto.
Franck Garnier
certo, depende da especificação do projeto
Amit Bera
É possível impedir que os clientes façam pedidos de outro site. Esta é uma configuração multistore varejo / atacado, para que os clientes de varejo não deve ser permitido para acessar o site atacado
zekia
sim, é possível
Amit Bera
Eu tenho poucas perguntas? como você define um cliente como revendedor ou atacadista?
Amit Bera
1

você pode reescrever o método abaixo para sua exigência

reescrever abaixo da aula

Mage_Customer_Model_Session setCustomerAsLoggedIn método

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
fonte
Você quer dizer que eu deveria colocar o código que eu publiquei em setCustomerAsLoggedIn (), em vez de login ()? Poste uma resposta mais detalhada, por favor.
Zekia
1

Use o customer_loginevento para evitar alterar / reescrever / substituir arquivos principais.

No seu 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>

Sua classe de observador ( /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); 
    }
}

Observe que você terá que atribuir diferentes grupos de clientes a clientes com diferentes visualizações de loja.

Você também pode atribuir o atributo do cliente e defini-lo durante o registro através do campo oculto no formulário de registro, em vez de atribuir grupos de clientes.

Vivek Kumar
fonte