Les Events et les Observers dans Magento

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 sur les events et les observer.

Cette méthode de programmation est ce qu’on appelle un « design patern », c'est une des grosses bases en développement que vous retrouverez réguliérement. 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, aussi appelé « écouteur », 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 que vous lui aurez défini.

Un petit exemple : Le voisine 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 à chanter fort dans le jardin Votre voisine, n’a jamais eu d’ami de sa vie, elle reste tout le temps chez elle (…elle est peu être informaticienne xD !!) et malheureusement...pas sourde ! Elle 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…c’est comme ca qu’elle s’amuse, ca lui permet de passer 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 voisine, et elle observe quoi ? Si vous faites trop de bruit (l'événement). Et elle 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, ni d'allusion à une de mes dernieres soirées...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/Films/Model/ et créez votre fichier Observer.php

class Pfay_Films_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 faites ce que vous voulez.

Je pense que je n’ai pas besoin de vous faire d’explication sur ce petit code, je récupère l’événement à 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 à partir de l’événement, à 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- Faire en sorte que l’observer soit pris en compte dans Magento

Maintenant qu'on a créé notre Observeur, il faut que Magento le prenne en 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 sous Magento. Effectivement vous l’avez compris on va éditer le fichier config.xml de notre module pour déclarer notre Observer. Ouvrez donc votre fichier : /app/code/local/Pfay/Films/etc/config.xml Et dans <global> , après </models> ou après </blocks> rajoutez :

<events>
   <cms_page_prepare_save>
	<observers>
	   <Pfay_Films_Model_Observer>
	       <type>singleton</type>
	       <class>pfay_films/observer</class>
	       <method> saveCmsPageObserve</method>
           </ Pfay_Films_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 été 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 méthode saveCmsPageObserve). La suite parait logique :

	<observers>
	   <Pfay_Films_Model_Observer>
	       <type>singleton</type>
	       <class>pfay_films/observer</class>
	       <method> saveCmsPageObserve</method>
           </ Pfay_Films_Model_Observer>
       </observers>

On défini ci dessus, la classe observer qu’on va utiliser en précisant : - l'événement sur lequel cette méthode sera appelée - le type (ici Singleton) - le chemin vers la classe Observer du model. - la méthode à utiliser pour cet Observeur. 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 et 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 déclenche 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 et un objet request, ils pourront être récupérés 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.

N'hésitez pas à poser vos questions et à télécharger le code pour le comparer avec le votre si besoin.
Documents disponibles pour cet article :
Les livres qui peuvent vous aider :
  • Livre Magento Developer's Guide by Alan Mc Gregor
  • Livre Magento Performance Optimization
  • Livre Grokking Magento Vinai
Questions sur cette leçon
Pas de questions pour cette leçon. Soyez le premier !

Vous devez etre connecté pour demander de l'aide sur une leçon.