Lorsqu’une fonctionnalité native de Magento ne correspond pas tout à fait à ce que l’on souhaite, nous pouvons utiliser la surcharge de classes pour réécrire ces fonctions en conséquence.
Il existe plusieurs types de surcharges et voici un petit sommaire pour accéder à la catégorie dont vous avez besoin :
- Surcharger un block Magento
- Surcharger un model Magento
- Surcharger un ressource model Magento
- Surcharger un Helper Magento
- Surcharger un controller Magento et changer son URL
- Surcharger un controller Magento sans changer son URL
Il est important de vérifier avant de surcharger un élément de votre site que l’un des modules installé sur celui-ci ne surcharge déjà pas la classe désirée. En effet, Magento ne gère pas les règles rewrite multiples. Dans ce cas, il faudra faire une seule règle rewrite, et s’assurer que la classe 2 hérite de la classe 1 qui héritera elle même de la classe de base.
Une autre solution est de modifier l’implémentation du module qui surcharge déjà votre classe. (A éviter car si votre module est mis à jour, votre modification peut-être supprimée)
I – Surcharger un block Magento
Pour surcharger un block, prenons par exemple le block app/core/Mage/Catalog/Block/Product/List.php, il vous faudra créer un module (ou utiliser un module pour toutes vos surcharges) contenant ces fichiers :
app/etc/modules/Mypackage_Mymodule.xml
app/code/local/Mypackage/Mymodule/etc/config.xml
app/code/local/Mypackage/Mymodule/Block/Product/List.php
Le 1er fichier va vous permettre de déclarer et d’activer votre module (procédure classique), si vous avez déjà un module où stocker vos surcharges, vous n’aurez pas besoin de cette étape
Le second fichier va définir quel block surcharger et quelle sera la classe appelée pour la surcharge :
<config> <global> <blocks> <mymodule> <class>Mypackage_Mymodule_Block</class> </mymodule> <catalog> <rewrite> <product_list>Mypackage_Mymodule_Block_Product_List</product_list> </rewrite> </catalog> </blocks> </global> </config>
Le dernier fichier vous permettra de surcharge la fonction désirée :
<?php Class Mypackage_Mymodule_Block_Product_List extends Mage_Catalog_Block_Product_List{ // Function to override protected function _getProductCollection(){ //your custom code } }
II – Surcharger un modèle Magento
Pour surcharger un modèle, prenons par exemple le modèle app/code/core/Mage/Catalog/Model/Product.php
Il vous faudra utiliser un module de ce type :
app/etc/modules/Mypackage_Mymodule.xml
app/code/local/Mypackage/Mymodule/etc/config.xml
app/code/local/Mypackage/Mymodule/Model/Catalog/Product.php
Le 1er fichier va vous permettre de déclarer et d’activer votre module (procédure classique), si vous avez déjà un module où stocker vos surcharges, vous n’aurez pas besoin de cette étape
Le second fichier va définir quel modèle surcharger et quelle sera la classe appelée pour la surcharge :
<config> <global> <models> <catalog> <rewrite> <product_list>Mypackage_Mymodule_Model_Catalog_Product</product_list> </rewrite> </catalog> </models> </global> </config>
Le dernier fichier vous permettra de surcharge la fonction désirée :
<?php class Mypackage_Mymodule_Model_Catalog_Product extends Mage_Catalog_Model_Product { // Function to override public function isSalable(){ //your custom code } }
III – Surcharger un ressource model Magento
Pour surcharger un ressource modèle, prenons par exemple la classe app/code/core/Mage/Catalog/Model/Resource/Eav/Mysql4/Attribute.php
Il vous faudra utiliser un module de ce type :
app/etc/modules/Mypackage_Mymodule.xml
app/code/local/Mypackage/Mymodule/etc/config.xml
app/code/local/Mypackage/Mymodule/Model/Catalog/Resource/Eav/Mysql4/Attribute.php
Le 1er fichier va vous permettre de déclarer et d’activer votre module (procédure classique), si vous avez déjà un module où stocker vos surcharges, vous n’aurez pas besoin de cette étape
Le second fichier va définir quel modèle surcharger et quelle sera la classe appelée pour la surcharge :
<config> <global> <models> <catalog_resource_eav_mysql4> <rewrite> <attribute>Mypackage_Mymodule_Model_Catalog_Resource_Eav_Mysql4_Attribute</attribute> </rewrite> <catalog_resource_eav_mysql4> </models> </global> </config>
Le dernier fichier vous permettra de surcharger la fonction désirée :
<?php class Mypackage_Mymodule_Model_Catalog_Resource_Eav_Mysql4_Attribute extends Mage_Catalog_Model_Resource_Eav_Mysql4_Attribute { // Function to override protected function _beforeSave(Mage_Core_Model_Abstract $object){ //your custom code } }
IV – Surcharger un helper Magento
Pour surcharger un helper, prenons par exemple la classe app/code/core/Mage/Catalog/Helper/Data.php
Il vous faudra utiliser un module de ce type :
app/etc/modules/Mypackage_Mymodule.xml
app/code/local/Mypackage/Mymodule/etc/config.xml
app/code/local/Mypackage/Mymodule/Helper/Catalog/Data.php
Le 1er fichier va vous permettre de déclarer et d’activer votre module (procédure classique), si vous avez déjà un module où stocker vos surcharges, vous n’aurez pas besoin de cette étape
Le second fichier va définir quel modèle surcharger et quelle sera la classe appelée pour la surcharge :
<config> <global> <helpers> <catalog> <rewrite> <data>Mypackage_Mymodule_Helper_Catalog_Data</data> </rewrite> </catalog> </helpers> </global> </config>
Le dernier fichier vous permettra de surcharger la fonction désirée :
<?php class Mypackage_Mymodule_Helper_Catalog_Data extends Mage_Catalog_Helper_Data { // Function to override public function getBreadcrumbPath(){ //your custom code } }
V – Surcharger un controller Magento et changer son URL
Pour surcharger un controller, prenons par exemple la classe app/code/core/Mage/Checkout/controllers/CartController.php
Il vous faudra utiliser un module de ce type :
app/etc/modules/Mypackage_Mymodule.xml
app/code/local/Mypackage/Mymodule/etc/config.xml
app/code/local/Mypackage/Mymodule/controllers/Checkout/CartController.php
Le 1er fichier va vous permettre de déclarer et d’activer votre module (procédure classique), si vous avez déjà un module où stocker vos surcharges, vous n’aurez pas besoin de cette étape
Le second fichier va définir quel modèle surcharger et quelle sera la classe appelée pour la surcharge :
<?xml version="1.0"?> <config> <modules> <Mypackage_Mymodule> <version>0.1.0</version> </Mypackage_Mymodule> </modules> <global> <rewrite> <mypackage_mymodule_checkout_cart> <!-- OLD URL TO REPLACE --> <from><![CDATA[#^/checkout/cart/#]]></from> <!-- NEW URL REPLACED --> <!-- mymodule = frontName XML node value ! --> <!-- checkout = because our class is in the folder "Checkout" --> <!-- cart = because our file is named "CartController.php" --> <to>/mymodule/ckeckout_cart/</to> </mypackage_mymodule_checkout_cart> </rewrite> </global> <frontend> <routers> <MyPackage_Mymodule> <use>standard</use> <args> <module>MyPackage_Mymodule</module> <frontName>mymodule</frontName> <!-- This name is used for the new URL --> </args> </MyPackage_Mymodule> </routers> </frontend> </config>
Notez que si vous désirez surcharger un controller de l’admin, il ne faut pas utiliser la balise <frontend> mais la balise <adminhtml>
Le dernier fichier vous permettra de surcharger la fonction désirée :
<?php require_once 'Mage/Checkout/controllers/CartController.php'; // This line is very very very important ! class Mypackage_Mymodule_Checkout_CartController extends Mage_Checkout_CartController { /** * Shopping cart display action */ public function indexAction() { // Your modifications here } }
VI – Surcharger un controller Magento sans changer son URL
Dans notre exemple nous allons surcharger le controller du module Mage_Api, l’url « /api/xmlrpc » pour être exact.
Voici ce qu’il faut renseigner dans le XML de votre module :
<routers> <api> <args> <module> <mypackage_mymodule before="Mage_Api">Mypackage_Mymodule</mypackage_mymodule> </module> </args> </api> </routers>
Et créez la classe dans le dossier « controllers » de votre module :
<?php require_once(Mage::getModuleDir('controllers','Mage_Api').DS.'XmlrpcController.php'); class Mypackage_Mymodule_XmlrpcController extends Mage_Api_XmlrpcController { public function indexAction() { // Votre surcharge } } // Class Mage_Api_XmlrpcController End
En appelant l’URL native de Magento, l’appel passera désormais par votre module