Leçon 4: Créer un hook dans prestashop
Je vais, dans ce tutoriel, vous expliquer comment créer un nouveau hook au sein de prestashop, ce qui vous permettra de placer vos modules dans des endroits différents que ceux que prestashop propose par défaut.
Cette manipulation est plutôt simple et comporte trois étapes :
- Insertion d’un nouveau hook dans la base de donnée
- Introduction du hook dans le code
- Affectation d’un module au nouveau hook
1 / Insertion d’un nouveau hook dans la base de donnée
Il s’agit ici de se connecter à votre base de donnée directement via phpMyAdmin ou autre client sql.
- Si vous utilisez WAMP/MAMP/LAMP , l’url d’accès à votre base devrait ressembler à ceci : http://localhost:8888/phpMyAdmin/ (A savoir que le port 8888 peut changer en fonction de vos paramètres).
- Si vous travaillez directement en ligne, vous devriez avoir reçu les informations de connexion via votre hébergeur.
A ce stade, vous devriez être face à vos dizaines de tables prestashop présentes au sein de votre base de donnée.
Ouvrez la table ps_hook.
Cliquez sur “Insérer”
Remplissez les champs comme ceci :
- id_hook : La valeur sera affectée automatiquement
- name : le nom de votre hook (n’utilisez pas d’espace)
- title : Le titre de votre hook (affiché dans la liste des hook disponibles dans l’onglet “position” des modules)
- description : Une simple description de votre hook
- position : Laissez à 1 par défaut.
Cliquez sur “Executer”.
Voilà, c’est aussi simple que ça, votre hook est maintenant créé.
2 / Introduction du hook dans le code
Cette étape est plus délicate, surtout lorsqu’on ne connais pas le langage php et smarty, mais rassurez vous, je vais essayer d’être le plus compréhensible possible.
Vous devez maintenant décider de l’endroit où vous allez placer votre hook, je prendrai comme exemple la page “contact-form.php”. Il s’agit de la page qui contient votre formulaire de contact.
Je vais avoir besoin de modifier deux fichiers :
/contact-form.php
/themes/prestashop/contact-form.tpl
Dans un premier temps, il s’agit de passer à smarty le contenu de nos modules affectés sur notre nouveau hook. Pour cela, ajoutez ces lignes avant la fonction display() de smarty :
1 2 3 | $smarty->assign(array( 'HOOK_MYHOOK' => Module::hookExec('myHook') )); |
Ici, nous assignons à smarty la variable “HOOK_MYHOOK” qui contient nos modules rattachés à “myHook”.
Courage, c’est presque fini, on va maintenant afficher dans le .tpl le contenu de notre variable précédemment créé.
Insérez le code suivant dans le fichier contact-form.tpl à l’endroit où vous souhaitez afficher vos modules.
1 | {$HOOK_MYHOOK} |
L’installation de notre hook est maintenant terminée, félicitations
Cependant, il va maintenant falloir y placer un module, je prendrais pour exemple le block informations.
3 / Affectation d’un module au nouveau hook
Ouvrez le fichier modèle de votre module :
/modules/blockinfos/blockinfos.php
Placez votre attention sur la fonction “hookLeftColumn($params)”, c’est elle qui va retourner le contenu de votre module lorsqu’il sera placé sur la colonne de gauche.
Ajoutons donc une fonction qui va retourner la même chose mais pour notre hook “myHook”
1 2 3 4 | function hookMyHook($params) { return $this->hookLeftColumn($params); } |
Traduction : Lorsque le block informations sera attaché à “myHook” il retournera la même chose que lorsqu’il est attaché à “leftColumn”.
Dernière étape, rendez-vous dans l’administration, onglet “Modules“, sous-onglet “Positions” puis cliquez sur “Greffer un module“.
- Module : Bloc informations.
- Greffer le module sur : My Hook.
- Enregistrez.
Roulement de tambour… Allez sur la page contact, vous devriez voir quelque chose qui ressemble à ceci:
Si vous rencontrez des problèmes, n’hésitez pas à poster un commentaire, je répondrai rapidement !
Bonjour Amélien merci pour ce tutoriel.
Par contre j’ai un énorme probléme avec le point suivant “Pour cela, ajoutez ces lignes avant la fonction display() de smarty” .
En fait je voudrais savoir :
1) Ou se trouve cette fonction display() de smarty?
2) S’agit-il des fichiers du thème ( que j’ai téléchargé) actif ou forcément du théme prestashop?
Merci de vos réponses
Bonjour à toi
Dans la plupart des fichiers php situés à la racine de ton site (ici j’ai pris comme exemple le fichier contact-form.php) possède une fonction display qui va permettre d’afficher leur fichier “.tpl” associé (ici contact-form.tpl présent dans le dossier du thème).
Voici à quoi elle ressemble :
$smarty->display(_PS_THEME_DIR_.'contact-form.tpl');
Ces fonctions sont présentes dans n’importe quel thème.
Cordialement
Je ne vois pas cette fonction display dans les fichier php à la racine. il n’y a pas ça dans le fichier contact-form.php sur mon template
Ces ecplicayions sont elles encore valables pour prestashop 1.4.7 ?
Depuis la version 1.4, le code php se trouve dans les controlleurs. Par exemple pour contact-form.php, va voir dans /controllers/ContactController.php !
Cordialement,
Emilien
cela fonctionne t il également sur le fichier header ?
je narrive pas à déterminer ou intégrer cette même mention de code
$smarty->assign(array(
‘HOOK_MYHOOK’ => Module::hookExec(‘myHook’)
));
dans header.php
Bien sur, il suffit de l’intégrer avant la fonction display de smarty qui affiche header.tpl
désolé, en suivant toutes vos étapes, même en copiant collant vos codes, j’ai “Ce module ne peut être greffé sur ce hook.” lorsque je tente de greffer le module Bloc Languages modifié similairement à votre tuto dans un hook appelé dans le header.tpl
pour info:
dans header.php
$controller = new FrontController();
$smarty->assign(array(
‘HOOK_MYHOOK’ => Module::hookExec(‘myHook’)
));
$controller->displayHeader();
dans bloclanguages.php
function hookMyHook($params)
{
return $this->hookTop($params);
}
Ton commentaire est ancien mais je vais proposer une solution si quelqu’un d’autre rencontre ce problème.
Vérifies si tu as bien placé ta fonction hookMyHook a l’intérieur de la class BlockLanguages.
salut eMizZ
j’ai une question pour la partie Affectation d’un module au nouveau hook le problème j’ais pas trouve le fichier /modules/blockinfos/blockinfos.php
merci pour ton retour
Le fichier php blockinfos.php EST le module blockinfos.php, donc si tu n’as pas ce fichier tu n’as tout simplement pas le module….
Le fichier ce trouve plutot sous le nom de “blockcms” à ce jour, vers. 1.4.7
Ok celui là je l’ai le fichier avec la version 1.4.7 de prestashop. Cependant je ne trouve rien qui ressemble à ça :
function hookMyHook($params)
{
return $this->hookLeftColumn($params);
}
Pour la version 1.4.7 de Prestashop les fichiers décrits dans ce tuto n’existe pas ou sont différents que ce qui est annoncé.
Du coup j’arrive à rien. Que faire ?
Comment apprendre à vraiment utiliser prestashop.
je suis bien triste ce tutoriel est le seul que j’ai trouvé qui donne des infos précises.
Ces fonctions existent toujours dans prestashop 1.4.7
Bonjour
alors, j’ai beau tourner tous les tutos que j’ai trouvé, dans tous les sens, ça ne marche pas !
Idem que Phil j’ai bien l’impression que mon hook n’est pas pris en compte. Pourtant lors de la greffe, PS indique bien “le mode a été greffé avec succès” Sauf qu’il n’apparait pas ensuite à l’écran.
Nouveau Hook dans Top (header)
Désolé de déterrer ce post, il est néanmoins très bien référencé par G sur la requête “création Hook” et c’est même le premier sur lequel je suis tombé.
Après quelques heures de galérage intense ….l’endroit que cherche désespéremment Tkin pour intégrer sa déclaration “display”se trouve en fait dans classes/FrontController.php aux environs de la ligne 480.
ça peut toujours servir aux générations futures.
Et tout fonctionne, merci Emilien
bonjour Emilien je suis entrain de creer un theme prestashop pour le vente des themes et je vx ajouter un bouton demo sur la page d’accueil mais je sé pas comment
bonjour Emilien je suis entrain de creer un theme prestashop pour le vente des themes et je vx ajouter un bouton demo sur la page d’accueil mais je sé pas comment
Salut,
dans www/modules/blockinfos
il n’y a qu’un seul fichier, celui-ci : fr.php
Je n’ai pas de fichier blockinfos.php
du coup je comprend rien, j’arrive pas à suivre.
C’est peut que j’utilise prestashop 1.4.7 ?
Il faut que je trouve un autre tutoriel ailleurs pour la dernière version de prestashop ? Tu en a peut être fait un aussi mis à jour ?
Vérifie que tu as bien uploadé tout les fichiers, ce n’est pas normal.
Bonjour!
Je pense que j’y suis presque… Mais je n’y suis pas
J’ai tout suivi correctement.
Je cherche à placer le module tag de nuage.
J’ai mis la fonction au dessus du display dans header.php
===========================================
$smarty->assign(array(
‘HOOK_IXOTOOLS_FOOTER’ => Module::hookExec(‘hook_ixotools_footer’)
));
J’ai déclaré le hook dans mysql
=========================
Je suis allé dans le module tag, j’ai ajouté la fonction
=======================================
function hookhook_ixotools_footer($params)
{
return $this->hookLeftColumn($params);
}
J’ai greffé le module sur mon hook : aucun problême, il est greffé correctement
=======================================
Je suis allé dans footer.tpl et j’ai choisi là où je voulais poser mon nuage de tag, j’ai mis
===============================================
{$HOOK_IXOTOOLS_FOOTER}
J’ai supprimé la compil smarty pour être sûr qu’elle est réinitialisée.
Résulat : Rien, le nuage n’apparaît pas. J’ai fait l’essai avec le module editorial : exactement pareil.
Vous voyez où peut-être l’erreur?
D’avance merciiii
jérôme
Je retire ce que j’ai dit,
J’ai trouvé grâce au post de joan Varg :
J’ai mis vers la ligne 474 de classe/frontcontroller.php( chez moi )
================================
self::$smarty->assign(array(
‘HOOK_HEADER’ => Module::hookExec(‘header’),
‘HOOK_TOP’ => Module::hookExec(‘top’),
‘HOOK_LEFT_COLUMN’ => Module::hookExec(‘leftColumn’),
‘HOOK_IXOTOOLS_FOOTER’ => Module::hookExec(‘hook_ixotools_footer’)
));
Donc au final mon mule editorial s’affiche, mais pas celui de tag de nuage…. Donc il me reste un SOUCIS, si vous avez une idée pour le nuage de tag qui ne s’affiche pas alors que le module editorial s’affiche bien lui …
Joli post en tout cas emizzzzzzzzz
Bonjour,
je travaille sur Prestashop 1.4.8.2
je souhaite rajouter un Hook pour le module BlockLayered dans la page category.
Pour ce faire j’ai été modifier comme dit les fichiers :
-CategoryController.php
-category.tpl
-category.php
-blocklayered.php
J’ai gardé les mêmes noms de variables et les mêmes noms de hook que sur le tuto. Je greffe avec succès le module dans le back-office mais lorsque je charge une page category il m’affiche une page blanche et il m’affiche dans la console de firebug le message suivant :
“current_friendly_url is not defined
[Stopper sur une erreur]
var params = current_friendly_url;”
Une idée de ce qui pourrait poser problème ? Cette erreur se réfère au fichier blocklayered.js (l.493)
En vous remerciant par avance.
Dans le fichier config, activez l’affichage des erreurs, l’erreur Javascript ne devrait donner sur une page blanche.
Merci pour votre réponse rapide, effectivement j’ai activé l’affichage des erreurs et j’ai pu voir que le problème se situait dans le fichier categoryController.php
Par rapport à votre tuto, les variables $smarty sont toutes écrites de cette façon “self::$smarty->…” j’ai donc rajouté la partie manquante qui précède cette variable et le problème est résolu.
Bonjour,
Je suis dans un cas similaire, je souhaite afficher le module blocklayered dans dans le Header, or celui-ci est déjà greffé correctement… et dans le code (sur les pages catégories) aucune trace Header hormi le CSS et JS.
Comment faire pour afficher mon module blocklayered dans le header ?
Merci
Il faut ajouter une fonction hookHeader dans le fichier du module.
Oui mais… la fonction hookHeader est déjà présente dans le fichier blocklayered.php, d’où mon incompréhension…
Et le problème est que j’aimerai afficher ce bloc navigation à facette dans la page centrale et non plus en colonne de gauche, donc comment faire ?
Bonjour,
j’ai bien suivi ton tuto mais avec le module blockviewed à mettre dans category.tpl.
Ca ne marche pas.
Peux-tu m’aider stp
Merci
bonjour,
j’aimerais mettre mon navigateur (blocklayered) en page d’acceuil car il ne s’y met pas tout seul et je ne trouve aucune solution, pourriez m’aider, j’ai vu sur internet qu’il fallait modifier la “home_page” mais je ne voie pas comment faire.
merci par avance de votre réponse.
cordialement
thierry
je cherche à appliquer la même chose sur la version 1.5;
mais sans succés .
pour l’insertion dans la table pas de soucis
par contre dans le php du module …. j’ai beau cherché je ne trouve pas
J’ai peut-être ta solution, si ton hook se nomme “displayToto” , la fonction de hook dans le module devra s’appeller comme ca :
function hookDisplayToto($params){} (avant sous 1.4 c’était hookToto() )
N’hésites pas à le dire si ça a résolu ton problème.
mon hook se nomme myhook dans la base
sur mon header.tpl je l’insere comme ceci :
{hook h=”myhook”}
dans mon fichier php du module :
public function install()
{
if (parent::install() == false OR $this->registerHook(‘leftColumn’) == false OR $this->registerHook(‘myhook’) == false)
return false;
et pour l’affichage :
public function hookDisplaymyhook($params){return $this->hookLeftColumn($params);}
mais toujours impossible de greffer;
je le teste sur le module freebloc, je vais tenter avec un module natif presta
je viens de tester avec le bloc fabricants en ajoutant le hook footer;
cette fois ci ça a fonctionné !
par contre impossible de le greffer sur monhook;
il doit me manquer quelque chose dans la création du hook