Guide Magento Developpeur (Leçon 11) – Les Events et les Observers dans Magento

Ce tutoriel est le 11eme d’une longue série, si vous ne l’avez pas déjà fait je vous conseille de lire les tutoriels en commençant par le sommaire de cette série.

Aujourd’hui, on va voir une nouvelle façon de modifier un des comportements de base de Magento à l’aide des Evénements et des Observeurs. Cette façon de programmer est un standard en développement informatique que je vous conseille vivement de bien maitriser.

1- Un peu de théorie….

Cette méthode de programmation est ce qu’on appelle un « patron de conception », en quoi ca consiste ?
Déjà, commençons par définir deux termes :

Un Evénement :
On peut considérer un événement comme une sorte de drapeau qui se lève lors qu’une situation précise arrive par exemple quand l’utilisateur appuie sur le bouton « payer » de votre site internet, c’est un événement. Votre commande à bien été enregistré ? Ici aussi c’est un événement. Etc…

Un Observeur :
Un Observeur est aussi appelé « écouteur ». Il va écouter votre programme pour détecter des événements. Quand il y aura un événement qui aura lieu, il va exécuter une action.

Un petit exemple : Le voisin et vous !

Mettons nous en situation, vous êtes chez vous et vous organisez une soirée…vous commencez la soirée et tout ce déroule bien, puis a un moment donné, un de vos ami ayant un peu trop bu commence a chanter fort dans le jardin

Votre voisin, n’a jamais eu d’ami et il reste tout le temps chez lui (…il est peu être informaticien xD !!) et il n’a rien à faire de mieux de sa vie que d’attendre que vous fassiez un peu trop de bruit pour pouvoir appeler la police (pour tapage nocturne)…c’est comme ca qu’il s’amuse ca lui passe le temps (il faut de tout pour faire un monde).

Bref, on connaît tous cette situation. Maintenant dans cette histoire, un de vos amis fait trop de bruit, « faire trop de bruit » ici c’est l’événement.
L’observer, c’est votre voisin, et il observe quoi ? Si vous faites trop de bruit. Et il fera comme action quand l’événement se déclenche : appeler la police !

Avec ce super exemple (dans lequel je ne parle pas de fait réel…surtout pas de ma voisine), vous avez compris le principe j’espère ! Maintenant passons un peu à la pratique et basculons sur notre CMS e-commerce préféré…Magento !

2- Créer un observeur

Un observeur sous magento se met dans le repertoire Model de votre module et étend la classe Varien_Event_Observer (classe qui je pense est explicite…), allez donc dans /app/code/local/Pfay/Test/Model/ et créez votre fichier Observer.php

<?php
class Pfay_Test_Model_Observer extends Varien_Event_Observer
{
   public function __construct()
   {
   }
   public function saveCmsPageObserve($observer)
   {
         $event = $observer->getEvent(); 	$model = $event->getPage();
	 print_r($model->getData());
         die('test');
 }
}
?>

Ici on crée un Observeur avec une fonction saveCmsPageObserve, cette fonction c’est la méthode qui sera exécutée quand une page CMS sera sauvegardé dans l’administration de Magento.

Dans notre exemple on arrête le programme pour afficher un message mais en vrai a la place du die(), vous allez créer un traitement pour enregistrer des infos supplémentaires sur votre page dans une autre table par exemple.

Je pense que je n’ai pas besoin de vous faire d’explication sur ce petit code, je récupère l’événement a l’aide de la méthode GetEvent sur l’observer qu’on passe en paramètre de la méthode (le paramètre est envoyé automatiquement à la méthode). Ensuite a partir de l’événement, a partir de la méthode getPage() je récupère ma page cms puis j’affiche son contenu avec le print_r et le getData comme d’habitude.

3- On fait en sorte que l’observeur soit pris en compte dans Magento

Maintenant on a créé notre Observeur, il faut que Magento le prenne ne compte, comment on fait ? …11ème tutoriel, si vous n’avez pas une petite idée je vous conseille vivement de vous pendre…muahahaha recommencer cette série de tutoriel depuis le début car je pense que vous n’avez pas encore bien compris les principes de développement de Magento.

Effectivement vous l’avez compris on va éditer le fichier config.xml de notre module. Ouvrez donc le fichier : /app/code/local/Pfay/Test/etc/config.xml
Et dans <global> , après </models> ou après </blocks> rajoutez :

<events>
   <cms_page_prepare_save>
	<observers>
	   <Pfay_Exemple_Model_Observer>
	       <type>singleton</type>
	       <class>exemple/observer</class>
	       <method> saveCmsPageObserve</method>
           </ Pfay_Exemple_Model_Observer>
       </observers>
  </cms_page_prepare_save>
</events>

Quelques petites explications sont ici nécessaires :

La balise :

 <cms_page_prepare_save> 

Représente l’événement a surveillé, dans notre exemple votre voisin attendait que vous fassiez trop de bruit pour pouvoir lancer son action (appeler les flics). Ici on attend l’action cms_page_prepare_save pour lancer notre action saveCmsPageObserve).

La suite parait logique :

    <observers>
	  <Pfay_Exemple_Model_Observer>
	 <type>singleton</type>
	 <class>exemple/observer</class>
	 <method> saveCmsPageObserve</method>
         </ Pfay_Exemple_Model_Observer>
    </observers>

On défini la classe observer qu’on va utiliser quand cette méthode sera appelé avec le type, la classe et la méthode à utiliser.

Ok Ok j’ai bien compris mais comment on sait que c’est l’événement cms_page_prepare_save qui est utilisé ?

Ce n’est pas compliqué, en fait on va voir dans le fichier du core, on ouvre le fichier : \app\code\core\Mage\Adminhtml\controllers\Cms\PageController.php on voit dans la méthode saveAction() la ligne suivante :

	  Mage::dispatchEvent('cms_page_prepare_save', array('page' => $model, 'request' => $this->getRequest()));

C’est en faisant dispatchEvent qu’on génère l’événement dans notre programme.
Grâce à cette ligne on sait que l’événement s’appelle : cms_page_prepare_save et qu’on lui passe un tableau avec un objet page qui contient le model et un objet request, ils pourront être récupéré dans votre méthode de votre observer grâce aux fonctions getPage() et getRequest().

Et voilà, je pense qu’on a fait le tour. Vous pouvez maintenant vous amuser avec les events et les observers sous Magento.

Laissez un commentaire pour me faire plaisir ou pour poser une question et si vous avez aimé cet article aidez moi en partageant un lien vers cet article sur votre blog, votre page facebook ou sur twitter.

Retrouvez le sommaire de ce tutoriel

Posted in Magento and tagged , , , , , , , .


18 Comments

  1. Bravo pour tes tutoriels, ils m’ont vraiment aidés à avancer. Je me demandais quel est la différence entre les balises (« global », « frontend » et « adminhtml ») en ce qui a trait aux observeurs.

  2. Bonjour,
    dans le code
    « Pfay_Exemple_Model_Observer » est à remplacer par « Pfay_Test_Model_Observer » et la class « exemple/observer » par
    « test/observer ».
    En effet, nous somme toujours dans le module « test ».

    A noter, dans le point 3 avant le code
    « Ouvrez donc le fichier : /app/code/local/Pfay/Test/etc/config.xml
    Et dans , après ou après rajoutez : »
    il faut lire
    « Et dans Global, après blocks, models ou ressources rajoutez : ».
    Un problème de balise.

  3. Salut,

    Sympa le tuto et merci beaucoup de passages m’ont aidé à bien comprendre le fonctionnement de Magento. Je voulais juste savoir pour les Observers comment on procède si on veut executer 2 méthodes à l’appel d’un evènement, est ce que cette synthaxe est bonne :

    singleton
    exemple/observer
    saveCmsPageObserve
    ma2emeMethodeAExecuter

    Merci de votre réponse .

  4. Mon code ne s’est pas bien écris je voulais dire :

    « observers»
    « Pfay_Exemple_Model_Observer»
    « type» singleton « /type»
    «class» exemple/observer« / class»
    « method » saveCmsPageObserve « /method»
    « method » ma2emeMethodeAExecuter« /method»
    « / Pfay_Exemple_Model_Observer »
    « / observers »

  5. Fichier config.xml erroné !!!

    Si vous avez rencontré tout comme moi des problèmes, remplacez config.xml

    Magento ver. 1.6.1.0

    Merci pour ce tutoriel Pierre !

  6. Je sais qu’il s’agit d’un exemple mais pour la compréhension : l’évènement est déclenché dans le saveAction avant le save du model donc une interruption (die) ou plus généralement une erreur dans votre observer empêchera l’enregistrement des modifications de la page en base. Il est donc à mon avis tout le temps indispensable de se référer aux ligne qui déclenche l’event pour être sur des trucs à faire ou non dans l’observer.

    A titre d’information, si on souhaite ajouter un Event du style « cms_page_end_save » qui serait lancer après le save, on ne peut pas le faire direct dans le core (car c’est pas bien), on doit forcement passer par une surcharge du controller PageController et de la fonction saveAction ?

    Du coup, une autre question plus général au développement sous Magento, si un module perso doit surcharger un controller générique (du core) et que celui-ci est mis à jour via un update Magento, a t’on moyen de le savoir (à part relire tous les fichiers mis à jour par la nouvelle version pour vérifier les interférences éventuels avec son code perso) ?

    Merci davance.

  7. Super merci.

    Y a plus qu’à trouver une utilisation concrète pour s’amuser un peu avec.
    Genre notification de connexion à l’administration avec récupération d’adresse IP et touti cuanti ( j’imagine qu’il doit y avoir un observer pour les connexion :p )

    Merci Pierre Fay ! Continue !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>