Surcharger le core

Surcharger un block

Nous allons déclarer une surcharge dans le fichier config.xml de notre module Formation_Test, dans le noeud blocks :

<global>
    <blocks>
        <catalog> <!-- Noeud utilisé pour la déclaration des blocks dans le config.xml du module Mage_Catalog -->
            <rewrite>
                <product_list>Formation_Test_Block_Override_Catalog_Product_List</product_list>
            </rewrite>
        </catalog>
    </blocks>
</global>

Ici, nous indiquons que notre classe Formation_Test_Block_Override_Catalog_Product_List va surcharger le block catalog/product_list, soit Mage_Catalog_Block_Product_List. Notre classe devra donc l'étendre.

Nous allons par exemple surcharger la fonction getLoadedProductCollection() qui permet d'afficher les produits dans les catégories.

<?php
class Formation_Test_Block_Override_Catalog_Product_List extends Mage_Catalog_Block_Product_List {
    /**
     * Rewrite modification: ...
     */
    public function getLoadedProductCollection() {
        // Retourner une collection de produit n'étant composée que du produit ayant l'id 1
    }
}

Surcharger un helper ou un model

La méthode est exactement la même que pour surcharger un block.

Nous allons par exemple surcharger le model catalog/product en lui ajoutant une fonction helloWorld().

Charger un produit avec un load, et afficher le résultat de cette fonction dans le content de la page d'accueil.

Dans la pratique, nous éviterons au maximum de surcharger les models classiques de Magento. En effet, ils sont utilisés partout et cela pourrait créer des conflit avec d'autres extensions.

Surcharger un controller

La syntaxe est un peu différente pour surcharger un controller :

<config>
    <frontend>
        <routers>
            <checkout> <!-- Noeud utilisé pour déclarer la route (et non le frontName) -->
                <args>
                    <modules>
                        <!-- Nous indiquons ici dans quel dossier trouver la même architecture de controllers -->
                        <Formation_Test before="Mage_Checkout">Formation_Test_Override_Checkout</Formation_Test>
                    </modules>
                </args>
            </checkout>
        </routers>
    </frontend>
</config>

Attention, il faut utiliser l'instruction require_once pour inclure le fichier que l'on surcharge. En effet, les classes des controllers ne sont pas chargées par l'autoloader, à la différence des blocks, models et helpers.

<?php
require_once(Mage::getModuleDir('controllers','Mage_Checkout') . DS . 'CartController.php');

class Formation_Test_Override_Checkout_CartController extends Mage_Checkout_CartController {
    /**
     * Rewrite modification: disable checkout cart
     */
    public function indexAction() {
        // Rediriger vers la page d'accueil en indiquant que le panier est désactivé
    }
}