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 :
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 :
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(); } } }
Commentez cet article Manipuler les events et observers