Aller au contenu principal

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 :

PHP
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
<?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

  1. Documentation développeur PrestaShop 1.7, les overrides devdocs.prestashop-project.org