Manipuler les events et observers

  • De le 15 septembre 2009
  • Difficulté : 2/4

Manipuler les events et observers Un simple exemple suffit à démontrer la toute puissance et la facilité d'intégration des observers sous Magento, un gain de temps considérable dans les développements et aucune limite !

Le principe d'un observer est simple : lorsqu'un événement se produit (ajout d'un produit au panier, nouvelle commande, initiation d'une session...), on exécute alors une ou plusieurs actions selon ses besoins.

Les Observers ont l'énorme avantage par rapport aux surcharges d'éviter les conflits... Ils facilitent de plus grandement les mises à jour. Ajouter un observer est d'une facilité déconcertante.

Imaginons par exemple que nous voulions insérer un produit "cadeau" (dont le prix serait à 0) au panier si le prix d'un produit ajouté est supérieur à 100 €.

L'architecture du module est extrêmement simple :

  • app/code/local/Magentix/FreeGift/etc/
  • config.xml
  • app/code/local/Magentix/FreeGift/Model/
  • Observer.php
  • app/etc/modules/
  • Magentix_FreeGift.xml

Déclarons dans un premier temps le nouveau module à Magento :

app/etc/modules/Magentix_FreeGift.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Magentix_FreeGift>
            <active>true</active>
            <codePool>local</codePool>
        </Magentix_FreeGift>
    </modules>
</config> 

Magento a intégré une centaine d'événements différents, la liste complète (1.2.0.2) est disponible depuis le lien suivant : magento_events_v1.2.0.2.xls.

Pour notre module, notre action se produit lorsqu'un produit est ajouté au panier, l'événement qui nous intéresse est donc checkout_cart_add_product_complete.

Éditons alors notre fichier de configuration :

app/code/local/Magentix/FreeGift/etc/config.xml

<?xml version="1.0"?>
<config>
        <modules>
                <Magentix_FreeGift>
                        <version>0.1</version>
                </Magentix_FreeGift>
        </modules>
        <global>
                <models>
                        <freegift>
                                <class>Magentix_FreeGift_Model</class>
                        </freegift>
                </models>
                <events>
                        <checkout_cart_add_product_complete>
                                <observers>
                                        <magentix_freegift_observer>
                                                <type>singleton</type>
                                                <class>freegift/observer</class>
                                                <method>add_gift</method>
                                        </magentix_freegift_observer>
                                </observers>
                        </checkout_cart_add_product_complete>
                </events>
        </global>
</config>

On y fait figurer le nom de classe de notre modèle ainsi que le nom de la méthode à exécuter lorsque l'événement souhaité se produit. La méthode est ici nommée add_gift.

Il ne nous reste plus qu'à écrire la méthode de la classe Magentix_FreeGift_Model_Observer, exécutant les actions suivantes :

  • Récupération du produit nouvellement ajouté
  • Déclaration du produit "cadeau" selon son ID
  • Ajout du deuxième produit au panier si le prix du produit ajouté est supérieur à 100

app/code/local/Magentix/FreeGift/Model/Observer.php

<?php

class Magentix_FreeGift_Model_Observer {

        private $_gift = 3;
        private $_amount = 100;

        public function add_gift($observer) {

                $product = $observer->getEvent()->getProduct();
                
                $gift = Mage::getModel('catalog/product')
                        ->setStoreId(Mage::app()->getStore()->getId())
                        ->load($this->_gift);
                        
                $cart = Mage::getSingleton('checkout/cart');
                
                if($product->getPrice() > $this->_amount) {
                        $cart->addProduct($gift,1);
                        $cart->save();
                }
        }
}
commentaires

Commentez cet article : Manipuler les events et observers