[MAGENTO] Liste des évènements
By Guillaume BRETOU on Thursday, March 18 2010, 23:16 - MAGENTO - Permalink
Dernièrement, j'ai été amené à travailler sur MAGENTO chez Sensio Labs pour le compte d'un gros client.
Ne connaissant rien à cette plate-forme, j'ai du tout apprendre sur le tas !
Personnellement, je trouve Magento intéressant dans la mesure où l'on peut déployer très rapidement un site de e-commerce. Le backend de l'application est très fourni et fourmille de fonctionnalités permettant de paramétrer son site.
Cependant, d'un point de vue développement, la courbe d'apprentissage est très élevée et il faut un peu de patience pour comprendre le fonctionnement du système. D'autant plus que les articles/tutoriaux ne sont pas légions sur Internet, ce qui est bien dommage.
J'écrirais donc dans ce blog quelques articles spécialement consacrés à Magento.
La toute première tâche que j'ai eu à réaliser était de déclencher une action lors de la sauvegarde d'un compte utilisateur.
Pour cela, il faut se tourner vers les évènements.
Voici la liste des évènements que l'on peut "hooker" (version 1.3).
Pour utiliser cet évènement, on va devoir surcharger le module customer de Magento.
Dans les bonnes pratiques, il est (fortement) conseillé de ne pas modifier le code de base de Magento. Il est en effet possible de surcharger les différents modules de base (que l'on peut voir dans app/code/core/Mage) et bien évidemment d'en créer des nouveaux.
Après avoir choisi un namespace (le nom de l'entreprise par exemple), il faut créer le répertoire dans app/code/
C'est dans ce répertoire que l'on mettra tout notre code perso, on NE touchera JAMAIS à app/code/core.
Maintenant que l'on a définit un nouveau namespace, il faut que Magento puisse le détecter.
On va donc créer un fichier [NAMESPACE]_All.xml
On va placer dans ce fichier tous les modules de notre namespace. Exemple de contenu :
Le code précédent permet d'activer le module [NAMESPACE]_Customer. Attention, vous devez configurer le namespace dans le backend de l'application.
Ensuite :
Le fichier etc/config.xml contient toute la configuration du module. C'est notamment dans ce fichier que l'on pourra déclarer les installers, les règles de réécriture, ...
En ce qui nous concerne, on doit juste préciser la version du module et l'évènement à utiliser.
Le code précèdent signifie que lors de l'évènement customer_save_after, la méthode afterCustomerSave de la classe Observer doit être exécutée.
Le code a exécuter doit se trouver dans app/code/local/[NAMESPACE]/Customer/Model/Observer.php.
Or le fichier Observer.php existe déjà dans app/code/core/Customer/Model, il faut donc le réécrire (noeud rewrite).
Il nous faut donc créer un répertoire Model avec un fichier Observer.php
Le fichier Observer.php contiendra le code suivant :
Maintenant, après la sauvegarde d'un client, votre code perso sera exécuté.
Attention : ne pas oublier de nettoyer le cache après chaque modification de fichiers XML (de même que certains templates).
Je proposerais par la suite d'autres articles sur Magento et son utilisation.
Ne connaissant rien à cette plate-forme, j'ai du tout apprendre sur le tas !
Personnellement, je trouve Magento intéressant dans la mesure où l'on peut déployer très rapidement un site de e-commerce. Le backend de l'application est très fourni et fourmille de fonctionnalités permettant de paramétrer son site.
Cependant, d'un point de vue développement, la courbe d'apprentissage est très élevée et il faut un peu de patience pour comprendre le fonctionnement du système. D'autant plus que les articles/tutoriaux ne sont pas légions sur Internet, ce qui est bien dommage.
J'écrirais donc dans ce blog quelques articles spécialement consacrés à Magento.
La toute première tâche que j'ai eu à réaliser était de déclencher une action lors de la sauvegarde d'un compte utilisateur.
Pour cela, il faut se tourner vers les évènements.
Voici la liste des évènements que l'on peut "hooker" (version 1.3).
Pour utiliser cet évènement, on va devoir surcharger le module customer de Magento.
Dans les bonnes pratiques, il est (fortement) conseillé de ne pas modifier le code de base de Magento. Il est en effet possible de surcharger les différents modules de base (que l'on peut voir dans app/code/core/Mage) et bien évidemment d'en créer des nouveaux.
Après avoir choisi un namespace (le nom de l'entreprise par exemple), il faut créer le répertoire dans app/code/
mkdir app/code/[NAMESPACE]C'est dans ce répertoire que l'on mettra tout notre code perso, on NE touchera JAMAIS à app/code/core.
Maintenant que l'on a définit un nouveau namespace, il faut que Magento puisse le détecter.
On va donc créer un fichier [NAMESPACE]_All.xml
touch /app/etc/modules/[NAMESPACE]_All.xmlOn va placer dans ce fichier tous les modules de notre namespace. Exemple de contenu :
<?xml version="1.0"?>
<config>
<modules>
<[NAMESPACE]_Customer>
<active>true</active>
<codePool>local</codePool>
</[NAMESPACE]_Customer>
</modules>
</config>Le code précédent permet d'activer le module [NAMESPACE]_Customer. Attention, vous devez configurer le namespace dans le backend de l'application.
Ensuite :
mkdir app/code/[NAMESPACE]/Customer
mkdir app/code/[NAMESPACE]/Customer/etc
touch app/code/[NAMESPACE]/Customer/etc/config.xmlLe fichier etc/config.xml contient toute la configuration du module. C'est notamment dans ce fichier que l'on pourra déclarer les installers, les règles de réécriture, ...
En ce qui nous concerne, on doit juste préciser la version du module et l'évènement à utiliser.
<?xml version="1.0"?>
<config>
<modules>
<[Namespace]_Customer>
<version>0.1.0</version>
</[Namespace]_Customer>
</modules>
<global>
<events>
<customer_save_after>
<observers>
<evian_customer>
<type>singleton</type>
<class>customer/observer</class>
<method>afterCustomerSave</method>
</evian_customer>
</observers>
</customer_save_after>
</events>
<models>
<customer>
<rewrite>
<observer>[NAMESPACE]_Customer_Model_Observer</observer>
</rewrite>
</customer>
</models>
</global>
</config>Le code précèdent signifie que lors de l'évènement customer_save_after, la méthode afterCustomerSave de la classe Observer doit être exécutée.
Le code a exécuter doit se trouver dans app/code/local/[NAMESPACE]/Customer/Model/Observer.php.
Or le fichier Observer.php existe déjà dans app/code/core/Customer/Model, il faut donc le réécrire (noeud rewrite).
Il nous faut donc créer un répertoire Model avec un fichier Observer.php
mkdir app/code/[NAMESPACE]/Customer/Model
touch app/code/[NAMESPACE]/Customer/Model/Observer.phpLe fichier Observer.php contiendra le code suivant :
class [NAMESPACE]_Customer_Model_Observer extends Mage_Customer_Model_Observer
{
public function afterCustomerSave(Varien_Event_Observer $observer)
{
//execute code here
}
}Maintenant, après la sauvegarde d'un client, votre code perso sera exécuté.
Attention : ne pas oublier de nettoyer le cache après chaque modification de fichiers XML (de même que certains templates).
Je proposerais par la suite d'autres articles sur Magento et son utilisation.
Comments
Bonjour
Nouveau sur Magento (Depuis 1 semaine), je cherche à maitriser les Observers.
Je veux juste pour l'instant afficher les informations d'un nouveau client inscrit (Ou modifié).
Votre tutoriel est très bien explicité mais il ne se passe absolument rien dans mon Magento lorsqu'un client est créé (Ni même une erreur)
PS : Avant de poster ce message, j'ai fait 2 jours de recherche et de tests en lisant et testant plusieurs tutoriels (qui ne fonctionnent pas non plus)
Environnement de test :
- Windows XP avec Easy PHP 2.0
- Magento 4.1 en français
Petite Question :
Comment exécuter ceci : "Attention, vous devez configurer le namespace dans le backend de l'application"
Voici mes fichiers : (NAMESPACE=Sphinx dans mon cas)
/app/etc/modules/Sphinx_All.xml
---------------------------------------
<?xml version="1.0"?>
<config>
<modules>
<Sphinx_Customer>
<active>true</active>
<codePool>local</codePool>
</Sphinx_Customer>
</modules>
</config>
Fichier /app/code/local/Sphinx/Customer/etc/config.xml
---------------------------------------------------------------
<?xml version="1.0"?>
<config>
<modules>
<Sphinx_Customer>
<version>0.1.0</version>
</Sphinx_Customer>
</modules>
<globals>
<events>
<customer_save_after>
<observers>
<evian_customer>
<type>singleton</type>
<class>customer/observer</class>
<method>afterCustomerSave</method>
</evian_customer>
</observers>
</customer_save_after>
</events>
<models>
<customer>
<rewrite>
<observer>Sphinx_Customer_Model_Observer</observer>
</rewrite>
</customer>
</models>
</globals>
</config>
Fichier /app/code/local/Sphinx/Customer/Model/Observer.php
------------------------------------------------------------
<?php
class Sphinx_Customer_Model_Observer extends Mage_Customer_Model_Observer
{
public function afterCustomerSave(Varien_Event_Observer $Observer)
{
echo "<h1>app/code/local/Sphinx/Customer/Model/Observer.php</h1> ";
echo "<pre> ";
$Customer = $Observer->getCustomer();
echo "<h2>Observer</h2> ";
print_r($Observer);
echo "<h2>Customer</h2> ";
print_r($Customer);
echo "</pre> ";
die('FIN !');
}
}
Merci beaucoup par avance
Cordialement
Bonjour,
Dommage que l'indentation du XML ait sauté XD
Pour votre problème :
- Avez-vous bien nettoyé votre cache ? Dès que du XML est modifié, il faut le nettoyer.
- Si oui, Etes-vous sur que votre classe est bien chargée ? Je vous propose de faire un petit test : mettez l'instruction die('test'); au début du fichier Observer.php
Si vous ne voyez pas la chaine test s'afficher, c'est que la classe n'est pas chargée et donc qu'il y a un problème dans la configuration.
Tenez moi au courant.
Bonsoir
Je viens de résoudre le problème :
Il faut remplacer
<globals>
...
<globals>
par
<global>
...
<global>
en fait retirer le 's' de globals
Cordialement
Effectivement, c'est bien "global".
Je met à jour le code.
Bonjour,
Le lien de la liste des évènements est mort...
Merci @superfly,
je n'arrive pas à retrouver une liste d'évènements pour Magento 1.3.
Dorénavant, je vous propose d'utiliser cette méthode pour retrouver les évènements :
http://www.edmondscommerce.co.uk/ma...