PrestaShop
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
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.
{* themes/votre-theme/templates/catalog/_partials/product-prices.tpl *}
{hook h='displayW4uAvantPrix' product=$product}
Sources
- Documentation développeur PrestaShop 1.7, les hooks devdocs.prestashop-project.org