Manipuler les events et observers

  • Par Magentix le 15/09/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();
                }
        }
}
6

Commentez cet article Manipuler les events et observers

Fouz Le 20/06/2010 à 23:44
Super!
Merci pour cet exemple minimaliste sans fioritures.
#1
Fekih Le 20/06/2010 à 23:44
Great tutorial, simple and clear.
#2
Thomas Le 03/09/2010 à 18:01
Et si l'utilisateur supprime le 1er produit ajouté, une fois que le cadeau est dans le panier ?
#3
Eric Le 09/11/2010 à 23:15
On peut désactiver un mode de paiement (par exemple chèque) si le prix est en dessous de 10€ par exemple ?
#4
Mordikkuss Le 21/12/2010 à 11:28
Merci pour ce petit exemple, testé et approuvé ; serait-il possible de spécifier ce type d'observer pour un site web et seulement un site web, lorsque la configuration de notre magento est en multisite / Multistore ?

bien à vous ;)
#5
Tchoupi Le 03/02/2011 à 17:24
Bonjour,
Un grand merci pour l'ensemble de votre travail.

Je viens d'intégrer votre module ci-dessus et je pour que le cadeau soit bien ajouté, je dois modifier
$cart = Mage::getSingleton('checkout/cart');
par
$cart = Mage::getModel('checkout/cart');


je test avec une 1.4.2.0
Avez-vous une explication ?
Merci d'avance
#6
Rédiger un commentaire

Cliquez pour générer un nouveau code

* champs obligatoires