Objectif

La manière classique de personnaliser les fonctionnalités natives de Magento est de créer un module surchargeant les contrôleurs, modèles ou blocs du noyau.

Une autre méthode basée sur le mécanisme Événement – Observateur (event – observer) permet parfois d’obtenir le même résultat en limitant le couplage inter-modules.

Le principe est le suivant, Magento est conçu de façon à lever et récupérer des événements lors de certaines manipulations, comme par exemple, la sauvegarde d’un produit.

Pour résumer :

  • événement (ou event) se produit à un certain moment lors d’une séquence d’actions utilisateur ;
  • observateur (ou observer) est l’objet notifié lorsque l’un des événements qu’il surveille se produit.

Démonstration

Pour illustrer ce mécanisme, nous allons créer un nouveau module définissant un observateur qui surveille la fonctionnalité d’envoi de la référence d’un article à un ami afin de journaliser cet événement lorsqu’il a lieu.

magento-send-to-a-friend-link

Créer le module

Créer l’architecture et les fichiers du nouveau module :

nico@laptop:/var/www/magento/app/code/local/$ tree
`-- LibreAVous
    `-- EmailToAFriend
        |-- Model
        |   `-- Observer.php
        `-- etc
            `-- config.xml

Déclarer le module

Ajouter le fichier LibreAVous_EmailToAFriend.xml dans « /app/etc/modules/ » :

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

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.

Créer l’observateur

L’observateur suivant récupère le produit dont le lien a été envoyé par e-mail et journalise un message dans le fichier de log standard de Magento (/var/log/system.log) :

<?php
class LibreAVous_EmailToAFriend_Model_Observer
{
    public function logSending($observer)
    {
        $product = $observer->getData('product');
        Mage::log("a link to {$product->getName()} product was send");
    }
}

Configurer le module

Il ne reste plus qu’à associer la méthode de notre observateur à l’événement identifié par « sendfriend_product » dans le fichier de configuration « config.xml » :

<?xml version="1.0"?>
<config>
    <modules>
        <LibreAVous_EmailToAFriend>
            <version>0.2.0</version>
        </LibreAVous_EmailToAFriend>
    </modules>
    <global>
        <events>
           <sendfriend_product>
                <observers>
                    <log_sending>
                        <type>singleton</type>
                        <class>LibreAVous_EmailToAFriend_Model_Observer</class>
                        <method>logSending</method>
                    </log_sending>
                </observers>
            </sendfriend_product>
    	</events>
    </global>
</config>

Tester le module

Afin de tester notre module, s’identifier en tant que client sur le front, se rendre sur la fiche d’un produit puis cliquer sur le lien « Email to a friend » pour remplir le formulaire suivant :

magento-send-to-a-friend-form

Une fois l’e-mail envoyé, consulter le message dans le fichier de log standard :

nico@laptop:/var/www/magento/var/log$ more system.log 
2009-05-28T20:34:18: a link to Barcelona Bamboo Platform Bed product was send

Conclusion

Lors d’un billet précédent, nous avons présenté la surcharge d’un bloc du backoffice afin d’en modifier le rendu. Dans certains cas, il sera possible de personnaliser Magento via une surcharge ou la création d’un observateur et l’on peut se poser la question du choix de la méthode à utiliser ?

Ceci dépend surtout du contexte, mais d’un point de vue général (et personnel :D ), on peut préconiser l’utilisation d’un observateur pour ajouter une logique spécifique au fonctionnement du coeur de Magento et réserver les surcharges à la modification ou au remplacement du fonctionnement standard.

Enfin, nous noterons la possibilité de lever nos propres événements lors de la création de modules pour faciliter l’ajout ultérieur de fonctionnalités :

Mage::dispatchEvent('identifiant_de_mon_evenement', array('arg1'=>argument));

Ressources complémentaires

Mots-clefs: ,

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="">