Best practice

Magento – Utiliser un module local de surcharge

Derrière le terme « module local de surcharge » se cache l’idée suivante : comment s’affranchir de l’utilisation de app/code/local/Mage pour modifier le Core de Magento. Sacrilège ? Peut-être pas.

Quelques inconvénients de app/code/local/Mage

    • Ne permet que la surcharge de classes PHP
    • Peut entrer en conflit avec certains modules utilisant également app/code/local/Mage
    • Il est nécessaire de surcharger la totalité de la classe, même pour modifier une ligne. Ce n’est ni élégant ni facile à maintenir en cas de mise-à-jour de cette classe dans le Core.

La mise en place d’un module local de surcharge repose sur ce concept technique : créer un module qui utilisera et centralisera des rewrite afin d’étendre des classes Core plutôt que de les écraser.

Quelques avantages du module local de surcharge

      • Permet d’étendre les classes Core plutôt que de les écraser. On peut ainsi n’éditer qu’une méthode plutôt que la classe entière.
      • On peut donc faire appel à parent:: pour utiliser les méthodes de la classe Core surchargée et ainsi alléger le code des méthodes réécrites.
      • Ne limite pas les modifications du « comportement Core » de Magento aux classes PHP. Grâce au fichier config.xml du module local de surcharge, on peut intervenir sur une palette plus large d’éléments comme le menu en back-office par exemple (voir Cacher des éléments du menu de navigation en back-office).
      • Permet de gagner efficacité pour le debugging et les conflits inter-modules.

A noter 1 : les seuls fichiers qui doivent toujours être placés dans app/code/local/Mage sont les classes d’abstraction car, à notre connaissance, Magento n’offre pas la possibilité d’utiliser rewrite pour celles-ci. Si vous tenez à surcharger les classes d’abstraction cette lecture peut vous intéresser.

A noter 2 : bien que le module local de surcharge offre une option intéressante pour modifier le Core, il reste préférable d’éviter de le faire (si possible) ; que ce soit par des rewrite ou par app/code/local/Mage. On préférera les observers.

Créer le module local de surcharge

Dans cet exemple, nous utilisons un module appelé Soon_MageOverload.

Déclarer le module

Fichier app/etc/modules/Soon_MageOverload.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Soon_MageOverload>
            <active>true</active>
            <codePool>local</codePool>
        </Soon_MageOverload>
    </modules>
</config>

Configuration initiale du module

Fichier app/code/local/Soon/MageOverload/etc/config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Soon_MageOverload>
        <version>0.1.0</version>
        </Soon_MageOverload>
    </modules> 
</config>

Et voilà ! Notre module est prêt à accueillir les modifications faites au Core.

Exemple : ajouter un commentaire dans le code HTML Google Analytics

Veillez à ce que la configuration soit correcte en back-office. Dans notre exemple, nous utilisons l’identifiant UA-0000000-0.

 

Editer config.xml du module local de surcharge

Dans notre exemple, nous allons surcharger un block (Mage_GoogleAnalytics_Block_Ga), nous devons donc rewrite Mage_GoogleAnalytics_Block_Ga.

Fichier app/code/local/Soon/MageOverload/etc/config.xml

<?xml version="1.0"?>
<config>
    <modules>
        <Soon_MageOverload>
            <version>0.1.0</version>
        </Soon_MageOverload>
    </modules>
    <global>
        <blocks>
            <googleanalytics>
                <rewrite>
                    <ga>Soon_MageOverload_GoogleAnalytics_Block_Ga</ga>
                </rewrite>
            </googleanalytics>
        </blocks>
    </global>
</config>

Coder les surcharges

Afin d’afficher le commentaire dans le code HTML Google Analytics, il faut surcharger la méthode _toHtml() de la classe Core – toujours Mage_GoogleAnalytics_Block_Ga. L’intérêt de parent:: est ici démontré : on récupère le code original généré par le Core Magento que l’on modifie ensuite. Les surcharges restent donc totalement indépendantes du Core et de ses évolutions.

Créer et éditer le fichier app/code/local/Soon/MageOverload/GoogleAnalytics/Block/Ga.php

Y copier le code ci-dessous :

<?php
class Soon_MageOverload_GoogleAnalytics_Block_Ga extends Mage_GoogleAnalytics_Block_Ga {
 
    /**
    * Render GA tracking scripts
    *
    * @return string
    */
    protected function _toHtml()
    {
        $html = parent::_toHtml();
        $additionalHtml = "<!-- HTML comment / Commentaire HTML -->\n";
        $newHtml = $additionalHtml . $html;
 
        return $newHtml;
    }
 
}
?> 

On notera bien que c’est la classe Mage_GoogleAnalytics_Block_Ga qui est étendue.

Résultat en front-office

Voici donc le nouveau code HTML généré en front-office :

<!-- HTML comment / Commentaire HTML -->
<!-- BEGIN GOOGLE ANALYTICS CODE -->
<script type="text/javascript">
//<![CDATA[
    (function() {
        var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
        ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
        (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(ga);
    })();
    var _gaq = _gaq || [];
_gaq.push(['_setAccount', 'UA-0000000-0']);
_gaq.push(['_trackPageview']);
//]]>
</script>
<!-- END GOOGLE ANALYTICS CODE -->


E-Commerce, Magento

Laisser un commentaire

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