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

21 septembre 2010

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

Yannick Voyer # 22 septembre, 2010

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.

# 27 septembre, 2010 Jonathan Martin

Il existe ce site : nicksays.co.uk/magento_events_cheat_sheet/ qui liste un certain nombre d’ évènements Magento.

Cela peut servir ;-)

Steve # 7 décembre, 2010

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.

# 1 mars, 2011 christian

Merci pour votre contribution. Les tutorials sont tres compact.

ibou # 19 avril, 2011

Les tutos sont vraiment bien. Un grand MERCI !!!

# 13 mai, 2011 David M.

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 .

David M. # 13 mai, 2011

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 »

# 18 janvier, 2012 eddz

Sympa la métaphore et très bon tutoriel ;)

eddz # 19 janvier, 2012

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 !

# 19 janvier, 2012 Pierre FAY

Merci Eddz ;)

Olivier.D # 27 janvier, 2012

Merci !

# 29 mars, 2012 Zard

Merci pour ce tuto, il m’a été très utile pour comprendre les événements de Magento !

Guicara # 26 juillet, 2012

Merci pour ces tutoriels ;)

# 31 juillet, 2012 Vincent

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.

Marwa # 27 novembre, 2012

S.V.P comment tester cet observer ?

# 24 décembre, 2012 Pierre FAY

salut Marwa, tu peux lancer l’événement pour tester :) DispatchEvent :)

helloWorld # 17 décembre, 2013

super merci pour le tuto sur les events et observers :)

# 17 janvier, 2014 data-j@ck

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 !

Vous aussi donnez votre avis
(requis)



Expert magento sur Lille - Pierre FAY
Rechercher dans le site :