J’ai récemment été confronté à la problématique d’afficher des informations de clients non visibles depuis le back office.
Pour les voir il était donc nécessaire de se connecter comme ce client sur le front office du site avec la restriction de ne pas disposer du mot de passe client.

Après quelques recherche dans les classes Magento, j’ai trouvé une fonction qui correspondait parfaitement à mon besoin dans le fichier app/code/core/Mage/Customer/Model/Session.php
Cette fonction est la suivante :

/**
* Authorization customer by identifier
*
* @param   int $customerId
* @return  bool
*/
public function loginById($customerId)
{
$customer = Mage::getModel('customer/customer')->load($customerId);
if ($customer->getId()) {
$this->setCustomerAsLoggedIn($customer);
return true;
}
return false;
}

Elle permets de se connecter en tant que client en disposant uniquement de l’id client.
Ma solution est donc toute trouvée en utilisant cette fonction.

Pour rendre cette modification encore plus facile, nous allons faire un module qui nous permettra de nous connecter comme le client de notre choix directement depuis la gestion des clients dans l’administration.

Nouvelle action "M'identifier comme ce client"

Pour commencer créons le fichier de déclaration du module dans app/etc/modules/Hhennes_LoginAs.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Hhennes_LoginAs>
            <active>true</active>
            <codePool>local</codePool>
        </Hhennes_LoginAs>
    </modules>
</config>

Voici à présent la structure du module que nous allons créer.

 -- Hhennes_LoginAs
   -- Helper
    -- Data.php
   -- Model
    -- Observer.php
   -- controllers
	-- LoginController.php
   -- etc
    -- config.xml

Celui-ci sera relativement basique puisqu’il sera constitué d’un Helper, d’un controller Front Office et d’un Observer

En premier lieu voici le contenu du fichier de configuration :

<?xml version="1.0"?>
<config>
 
 <!-- Configuration de base du Module -->
    <modules>
        <Hhennes_LoginAs>
            <version>0.1</version>    
        </Hhennes_LoginAs>
    </modules>
 <!-- Configuration globale -->
    <global>
        <models>
            <hhennes_loginas>
            <class>Hhennes_LoginAs_Model</class>
            </hhennes_loginas>
        </models>
        <helpers>
            <hhennes_loginas>
                <class>Hhennes_LoginAs_Helper</class>
            </hhennes_loginas>
        </helpers>
    </global>
  <!-- Configuration Front Office-->
    <frontend>
        <routers>
            <hhennes_loginas>
                <use>standard</use>
                <args>
                    <module>Hhennes_LoginAs</module>
                    <frontName>hhennes_loginas</frontName>
                </args>
            </hhennes_loginas>
        </routers>
        <!-- Traduction du module -->
         <translate>
            <modules>
                <hhennes_LoginAs>
                    <files>
                        <default>Hhennes_LoginAs.csv</default>
                    </files>
                </hhennes_LoginAs>
            </modules>
        </translate>
    </frontend>  
    <!-- Configuration back Office -->
    <adminhtml>
        <events>
            <adminhtml_block_html_before>
                <observers>
                    <mymodule>
                        <!-- Add column to catalog product grid -->
                        <class>hhennes_loginas/observer</class>
                        <method>addCustomerLoginAsColumn</method>
                    </mymodule>
                </observers>
            </adminhtml_block_html_before>
        </events>
        <!-- Traduction du module -->
         <translate>
            <modules>
                <Hhennes_LoginAs>
                    <files>
                        <default>Hhennes_LoginAs.csv</default>
                    </files>
                </Hhennes_LoginAs>
            </modules>
        </translate>
    </adminhtml>  
</config>

Comme vous pouvez le constater dans ce fichier de configuration, nous déclarons :
– Nos models et helper
– le controller Front office
– l’observeur lors de l’évenement “adminhtml_block_html_before”
– les traductions du module

Voici le contenu du fichier Data.php (Pas de contenu spécifique c’est uniquement utilsé pour les traductions)

<?php
class hhennes_LoginAs_Helper_Data extends Mage_Core_Helper_Abstract {   
}
?>

Passons à présent à l’Observer, qui sera chargé d’ajouter notre option “M’identifier comme ce client” celui si est appellé lors de l’évenement “adminhtml_block_html_before”

( Cette modification serait également possible en surchargeant la Grid initiale de Magento, cependant l’utilisation des observers est moins intrusive et permet d’éviter bien des problèmes en cas de surcharges multiples)

<?php
class Hhennes_LoginAs_Model_Observer {
 
 
    /**
     * Ajout d'une nouvelle colonne dans le Grid Client de Magento
     * @param Varien_Event_Observer $observer 
     */
    public function addCustomerLoginAsColumn( Varien_Event_Observer $observer ) {
 
        $block = $observer->getBlock();
 
		//Si le block est la grid des clients on fait notre action
        if ( $block instanceof Mage_Adminhtml_Block_Customer_Grid ) {
 
            //On reprends le contenu de la colonne action de base et on rajoute l'option pour s'identifer
            $block->addColumn('action',
            array(
                'header'    =>  Mage::helper('customer')->__('Action'),
                'width'     => '100',
                'type'      => 'action',
                'getter'    => 'getId',
                'actions'   => array(
                    array(
                        'caption'   => Mage::helper('customer')->__('Edit'),
                        'url'       => array('base'=> '*/*/edit'),
                        'field'     => 'id'
                    ),
					//Notre nouvelle action
                    array(
                        'caption'   => Mage::helper('hhennes_loginas')->__('Login As'),
                        'url'       => array('base'=> 'hhennes_loginas/login'), // Redirection vers le controller Front Office
                        'field'     => 'id'
                    )
                ),
                'filter'    => false,
                'sortable'  => false,
                'index'     => 'stores',
                'is_system' => true,
        ));
 
        }
 
    }
 
}
?>

Une fois le processus back office terminé, nous pouvons à présent passer au controller Front Office dont voici le code

<?php
class Hhennes_LoginAs_LoginController extends Mage_Core_Controller_Front_Action {
 
 
    /**
     * Permet de s'identifer comme le client de son choix
     */
    public function indexAction(){
 
        //Récupération des informations de session
        $customerSession = Mage::getSingleton('customer/session');
 
        //Déconnexion si un client est déjà identifié
        if ( $customerSession->isLoggedIn() ) {
            $customerSession->logout();
        }
 
        //Récupération de l'id du client
        $customerId = $this->getRequest()->getParam('id');
 
        //Identification en tant que client
        $customerSession->loginById($customerId);
 
        //Message de confirmation de l'identification
        Mage::getSingleton('customer/session')->addSuccess($this->__('You are now identified as the choiced customer'));
 
       //Redirection vers l'accueil du compte client 
       $this->_redirect('customer/account/');
    }
 
}
 
?>

Pour finir notre module il faut encore créer le fichier de traduction “Hhennes_LoginAs.csv” dans app/locale/FR_fr/ avec le contenu suivant :

### Fichier de traduction du module Ei LoginAs ###
“Login As”,”M’identifier comme ce client”
“You are now identified as the choiced customer”,”Vous êtes à présent identifé comme le client choisi”

Une fois le module installé il est à présent possible de s’identifier facilement et rapidement comme le client de son choix 🙂