PrestaShop
Hook ou override : modifier PrestaShop 1.7 sans toucher au cœur
Fiche écrite en 2018, pour les navigateurs et les versions de l’époque. Vérifiez qu’elle correspond encore à votre environnement avant de l’appliquer.
Modifier un fichier du cœur de PrestaShop, c’est perdre la modification à la prochaine mise à jour. Il reste deux façons propres de changer un comportement, et l’ordre de préférence compte.
D’abord le hook. S’il existe un point d’accroche là où on veut agir, on l’utilise : aucun conflit possible avec un autre module, aucune dépendance à la version exacte du cœur. Exemple courant, ajouter une feuille de style depuis un module plutôt que d’éditer le thème :
public function hookActionFrontControllerSetMedia()
{
$this->context->controller->registerStylesheet(
'w4u-surcharges',
'modules/' . $this->name . '/views/css/surcharges.css',
['media' => 'all', 'priority' => 200]
);
}
Ensuite, seulement si aucun hook n’existe, l’override. Il remplace une méthode d’une classe du cœur. La règle d’or : appeler parent:: et ne modifier que le résultat, au lieu de recopier la méthode entière. Une méthode recopiée ne suit plus les correctifs de sécurité du cœur.
Deux pièges. Un override ajouté à la main n’est pas pris en compte tant qu’on n’a pas supprimé var/cache/prod/class_index.php (et son équivalent dans dev). Et deux modules ne peuvent pas surcharger la même méthode : le second refusera de s’installer. C’est précisément pour ça que le hook passe en premier.
<?php
// override/classes/Product.php
class Product extends ProductCore
{
public static function getProductName($id_product, $id_product_attribute = null, $id_lang = null)
{
// On appelle l'original, puis on ajuste : pas de copie du code du cœur
$nom = parent::getProductName($id_product, $id_product_attribute, $id_lang);
return trim(str_replace(' ', ' ', $nom));
}
}
Sources
- Documentation développeur PrestaShop 1.7, les overrides devdocs.prestashop-project.org