Qu’est-ce qu’un Hook ?
Dans le coeur du code de PrestaShop, il y a un ensemble d’événements qui ont été définis, on les appelle les hooks. Ils sont particulièrement intéressants car ils permettent d’intervenir à ce moment du coeur, à partir d’un module .
En effet, si un module s’est enregistré auprès de ce hook (appelons-le “displayHeader” par exemple), qu’il contient une méthode publique s’appelant hookNomDuHook (hookDisplayHeader dans notre exemple) et qu’il a été greffé sur ce même hook, PrestaShop exécutera la méthode du module.
Mais comment ordonner les divers appels si plusieurs modules se sont enregistrés auprès du même hook ? C’est à cela que sert le menu “Module/Positions” du backend : il permet de greffer un module sur un hook, mais aussi d’ordonner les différents modules qui sont greffés au même hook.
Le Hook en pratique
En reprenant l’exemple du displayHeader, pour loader un fichier CSS à partir d’un module, il suffit de
- Enregistrer le module auprès du hook displayHeader par la commande
$this->registerHook('displayHeader');
exécutée à l’installation du module. Cela permet au module d’acquérir la possibilité de se greffer au hook.
- Coder une méthode hookDisplayHeader() dont le seul contenu est
$this->context->controller->addCSS(($this->_path).'myfile.css', 'all');
- Aller greffer dans le backoffice notre module sur le hook
Aller plus loin avec les Hooks
Il est donc intéressant de connaitre la Liste des hooks PrestaShop, permettant de savoir à quels endroits du coeur de PrestaShop on peut intervenir facilement, au sein d’un module, sans devoir overrider le code de la classe du coeur.
Cette liste peut être divisée en deux familles : les hooks de display et les hooks d’action (PrestaShop les appelle aussi ces derniers les hooks invisibles), même si un hook display peut aussi être utilisé comme un hook d’action, tout simplement en n’affichant rien.
Note: Vous trouverez parfois des références à des noms de hook “header” au lieu de “displayHeader”, c’est simplement son ancien nom jusqu’à la version 1.4 de PrestaShop
Pour terminer, vous pouvez être amené à créer vous même un hook ! Quand vous désirez offrir aux autres modules la possibilité d’intervenir au sein du vôtre sans le modifier, vous créez un hook.
Pour cela, il suffi d’écrire
$this->registerHook('NameOfHook');
comme si vous enregistriez le module auprès du hook. PrestaShop verra que le hook n’existe pas, et le créera pour vous. Ensuite, vous décidez de l’endroit où l’exécuter : Hook::exec(‘nomDeMonHook’, [arguments]); et PrestaShop exécutera à ce moment toutes les méthodes hookMonNomDeMonHook de tous les modules qui se sont enregistrés et qui ont été greffés dans le BO.