Hooks dans PrestaShop 9 : comment ils fonctionnent, lesquels utiliser et comment créer les vôtres
Les hooks sont la façon propre d'étendre PrestaShop sans toucher au cœur. Nous vous expliquons les deux types, comment bien les enregistrer et les erreurs silencieuses les plus courantes.
Un hook est un point d'accroche que PrestaShop laisse dans son code pour qu'un module puisse ajouter du contenu ou réagir à un événement sans modifier le cœur. C'est la pièce qui permet à une boutique d'avoir cent modules tout en continuant à se mettre à jour. Si vous développez pour PrestaShop, bien comprendre les hooks vous évite la moitié des problèmes.
Deux familles : display et action
- Hooks d'affichage (
display*) : ils renvoient du HTML qui s'affiche à un endroit précis de la page. Par exempledisplayProductAdditionalInfosur la fiche produit oudisplayFooterdans le pied de page. - Hooks d'action (
action*) : ils n'affichent rien ; ils s'exécutent quand quelque chose se produit.actionValidateOrderà la création d'une commande,actionObjectProductUpdateAfterà l'enregistrement d'un produit.
Il existe aussi des hooks qui renvoient des données que le cœur combine, comme paymentOptions, où chaque module de paiement fournit ses PaymentOption.
Enregistrer un hook correctement
L'enregistrement se fait à l'installation du module et reste stocké dans la table hook_module :
public function install()
{
return parent::install()
&& $this->registerHook('displayProductAdditionalInfo')
&& $this->registerHook('actionValidateOrder');
}
public function hookDisplayProductAdditionalInfo(array $params)
{
$this->context->smarty->assign(['product' => $params['product']]);
return $this->fetch('module:' . $this->name . '/views/templates/hook/info.tpl');
}
La méthode s'appelle hook + le nom du hook avec la première lettre en majuscule. PrestaShop ne tient pas compte de la casse dans le nom du hook, mais la méthode PHP, elle, doit exister.
install() ne s'exécute plus. Il faut le faire dans un script de upgrade/.Positions et exceptions
Quand plusieurs modules sont greffés sur le même hook, ils s'exécutent dans l'ordre de la colonne position. Cela se modifie dans Apparence > Positions, où vous pouvez aussi exclure certaines pages pour un module. Si un bloc apparaît là où il ne devrait pas, regardez d'abord là avant de toucher au code.
Créer vos propres hooks
Un thème ou un module peut appeler un hook qui n'existe pas dans le cœur : {hook h='displayMiTiendaCabecera'} en Smarty ou Hook::exec('displayMiTiendaCabecera') en PHP. La première fois qu'un module l'enregistre, PrestaShop le crée dans la table hook. C'est la façon la plus propre d'offrir des points d'extension dans vos propres développements, et celle que nous utilisons, par exemple, pour que chaque section d'une page d'accueil soit modifiable séparément.
Pourquoi un module « n'affiche rien »
- Le module est installé mais pas greffé sur ce hook (regardez Positions).
- Le thème n'appelle pas ce hook. Un hook de Classic peut ne pas exister dans Hummingbird, ou se trouver dans une autre zone.
- Une exception de page est configurée.
- Le module est désactivé pour cette boutique : dans PrestaShop, « actif » dépend de la ligne dans
module_shop, pas seulement de la colonneactive. - Le template du module est surchargé dans le thème et cette copie est vide ou obsolète.
Bonnes pratiques
- Renvoyez des chaînes vides dans les hooks d'affichage quand il n'y a rien à montrer : n'ajoutez pas de conteneurs vides qui cassent la mise en page.
- Dans les hooks d'action, ne lancez pas d'exceptions non maîtrisées : une erreur à cet endroit peut bloquer l'enregistrement d'une commande.
- Mettez en cache dans les hooks qui s'exécutent sur toutes les pages (
displayHeader,displayTop) : leur coût se multiplie à chaque visite.
Bien utilisés, les hooks permettent à un module de survivre aux mises à jour de PrestaShop et aux changements de thème. Quand quelqu'un vous propose un override pour quelque chose qu'on peut faire avec un hook, méfiez-vous.