En théorie depuis le version 1.6 de Prestashop les modules peuvent être surchargés, pour cela on doit copier le fichier principal du module dans le répertoire override/modules/nomdumodule, la plupart du temps le fonctionnement est immédiat, notamment dans le cas de surcharge de méthodes de base, mais dans le cas de certains hooks, les surcharges ne sont pas prise en compte, mais pourquoi ?

Ayant eu récemment le cas pour un projet sure une version 1.7 dans laquelle le client voulait ajouter des données aux statistiques dans l’admin, j’ai donc voulu surcharger le module gridhtml, dans la fonction hookGridEngine afin d’ajouter des totaux en bas de liste.

J’effectue donc mes modifications, je publie mon fichier, et la surprise aucune modification, je place un die au tout début de la fonction, rien, je vérifie tout, l’emplacement du fichier, le nom de la classe … Tout est correct, bref rien d’anormal, je décide donc de remonter la process, je recherche donc l’appel du hook gridEngine, jusqu’à arriver à la classe ModuleGridCore, fonction engine, cette fonction appelle bien le hook, et je m’aperçois que le module est appelé à l’arrache :

require_once(PS_ROOT_DIR.’/modules/’.$render.’/’.$render.’.php’);

Autant dire que les modifications apportées dans la surcharge ne fonctionneront jamais, il me faut donc une solution qui me permette d’utiliser ma surcharge si elle existe, malheureusement, pas de solution simple, on peut surcharger cette fonction mais il va falloir reprendre l’ensemble de cette dernière, or si on met à jour la boutique la fonction peut changer, modifier le fichier du coeur, c’est pire, si on met à jour le moteur la modification est perdue, bref pas de solution vraiment propre et efficace, heureusement, il y a un point d’entrée dans le fonction engine, en effet cette dernière s’appuie sur une donnée de configuration :

$render = Configuration::get(‘PS_STATS_GRID_RENDER’)

Ne reste plus qu’à la berner et reprendre la main, pour cela il faut développer un petit module qui à l’installation va remplacer la valeur de cette donnée de configuration et emmener le script là où on le souhaite, bien entendu on met l’ancienne dans une autre donnée qui sera remise en place si on désinstalle le module.

On créé donc un module portant un nom parlant, par exemple GridHtmlExtended, on étend la classe GridHtml, on lui ajoute la fonction hookGridEngine, qui va permettre de donner la main au module surchargé en chargeant la classe au bon endroit et le tour est joué.

Le résultat apparait alors sur l’interface comme prévu

Ajout de certains totaux sur la liste des meilleurs ventes

Voilà, je joins le zip du module pour ceux qui souhaiteraient l’utiliser comme base.

Attention cette manière de faire n’est pas forcément la meilleure, et n’est peut être pas applicable à toutes les situations, par contre elle me semble la plus propre, pour cette problématique en tout cas, car elle ne nécessite pas de modification du cœur et fonctionnera y compris en cas de modification des opérations réalisées dans la fonction engine d’origine.

Répondre

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

Vous pouvez utiliser ces balises et attributs HTML

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

+ cinquante neuf = 68