Aller au contenu

October 15, 2013

1

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.

Création hook prestashop

Cliquez sur “Insérer”

Création hook prestashop

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.

Création hook prestashop

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:

création d'un hook prestashop

Si vous rencontrez des problèmes, n’hésitez pas à poster un commentaire, je répondrai rapidement !

Publié par
Plus d'articles pour la catégorie Tutoriels
34 Commentaires Poster un commentaire
  1. tall
    May 19 2011

    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

    Reply
    • eMizZ
      May 19 2011

      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 ;)

      Reply
      • Francois
        Mar 29 2012

        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 ?

        Reply
        • eMizZ
          Mar 30 2012

          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

          Reply
  2. TKin
    Aug 21 2011

    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

    Reply
    • eMizZ
      Aug 21 2011

      Bien sur, il suffit de l’intégrer avant la fonction display de smarty qui affiche header.tpl

      Reply
    • TKin
      Aug 21 2011

      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);
      }

      Reply
  3. Nico
    Oct 26 2011

    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.

    Reply
  4. soufiane
    Nov 24 2011

    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

    Reply
    • eMizZ
      Nov 25 2011

      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….

      Reply
      • kingzo
        Mar 18 2012

        Le fichier ce trouve plutot sous le nom de “blockcms” à ce jour, vers. 1.4.7

        Reply
        • Francois
          Mar 29 2012

          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.

          Reply
          • eMizZ
            Mar 30 2012

            Ces fonctions existent toujours dans prestashop 1.4.7

  5. Phil
    Dec 2 2011

    Bonjour

    alors, j’ai beau tourner tous les tutos que j’ai trouvé, dans tous les sens, ça ne marche pas !

    :-)

    Reply
  6. Dec 10 2011

    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.

    Reply
  7. joan varg
    Jan 13 2012

    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

    Reply
  8. ghizlane
    Feb 8 2012

    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

    Reply
  9. ghizlane
    Feb 8 2012

    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

    Reply
  10. Francois
    Mar 29 2012

    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 ?

    Reply
    • eMizZ
      Mar 30 2012

      Vérifie que tu as bien uploadé tout les fichiers, ce n’est pas normal.

      Reply
  11. Apr 6 2012

    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

    Reply
  12. Apr 6 2012

    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

    Reply
  13. Diego
    Jun 6 2012

    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.

    Reply
    • Jun 6 2012

      Dans le fichier config, activez l’affichage des erreurs, l’erreur Javascript ne devrait donner sur une page blanche.

      Reply
      • Diego
        Jun 7 2012

        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.

        Reply
  14. Audrey
    Jul 18 2012

    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

    Reply
    • Jul 18 2012

      Il faut ajouter une fonction hookHeader dans le fichier du module.

      Reply
      • Audrey
        Jul 19 2012

        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 ?

        Reply
  15. Pyssou
    Jul 31 2012

    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

    Reply
  16. thierry
    Oct 22 2012

    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

    Reply
  17. Apr 24 2013

    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

    Reply
    • Apr 24 2013

      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.

      Reply
  18. Apr 24 2013

    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

    Reply
    • Apr 24 2013

      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

      Reply

Partagez votre opinion, postez un commentaire.

(requis)
(requis)

Note: Le HTML est autorisé. Votre e-mail (ne sera pas publié).

S'abonner aux commentaires


7 + 5 =