Nicolas le 24 mai 2009

Objectif

Afin de se rendre compte des possibilités d’extension de Magento, nous nous intéresserons ici au mécanisme de surcharge du comportement natif.

Lors de la personnalisation de notre plateforme, il est déterminant de ne pas modifier le noyau de Magento, la bonne pratique consiste à créer un nouveau module surchargeant les éléments dont nous désirons modifier le comportement ou le rendu.

Pour illustrer le propos, nous nous appliquerons à personnaliser l’interface d’administration permettant de lister les clients de notre site marchand.

Sur le backoffice de Magento, naviguer via le menu « Customer > Manage customers » pour consulter la liste suivante :

liste-client-magento

Notre objectif est d’ajouter une colonne à cette liste, celle-ci devra contenir le total des achats de chaque client.

Démonstration

Créer l’architecture du nouveau module

Créer l’architecture suivante dans « repertoire_magento/app/code/local/ » :

nico@laptop:/var/www/magento/app/code/local$ tree
`-- LibreAVous
    `-- AdminCustomerList
        |-- Block
        |   `-- Customer
        |       `-- Grid.php
        `-- etc
            `-- config.xml

Déclarer le module

Afin d’informer Magento de la présence d’un nouveau module, créer le fichier LibreAVous_All.xml avec le contenu suivant dans « repertoire_magento/app/etc/modules/ » :

<?xml version="1.0"?>  
<config>
    <modules>
        <!-- déclarer notre module auprès de Magento -->
        <LibreAVous_AdminCustomerList>
            <active>true</active>
            <codePool>local</codePool>
        </LibreAVous_AdminCustomerList>
    </modules>
</config>

Surcharger la liste des clients

Le comportement à personnaliser est défini par la classe-bloc Mage_Adminhtml_Block_Customer_Grid stockée dans le fichier « repertoire_magento/app/code/core/Mage/Adminhtml/Block/Customer/Grid.php » et en particulier au sein des méthodes suivantes :

class Mage_Adminhtml_Block_Customer_Grid extends Mage_Adminhtml_Block_Widget_Grid
{
    // ... etc ...
    /** récupération des données, nous devrons ajouter une jointure */
    protected function _prepareCollection()
    {
        $collection = Mage::getResourceModel('customer/customer_collection')
            ->addNameToSelect()
            ->addAttributeToSelect('email')
            // ... etc ...
        $this->setCollection($collection);
        return parent::_prepareCollection();
    }
 
    /** définition des colonnes, nous devrons ajouter la notre */
    protected function _prepareColumns()
    {
        $this->addColumn('entity_id', array(
            'header'    => Mage::helper('customer')->__('ID'),
            'width'     => '50px',
            'index'     => 'entity_id',
            'type'  => 'number',
        ));
        // ... etc ...

Éditons notre fichier Grid.php situé dans « LibreAVous/AdminCustomerList/Block/Customer » :

<?php
/** hérite du bloc natif et donc de son comportement par défaut*/
class LibreAVous_AdminCustomerList_Block_Customer_Grid
    extends Mage_Adminhtml_Block_Customer_Grid
{
    /** on copie-colle la méthode "remplacée" puis la personnalise */
    protected function _prepareCollection()
    {
        $collection = Mage::getResourceModel('customer/customer_collection')
            ->addNameToSelect()
            // ... idem méthode "remplacée"
        // ajouter la jointure avec la table sales_order
        $collection->getSelect()->joinLeft(array('table_orders'=>'sales_order'),
            'e.entity_id = table_orders.customer_id', array());
        $collection->addExpressionAttributeToSelect('orders_sum',
            'SUM(grand_total)', array())->groupByAttribute('entity_id');
        $this->setCollection($collection);
        // appeller la méthode grand parente pour éviter le remplacement de 
        // la requête
        return Mage_Adminhtml_Block_Widget_Grid::_prepareCollection();
    }
 
    /** on copie-colle la méthode surchargée et on ajoute notre colonne */
    protected function _prepareColumns()
    {
        $this->addColumn('entity_id', array(
            'header'    => Mage::helper('customer')->__('ID'),
            'width'     => '50px',
            'index'     => 'entity_id',
            'type'  => 'number',
        ));
        $this->addColumn('name', array(
            'header'    => Mage::helper('customer')->__('Name'),
            'index'     => 'name'
        ));
        $this->addColumn('email', array(
            'header'    => Mage::helper('customer')->__('Email'),
            'width'     => '150',
            'index'     => 'email'
        ));
        // ajouter notre colonne
        $this->addColumn('orders_sum', array(
            'header'    => Mage::helper('customer')->__('Lifetime Sales'),
            'width'     => '50px',
            'index'     => 'orders_sum',
            'type'      => 'currency',
            'currency_code' => (string) Mage::getStoreConfig(
                Mage_Directory_Model_Currency::XML_PATH_CURRENCY_BASE),
        ));
        // ... idem méthode surchargée ...
    }
}

Configurer le module

Pour préciser à Magento qu’il devra désormais utiliser notre définition de la liste des clients, déclarons le remplacement dans le fichier config.xml situé dans « LibreAVous/AdminCustomerList/etc/ »

<?xml version="1.0"?>
<config>
    <modules>
        <LibreAVous_AdminCustomerList>
            <version>0.1.0</version>
        </LibreAVous_AdminCustomerList>
    </modules>
    <global>
        <!-- définir le remplacement du bloc -->
        <blocks>
            <adminhtml>
                <rewrite>
                    <customer_grid>
                         LibreAVous_AdminCustomerList_Block_Customer_Grid
                    </customer_grid>
                </rewrite>
            </adminhtml>
        </blocks>
    </global>
</config>

Activer le module et tester le rendu

Afin de s’assurer que le module est activé, se rendre sur le backoffice de Magento et naviguer via le menu : « System > Configuration » puis sur l’onglet « Advanced » pour consulter la liste des modules. La ligne LibreAVous_AdminCustomerList doit indiquer que le module est activé.

Notre liste des clients est désormais personnalisée et accessible à « Customer > Manage customers » :

liste-client-personnalisee-magento

Conclusion

Après avoir exploré la personnalisation de Magento via l’approche par surcharge, nous nous pencherons bientôt sur une autre possibilité, le mécanisme Event – Observer.

Mots-clefs: ,

2 réponses à “Personnaliser Magento : surcharge d’un bloc”

  1. Edouard dit :

    Bonjour,
    J’ai effectué votre tutoriel à la lettre mais quand je me rend sur la page gérer les clients j’ai le droit à une page blanche.
    Savez vous d’où peut venir le problème ?

  2. Nicolas dit :

    Bonjour,

    essayez de rafraîchir les caches dans le back office Système > Gestion du cache (en particulier le cache de configuration).

    si cela ne fonctionne toujours pas, vous pouvez vider le cache manuellement en vidant le répertoire /mon_rep/magento/var/cache.

Laisser une réponse

Vous pouvez utiliser ces mots-clés: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">