Ajouter un nouveau Hook sur Prestashop

Vous êtes développeur Prestashop ? Peut-être qu’un jour vous devrez créer de nouveaux points d’accroche/emplacement sur votre shop. Le concept est d’ajouter un nouveau « Hook » qui permettra à votre module de se greffer sur un emplacement spécifique qui n’existerait pas dans la plateforme Prestashop.

C’est quoi un « Hook » ?
En d’autres termes plus simple, il s’agit d’un système de points d’accroches, qui permet d’afficher un module ou une fonctionnalité, de manière dynamique en indiquant une zone. Par exemple si on veut greffer un module dans la colonne de gauche de Prestashop sur le front office, on va le faire passer par le hook « leftColumn ».

Comment savoir quel « Hook » fait quoi  et où il s’affiche ?
Les noms des « Hook » sont relativement logiques et vous comprendrez par vous-même ou par tâtonnement. Par exemple sur le site de « techietips » on retrouve la liste des différents « Hook » et où ils sont censés s’afficher. Je vous invite à la consulter même si elle a été établie pour la version 1.3 de Prestashop, pour la version 1.4 cela reste très relativement identique (voir la liste des différents « Hook » pour Prestashop).

Un cas concret
Imaginons que vous voulez faire apparaître un module au sommet de la liste des produits quand vous cliquez sur une catégorie produits. Et non, vous ne pouvez pas, car il n’existe pas un « Hook » à cet emplacement. Mais alors comment faire ?…

Etape 1
Je vais ajouter un enregistrement dans la table « ps_hook », ce nouveau « Hook » je décide de l’appeler « topListProductsCategory ».

INSERT INTO `prestashop`.`ps_hook` (
`id_hook` ,
`name` ,
`title` ,
`description` ,
`position` ,
`live_edit`
)
VALUES (
NULL , 'topListProductsCategory', 'topListProductsCategory', NULL , '1', '0'
);

Etape 2
Pour que le « Hook » puisse se charger on modifie le fichier « FrontController.php » en ajoutant son « Hook » dans la liste des éléments à charger (vers la ligne 450).

self::$smarty->assign(array(
'HOOK_HEADER' => Module::hookExec('header'),
'HOOK_TOP' => Module::hookExec('top'),
'HOOK_LEFT_COLUMN' => Module::hookExec('leftColumn'),
'HOOK_TOP_LIST_PRODUCTS_CATEGORY' => Module::hookExec('topListProductsCategory')
));

Etape 3
Dans le fichier « product-list.tpl » on ajoute le code suivant pour que le « tpl » puisse l’afficher.

{$HOOK_TOP_LIST_PRODUCTS_CATEGORY}

Etape 4
L’idée serait par exemple de faire afficher au module « bloc publicité » (blockadvertising.php) un texte à  l’emplacement que nous avons décidés tout à l’heure. C’est pourquoi dans la méthode d’installation du module « blockadvertising » on ajoute un « registerHook » pour notre nouvel « Hook » s’appelant « topListProductsCategory ».
N’oubliez pas par la suite de « réinstaller » le module, s’il est déjà installé.

public function install()
{
Configuration::updateValue('BLOCKADVERT_LINK', 'http://www.prestashop.com');
if (!parent::install())
return false;
if (!$this->registerHook('leftColumn') OR !$this->registerHook('rightColumn') OR !$this->registerHook('topListProductsCategory'))
return false;
return true;
}

Etape 5
Toujours dans notre fichier « blockadvertising.php » on ajoute une nouvelle méthode qui sera automatiquement appelée par le module lorsque cet emplacement est censé s’afficher. Pour l’exemple on fera afficher un texte simple juste pour démontrer le concept.

function hookTopListProductsCategory($params){
return '>> ma pub ici - avant la liste des produits <<';
}

Et voilà le résultat
A présent on a bien notre texte publicitaire qui s’affiche au-dessus des produits quand on entre dans une catégorie, c’est magique.

Bilan
Le système de « Hook » de Prestashop est assez plaisant, cependant il est un peu contraignant de devoir modifier le « FrontController.php » pour ajouter un nouveau « Hook » au chargement. Peut-être qu’il existe aussi d’autres méthodes plus dynamiques pour arriver au même résultat. Si vous avez une expérience là-dessus n’hésitez pas à nous faire partager votre méthode.

12 commentaires sur “Ajouter un nouveau Hook sur Prestashop”

  1. Merci pour cet article webbax !
    Je me demande juste ce que ca donne en cas de maj de PS.
    A quels fichiers faut-il faire attention au final dans ce cas la ?

  2. Bonjour,

    Je suis en train de mettre le block « blockviewed » dans ma page category.php

    1. J’ai inseré la ligne dans ma table ps_hook
    2. Je suis allé dans classes/FrontController.php pour charger le hook
    3. J’ai insére dans category.tpl {$HOOK_VIEWED_PRODUCTS_CATEGORY}
    4. J’ai modifié la fonction install de blockviewed.php
    5. Puis j’ai ajouté une fonction hookViewedProductCategory qui est exactement pareil à la fonction hookRightColumn

    Palheureusement, rien ne change 🙁
    Si vous pouvez m’aider à y voir clair svp

    Merci

    1. Bonjour,

      De tête, il me semble que cela devait être encore la version 1.3 de Prestashop, à voir si la même logique peut-être appliquée à la version 1.4.

  3. Bonjour

    Je ne sais pas si je prend les choses dans le bon sens
    dans product-list.tpl, j’aimerais rajouter un hook qui changerais le descriptif des produits en fonction des choix fait dans la navigation à facette.
    1 Est ce qu’un hook est bien pour ça ?
    2 Je ne sais pas quel est l’objet que l’on peut rattaché à product-list

    Merci

    1. Bonjour,

      A mon avis il faudrait modifier le comportement PHP de la navigation à facettes, en fonctions des cases cochées… il faudrait modifier l’array de produits avant de le retourner à la vue « product-list.tpl ».

      1) Je ne pense pas
      2) Ce sont les objets du type « Category » qui font l’échange avec « product-list »

      Toucher le module navigation à facettes reste malgré tout un sacré challenge (beaucoup de traitements, beaucoup de code…).

      Merci pour votre visite !

  4. Bonjour et merci pour tous vos tutos et toutes vos vidéos, c’est une vraie mine d’or ^^
    J’ai bien ajouté mes hooks dans la base (j’en crée plusieurs) en revanche je ne trouve pas le fichier classes/controller/FrontController.php
    dans mon ftp.

    Merci d’avance pour votre aide

    1. Re bonjour,
      En fait, j’ai bien crée mes hooks dans la BDD,
      j’ai ajouté les bouts de code dans mon fichier header.tpl

      {hook h=’displayTop2′}
      {hook h=’displayTopMenu’}

      Et là je sèche car aucun des deux n’apparaissent dans mon BO dans la rubrique « Positions »

      J’ai trouvé un fichier FrontController.php dans classes/controller mais je ne retrouve pas de code ressemblant à celui mentionné à l’étape 2

      Merci d’avance

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *