Aller au contenu principal

Créer un hook personnalisé dans un module PrestaShop 1.7

Fiche écrite en 2017, pour les navigateurs et les versions de l’époque. Vérifiez qu’elle correspond encore à votre environnement avant de l’appliquer.

Les hooks natifs couvrent beaucoup d’emplacements, mais pas tous. Quand il faut afficher un bloc à un endroit précis de la fiche produit, par exemple juste au-dessus du prix, le réflexe de modifier le template du thème est le mauvais : la modification saute à la prochaine mise à jour du thème, et elle mélange le contenu du module avec la présentation.

La bonne méthode tient en deux temps : le module déclare son propre hook, et le thème l’appelle à l’endroit voulu. registerHook() crée le hook en base s’il n’existe pas encore.

PHP
<?php
class W4uBandeau extends Module
{
    public function __construct()
    {
        $this->name = 'w4ubandeau';
        $this->tab = 'front_office_features';
        $this->version = '1.0.0';
        $this->author = 'W4U';
        $this->ps_versions_compliancy = ['min' => '1.7.0.0', 'max' => _PS_VERSION_];
        parent::__construct();
        $this->displayName = $this->l('Bandeau avant le prix');
    }

    public function install()
    {
        // registerHook() crée « displayW4uAvantPrix » s'il n'existe pas en base
        return parent::install()
            && $this->registerHook('displayW4uAvantPrix');
    }

    public function hookDisplayW4uAvantPrix(array $params)
    {
        $this->context->smarty->assign('produit', $params['product'] ?? null);

        return $this->fetch('module:w4ubandeau/views/templates/hook/bandeau.tpl');
    }
}

Dans le thème, une seule ligne suffit, et les paramètres passés à {hook} arrivent dans $params. Deux conventions à respecter : préfixer par display un hook qui renvoie du HTML, par action un hook qui réagit à un événement sans rien afficher. Et donner au hook un nom propre au module, pour ne jamais entrer en collision avec un hook natif ajouté plus tard.

Smarty
{* themes/votre-theme/templates/catalog/_partials/product-prices.tpl *}
{hook h='displayW4uAvantPrix' product=$product}

Sources

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