Prestashop permet dans sa version actuelle (1.6) de surcharger à peu prés .. tout !
Ce qui est vraiment pratique pour modeler votre site e-commerce comme vous l'entendez sans toucher au cœur du code. Ce qui vous permettra ( dans une certaine mesure ) de pouvoir mettre à jour prestashop sans devoir réécrire vos fonctionnalités spécifiques ou votre thème.

Mais il y a les modules

Une autre des force de cet outil e-commerce, ce son ses modules, très nombreux qui permettent d'ajouter des fonctionnalités de façon .. "plug and play", activer désactiver etc .. super !!

Seulement dans la documentation, impossible de trouver le moyen de surcharger un module existant.( je parle de la surcharge de la fonctionnalité apportée par ce module, les templates associés sont surchargeable de façon classique )
jusqu'à maintenant, si vous souhaitiez changer le fonctionnement d'un module, vous aviez le choix entre :

  1. Toucher directement au code du module ( prochaine mise à jour .. et hop ... vous devez recommencer )
  2. Copier le module pour le dupliquer à votre sauce ( Assez lourd )

La signature à utiliser

Et bien figurez vous que c'est possible .. si si ..

Note : uniquement à partir de la v1.6.0.11 ( merci à ChDUP pour cette précision )
Pour surcharger une classe, vous utilisez l'écriture suivante :

class [className sans Core] extends [className]Core

dans le répertoire override/ ou modules/monModule/override/

Et bien pour surcharger le code d'un module, il vous faut utiliser l'écriture suivante

class [classNameModule]Override extends ClassNameModule

Il suffit donc d'utiliser la chaine "Override" dans le nom de votre classe qui va surcharger le module souhaité .
Par contre, il faut placer votre code dans le répertoire

override/modules/moduleName/

L'exemple qui va bien

Prenons le cas du module BlockPaymentLogo disponible par défaut, qui permet d'afficher les logis de paiement sur une colonne de votre home.
Moi je souhaite les afficher .. dans le pied de page "Footer", ce module n'a pas prévu ce cas, est n'est donc pas enregistré au bon Hook ( displayFooter ) . Bref impossible de le faire en natif .

Surchargeons

Nous allons commencer par créer le répertoire du même nom que celui d'origine

override/modules/blockpaymentlogo/

Puis créer le code de surcharge que voici.

if (!defined('_PS_VERSION_'))
    exit;

class BlockPaymentLogoOverride extends BlockPaymentLogo
{


    public function install(){

        if( parent::install() ){
            return $this->registerHook('displayFooter');
        }else{
            return false;
        }

    }

    public function hookDisplayFooter($params)
    {
        return $this->hookLeftColumn($params);
    }

}

Petites explications,

  • on commence par déclarer notre classe comme il se doit ( en ajoutant Override, et en héritant de la classe du module d'origine )
  • Puis j'ajoute dans le constructeur l'association du module dans le hook displayFooter
  • Et enfin, je définis le code spécifique à ce hook ( ici le code sera le même que sur le hook leftcolumn, donc je ne réécris pas le code j'appelle celui du hook leftcolumn )

Ne reste plus qu'à réinitialiser le module .. et voilà les logos qui apparaissent dans mon footer .

Restez informé

inscrivez vous à la newsletter pour recevoir les nouveaux billets par mail. ( formulaire en haut à droite )