Utilisation des events et des observers

Un observer est une classe qui va exécuter une fonction lorsqu'un event est déclenché.

Un event est déclenché via la fonction Mage::dispatchEvent('nom_de_levent');

Syntaxe de déclaration d'un observer

Les observers sont déclarés dans le config.xml de notre module :

<frontend>
    <events>
        <customer_login> <!-- Nom de l'event -->
            <observers>
                <formation_test_customer_login> <!-- Nom de notre observer -->
                    <type>singleton</type> <!-- On pourrait ici mettre disabled pour désactiver un observer -->
                    <class>formation_test/observer</class> <!-- Classe Formation_Test_Model_Observer.php -->
                    <method>customerLogin</method> <!-- Méthode de la classe ci-dessus à appeler -->
                </formation_test_customer_login>
            </observers>
        </customer_login>
    </events>
</frontend>

Création de l'observer

Nous allons donc créer notre classe Formation_Test_Model_Observer :

<?php

class Formation_Test_Model_Observer {
    /**
     * Change customer name on login
     *
     * @event customer_login
     **/
    public function customerLogin($observer) {
        $event = $observer->getEvent();
        $customer = $event->getCustomer();

        $customer->setName(time());
        $customer->save();
    }
}

À chaque login client, nous allons changer son nom.

Trouver le nom de l'event

Il y a plusieurs méthodes pour trouver le nom d'un event :

  • Aller dans le code à l'endroit où vous voulez intervenir et regarder s'il y a un appel à la fonction Mage::dispatchEvent()
  • Trouver la liste de tous les events Magento et chercher celui qui pourrait correspondre
  • Faire un log dans la fonction dispatchEvent() du fichier app/Mage.php et regarder celui qui pourrait correspondre

Liste des events : http://rabee.me/2014/06/06/Magento-Events-Cheat-Sheet-1-9/

Les event magiques

Il existe pour chaque models des observers magiques sur les fonctions load, save et delete. Ils sont visibles dans la classe Mage_Core_Model_Abstract. Idem pour les fonction preDispatch et postDispatch des controllers, qui sont visibles dans la classe Mage_Core_Controller_Varien_Action.

TP - Le site ne doit être accessible qu'aux clients connectés

En utilisant un observer, faire en sorte de rediriger toutes les pages vers le formulaire de login si le client n'est pas connecté.

  • Nous utiliserons l'event magique sur le preDispatch
  • Attention, il ne faut pas que cet observer se déclenche si nous sommes sur la page de login et sur la page de post login
    • Utiliser les fonctions
      Mage::app()->getRequest()->getControllerName();
      Mage::app()->getRequest()->getActionName();
      Mage::app()->getRequest()->getRouteName();
      Mage::app()->getRequest()->getModuleName();