Hook Prestashop
Accueil » Conseils & tutoriels sites internet » Tutos Prestashop » Ajoutez des hooks personnalisés à votre Prestashop

Ajoutez des hooks personnalisés à votre Prestashop

Posté dans : Tutos Prestashop 4

La gestion des hooks est très avenante sur Prestashop 1.6, et en-dehors de l’éditeur visuel qui permet de déplacer la position des modules selon l’emplacement où ils sont greffés, le back-office permet également de les réagencer de façon rapide et précise. Il peut en revanche arriver que l’on aie à ajouter un hook personnalisé sur son thème, pour une raison x ou y, comme par exemple pour afficher du contenu sur toutes les pages produit.

Il existe deux moyens d’effectuer cette opération, toutes demandant un ajout dans la base de données :

Vous pouvez également trouver un module de création de hooks sur notre boutique en cliquant ici.

1/ Ajout du hook dans la base de données :

Hook Prestashop

Dans la base de données de Prestashop se trouve une table nommée ps_hook (selon le préfixe que vous avez choisi de donner à vos tables). En images, cela ressemble à ceci :

Cette table liste tous les hooks disponibles sur votre Prestashop. Vous pouvez bien évidemment exporter la table au format Excel afin d’avoir une liste complète de vos hooks. Nous allons donc ajouter un hook à cette table. La requête à effectuer est la suivante :

INSERT INTO  `MaBaseDeDonnées`.`ps_hook` (
`id_hook` ,
`name` ,
`title` ,
`description` ,
`position` ,
`live_edit`
)
VALUES (
NULL ,  'DisplayMonHook',  'DisplayMonHook',  'Ma description de DisplayMonHook',  '1',  '1'
);

Avec ceci nous avons donc précisé le nom du hook, son titre, une petite description, une visibilité, et si l’on peut le gérer via live edit. Notez au passage que l’identifiant du hook est en auto-incrément, inutile donc de le renseigner.

Encore une fois, vous êtes entièrement responsable de votre base de données, pensez à sauvegarder votre site au préalable.

2/ Ajout d’un hook depuis un override

Afin d’ajouter un hook directement dans le Prestashop, et sans passer par un module, il va falloir overrider un controller front-office sur Prestashop. D’ordinaire, beaucoup effectuent un override du FrontController, mais selon vos besoins vous pouvez uniquement overrider le controller des produits, ou des catégories, etc. L’avantage du FrontController est qu’il vous laissera ajouter votre hook partout où vous le souhaitez, plutôt pratique. Le FrontController.php se trouve dans le dossier /classes/controllers/FrontController.php. Nous allons juste récupérer une partie du code, que nous modifierons, et que nous placerons proprement dans /override/classes/controllers. Le code à ajouter est tout simplement celui-ci :

< ?php
class FrontController extends FrontControllerCore

{

public function initContent()

{

  $this->process();

  if (!isset($this->context->cart))

   $this->context->cart = new Cart();

  $this->context->smarty->assign(array(

   'HOOK_HEADER' => Hook::exec('displayHeader'),

   'HOOK_TOP' => Hook::exec('displayTop'),

   'HOOK_MON_HOOK' => Hook::exec('DisplayMonHook'),

   'HOOK_LEFT_COLUMN' => ($this->display_column_left ? Hook::exec('displayLeftColumn') : ''),

   'HOOK_RIGHT_COLUMN' => ($this->display_column_right ? Hook::exec('displayRightColumn', array('cart' => $this->context->cart)) : ''),

  ));

}

}

?>

Vous avez ajouté votre hook et pouvez dès à présent le gérer depuis votre back-office ! Mais avant d’aller l’afficher sur votre site, nous allons voir dans le cadre d’un module comment l’ajouter sur une installation

3/ Affichage d’un hook depuis un module

Lorsque nous créons un module, nous avons la possibilité d’ajouter, de modifier ou d’altérer des tables dans la base de données. Nous pouvons également greffer le module dès l’installation, tout comme ajouter des exemples pré-remplis. Donc lors de l’exécution de la fonction install() du module, il faudra tout simplement ajouter la requête MySQL (en respectant bien évidemment les pré-requis de la class db()) et prévoir la fonction d’ajout au hook, que voici :

public function hookDisplayMonHook($params)
    {
		//smarty assign
    }

Et de cette manière votre module pourra se greffer sur votre hook personnalisé. C’est aussi simple que cela !

Nous avons listé les hooks pour Prestashop 1.7, ainsi que les hooks pour Prestashop 1.6, afin de vous aider à développer au mieux vos propres modules 🙂

4/ Afficher son hook en front-office

Le hook étant dans la base de données et utilisable, il va tout de même falloir l’ajouter sur le thème, afin de le rendre visible. Une bonne méthode est d’ores et déjà d’encapsuler votre hook dans une div, avec un identifiant ou une class bien précise. Ouvrez le fichier TPL de votre thème où vous souhaitez ajouter votre hook, et saississez tout bêtement ceci :

<div class="DisplayMonHook">
	{hook h="DisplayMonHook"}
</div>

Rendez-vous à présent dans votre front-office, et allez vider votre cache. Greffez-y un module qui puisse s’accrocher à ce nouveau hook, et le résultat devrait apparaitre sans problème ! Attention cependant, si vous souhaitez greffer un module existant à ce nouveau hook, il vous faudra overrider le module afin de lui ajouter la fonction de hook qui lui permettra de s’y ajouter. Sans cela, Prestashop vous dira tout simplement que « ce module ne peut pas être greffé à ce hook », et c’est bien normal…

Vous souhaitez ajouter des hooks à votre base de données sans vous embêter ?

Regardez par ici, un module d’ajout de hooks dans votre BDD est librement téléchargeable !

Imprimer Imprimer
Suivre Cyssoo:

Développeur - formateur

Je cherche à display errors le monde, vous auriez pas la doc' ? Follow me on Twitter !

4 Responses

  1. se loi
    | Répondre

    Bonjour,

    Merci pour votre tuto.
    J’ai 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 »

    Si je comprends bien, je crée un nouveau fichier FrontController.php que je place dans override/classes/controllers et dans ce fichier je place :

    process();

    if (!isset($this->context->cart))

    $this->context->cart = new Cart();

    $this->context->smarty->assign(array(

    ‘HOOK_HEADER’ => Hook::exec(‘displayHeader’),

    ‘HOOK_TOP’ => Hook::exec(‘displayTop’),

    ‘HOOK_TOP_2’ => Hook::exec(‘displayTop2’),
    ‘HOOK_TOP_MENU’ => Hook::exec(‘displayTopMenu’),

    ‘HOOK_LEFT_COLUMN’ => ($this->display_column_left ? Hook::exec(‘displayLeftColumn’) :  »),

    ‘HOOK_RIGHT_COLUMN’ => ($this->display_column_right ? Hook::exec(‘displayRightColumn’, array(‘cart’ => $this->context->cart)) :  »),

    ));

    }

    }

    • Cyssoo
      | Répondre

      Bonjour
      Je vous avoue que depuis, j’utilise beaucoup notre module gratuit de création de hook, qui reprend les fonctionnalités natives de Prestashop. Selon ce que vous désirez faire, vous n’avez pas besoin d’overrider le frontController, cependant il vous faudra probablement overrider le module que vous désirez greffer sur le nouveau hook
      S’il s’agit toutefois d’un simple bloc HTML, le module gratuit Ever Block détectera tout hook et vous permettra non seulement de vérifier que le hook est bien en place, mais également de mettre du contenu HTML

  2. se loi
    | Répondre

    Merci pour votre message.

    J’ai installé le module de création de hook, mais rien en BO

    Je souhaite greffer plusieurs modules :
    Dans mon hook displayTop2 : Mon panier + lien de connexion client
    Dans mon hook displayTopMenu : Menu principal

    Je dois donc overrider mes 3 modules en question ?
    Ne s’agissant pas de simple bloc HTML, puis-je tout de même utiliser le module gratuit Ever Block ou bien je dois les overrider manuellement. Dans ce dernier cas comment faire ?

    Encore merci pour votre aide précieuse 🙂

    • Cyssoo
      | Répondre

      Tout dépend de votre version de Prestashop, les modules ayant pas mal évolués à ce niveau
      Sur Prestashop 1.6, l’ajout simple d’une méthode de hook suffit, sous Prestashop 1.7 il faudra regarder du côté des widgets, les modules natifs de Prestashop se basant beaucoup là-dessus

Laisser un commentaire

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

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.