magento-101

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 :

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

Les surcharges dans Magento
Taggé sur :                    

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Nous utilisons des cookies afin de nous assurer de vous proposer la meilleure expérience sur ce site.
Ok