Inicie sesión y redirija al cliente a su sitio web

10

En un Magento de varios sitios múltiples, me gustaría obligar a los usuarios a iniciar sesión en el mismo sitio web que han registrado. Pueden usar cualquier formulario de inicio de sesión, en cualquier sitio web, pero el formulario debe verificar sus credenciales y redirigirlas al sitio web correcto.

Traté de consultar el sitio web del cliente y obligarlo a iniciar sesión. Sin embargo, no funciona bastante bien. El usuario inicia sesión en el sitio web actual, no en el que está registrado.

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

¿Algunas ideas?

zekia
fuente
Si inicia sesión desde un sitio, ¿iniciará sesión automáticamente en nuestro sitio?
Amit Bera
No estoy seguro si entiendo tu pregunta. El usuario debe iniciar sesión y redirigirse al sitio web en el que está registrado. No ambos sitios web
zekia
Supongamos que el cliente se registra en el sitio web A. El cliente debe iniciar sesión desde el sitio web B, luego el cliente debe redirigir al sitio web A con qutologin en el sitio webA. ¿Correcto?
Amit Bera
Sí, eso es correcto
zekia

Respuestas:

10

Primero, debe hacer algunos cambios en la configuración.

Compartir cuentas de clientes entre múltiples sitios web

Debe configurar esta función aquí: System -> Configuration -> Customer Configuration -> Share Customer Accounts.

Establezca esta configuración en Global para compartir cada cliente con todos los sitios web .

ingrese la descripción de la imagen aquí

Compartir inicio de sesión entre sitios web

Para mantener la sesión al cambiar de tienda en un sitio web diferente , habilite "Usar SID en Frontend" en Sistema> Configuración> General> Web :

ingrese la descripción de la imagen aquí

Forzar a los usuarios a redirigirse al mismo sitio web que tienen registrado

Inicio de sesión forzoso del cliente en el mismo sitio web que registraron cuando intentamos iniciar sesión desde otro sitio web.

Utilizar 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> 

Clase 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:

HE PROBADO ESTE CÓDIGO en MI SITIO WEB DE LA TIENDA DEMO DE MAGENTO.

Estos dos sitios web se ejecutan desde la misma instancia de magento utilizando el concepto de sitio web.

ingrese la descripción de la imagen aquí

Amit Bera
fuente
1
Esta es una forma correcta de manejar este problema. Pero con este método, un cliente en el sitio web A puede hacer un pedido en el sitio web B. Puede ser una restricción de la especificación del proyecto.
Franck Garnier
bien, depende de la especificación del proyecto
Amit Bera
¿Es posible evitar que los clientes hagan pedidos desde otro sitio web? Esta es una configuración de multinúcleo minorista / mayorista, por lo que no se debe permitir que los clientes minoristas
inicien
sí, es posible
Amit Bera
Tengo pocas preguntas? ¿Cómo define que un cliente es minorista o mayorista?
Amit Bera
1

Puede reescribir el siguiente método para su requerimiento

reescribir debajo de la clase

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
fuente
¿Quiere decir que debería colocar el código que publiqué en setCustomerAsLoggedIn (), en lugar de login ()? Publique una respuesta más detallada por favor.
zekia
1

Use el customer_loginevento para evitar cambiar / reescribir / anular archivos principales.

En su 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>

Tu clase 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); 
    }
}

Tenga en cuenta que tendrá que asignar diferentes grupos de clientes a clientes de diferentes vistas de la tienda.

También puede asignar un atributo de cliente y establecerlo durante el registro a través de un campo oculto en el formulario de registro en lugar de asignar grupos de clientes.

Vivek Kumar
fuente