Jump to content

Création de nouveaux hooks sans modification de code


Recommended Posts

Bonjour,

 

Prestashop existe depuis 2007 et aujourd'hui, il faut encore et toujours mettre les mains dans le code pour créer un nouveau hook, ce qui me semble tout simplement aberrant.

 

En fonction du design que l'on doit intégrer, il est quasi systématiquement obligatoire de créer de nouvelles positions. Je ne comprends pas pourquoi cela n'a pas été facilité depuis tout ce temps.

 

J'ai vu qu'à partir de la 1.5 il n'était, en théorie, plus nécessaire d'overrider le front controller. J'ai essayé avec des tutos trouvés sur le net, mais ça ne marche pas. Dans tout les cas, il faut de toute façon modifier le module pour l'autoriser à se greffer sur le nouveau hook. Je trouve ça aussi un peu limite.

 

A quand un système de création de nouveaux hooks à la manière de joomla par exemple ?

 

Merci

  • Like 1
Link to comment
Share on other sites

aujourd'hui, il faut encore et toujours mettre les mains dans le code pour créer un nouveau hook,

1- précis de quelle version de prestashop tu parles

2- tu te plaint par ce qu'il faut rajouter par exemple dans un tpl un code aussi long que :

{hook h="monNouveauHook"}

c'est bien ça ?

  • Like 1
Link to comment
Share on other sites

Je parle de la dernière 1.5 (1.5.6.2).

 

Non c'est normal de rajouter le hook dans un tpl. Comme je l'ai dit, ce qui me gène :

 

- Modifier le FrontController.php

- Modifier le .php du module pour autoriser le module à se greffer sur le nouveau hook.

 

Surtout qu'on ne peut pas surcharger (du moins facilement) le php d'un module...

Link to comment
Share on other sites

1- commençons par le commencement : la dernière version c'est la 1.6.0.5 
2- dans un module par exemple il suffit de mettre $this->registerHook('monNouveauHook') dans la fonction install:
  

public function install()
{
if (!parent::install() OR !$this->registerHook('monNouveauHook'))
return false;
return true;
}

pour greffer le module sur le hook monNouveauHook (pour reprendre l'exemple précédent).

 

Et dans ce même module de rajouter la fonction:

public function hookmonNouveauHook($params)
{
// le code de monNouveauHook
}

Je ne comprend pas pourquoi il faut modifier le Frontcontroller, quant au php du module si tu ne lui dit pas quelles sont les données à afficher dans le tpl, ça ne risque pas de fonctionner donc oui il faut le faire.

Edited by coeos.pro (see edit history)
Link to comment
Share on other sites

  • 4 weeks later...

Quand je dis "Je parle de la dernière 1.5 (1.5.6.2)" j'aurais aussi pu écrire "je parle de la dernière version 1.5 en date, à savoir la 1.5.6.2). Je ne parlais donc pas de la 1.6.

 

Sur cette version, il faut effectivement modifier le front controller sinon ça ne marche pas. Bien entendu, il faut ajouter les variables dans le tpl dans tous les cas.

 

Ma remarque concerne la méthode. Avec un CMS comme joomla, pas besoin d'autoriser un module sur une position (un hook joomla s'appelle position), on peut en mettre un sur n'importe laquelle. Pareil pour la création des positions : on peut le faire directement dans l'admin, ce qui est archi simple et pas besoin de modifier une ligne de PHP, ce qui est très mauvais pour l'évolutivité. Dès qu'on sort du cadre prestashop de base, il faut tenir une liste des modifications effectuées et les reporter à chaque mise à jour ce qui est long, fastidieux et coûteux (quand on utilise prestashop dans le cadre professionnel, je ne parle pas du petit commerçant qui bricole son e-commerce dans sa cave).

Link to comment
Share on other sites

Bonjour,

 

Que cela soit en 1.5 ou 1.6, il n'est pas lieu de modifier le FrontController. Nullement. (Je me demande d'ailleurs quelles modifications vous y voyez à faire ?).

 

Il est de fait possible d'ajout, dans les templates, un point d'accroche personnalisé. Mais aussi un point d'accroche existant.

 

Imaginons un bloc greffé normalement à gauche. Il est possible d'utiliser ce bout de code: {hook h='displayLeftColumn' mod='nomdumodule'} ; la seule problématique étant que, dès lors, il faudra modifier comment se comporte la colonne de gauche dans le thème, afin de ne pas avoir un doublon (surtout si le thème du module en est modifié).

 

Il est donc, vrai, qu'il n'est pas possible de modifier le PHP d'un module pour y ajouter un hook supplémentaire, par contre.

  • Like 3
Link to comment
Share on other sites

Petit coup de pied dans la Vallée!

 

Ma remarque est plus terre à terre et elle ne fera pas avancer le Chmilblick.

 

Si Joomla est si parfait (?!?) pourquoi t'embêtes-tu sur Prestashop?

 

L'herbe est toujours plus verte ailleurs! Ah! c'est ça ... essaies Magento! Je plaisante ...

 

Pour avoir brouté ailleurs, je peux te dire que l'herbe de la vallée d'à côté est de la même couleur, seul le goût change, il faut donc harmoniser sa sauce, accepter les contraintes et adapter, coeos.pro démontre en quelques lignes la souplesse de l'outil. Oui, il faut parfois salir son tablier de cuisto, c'est en général le prix de base de toutes solutions gratuites ...

 

Maintenant si tu n'est pas un "e-bricolo de fond cave" (honneur et respect à eux), tu peux développer et proposer une solution viable pour la communauté ... je suis preneur! et ça, ça fera avancer le Chmilblick et l'herbe de la vallée Prestashop n'en sera que meilleure! ;)

Link to comment
Share on other sites

Concernant la modif du front controller, je ne l'ai plus en tête mais c'est ce qu'il faut faire sur les prestashop antérieurs à la 1.5. J'ai beau suivre tous les tutos de la terre, ça ne marche pas tant que je ne la fait pas (install fraiche).

 

@herby : je m'attendais à cette remarque (typique des forums en général et de celui de prestashop en particulier...).

 

Si j'utilise prestashop, c'est que j'ai mes raisons. J'ai donné l'exemple de joomla car leur système de positions est bien foutu. Il existe bien des solutions pour faire du e-commerce avec ce CMS mais du temps où je l'ai essayé, ça relevait plus du bricolage qu'autre chose.

 

Ma remarque va dans un sens constructif dans le but d'améliorer le produit et de le rendre plus simple.

Link to comment
Share on other sites

Concernant la modif du front controller, je ne l'ai plus en tête mais c'est ce qu'il faut faire sur les prestashop antérieurs à la 1.5. J'ai beau suivre tous les tutos de la terre, ça ne marche pas tant que je ne la fait pas (install fraiche).

 

ce serait bien que tu nous retrouve la modif à faire et la version concernée, et je ne suis pas le seul que ça intéresse...

Link to comment
Share on other sites

Pour le FrontController, c'était vrai pour les versions 1.4.x. Comme l'indique l'un de ses nombreux liens trouvés en rapport: http://blog.lahaut.info/2011/05/rajouter-un-nouveau-hook-dans-prestashop-1-4-grace-a-loverride/

 

Par contre, je répète donc, cette nécessité n'est plus dans le contexte d'une 1.5/1.6.

 

Toutefois, je rajouterais qu'il sera dès lors nécessaire d'utiliser {hook h='monhook' mod='monmodule'} dans le TPL en lieu et place de {$HOOK_JAFFICHEMONMODULE} comme c'était le cas pour les versions 1.4.

 

Notons, bien entendu, que cela ne traite qu'une partie du sujet concerné, et qu'il n'est donc en effet pas possible de rajouter un hook à un module existant, je le concède.

Link to comment
Share on other sites

Je viens de tester avec une 1.6 :

 

J'ai rajouté !$this->registerHook('displayHomenews')) rajouté avec les autres dans le module.

 

Puis ça :

 

public function hookDisplayHomenews($params)
        {
            if (!$this->isCached('evnewshome.tpl', $this->getCacheId()))
        {
            $this->_cacheProducts();
            $this->smarty->assign(
                array(
                    'products' => EvnewsHome::$cache_products,
                    'add_prod_display' => Configuration::get('PS_ATTRIBUTE_CATEGORY_DISPLAY'),
                    'homeSize' => Image::getSize(ImageType::getFormatedName('home')),
                )
            );
        }

 

J'ai mis ça dans mon template : {hook h='displayHomenews' mod='evnewshome'} et... ça ne marche pas.

 

Je vais dans le front controller, je rajoute une ligne dans initContent :

 

'HOOK_HOMENEWS' => Hook::exec('displayHomenews')

 

et j'utilise  {$HOOK_HOMENEWS} : ça marche...

Link to comment
Share on other sites

Heu... Ou pas, je dirais.

 

Depuis la v1.5, ce n'est nullement utile. Et ça fonctionne tellement à merveille.

 

Mais, votre code, il est complet là ? Je veux dire... Il n'y a aucun return, dans la méthode du hook. Logique ?

  • Like 1
Link to comment
Share on other sites

Oui le code est complet, j'avais testé sur un prestashop de test. Quand je suis passé sur mon site de dev, ça a marché sans la modif du frontcontroller. Bizarre, je testerai à nouveau quand j'aurais besoin d'ajouter un hook.

 

Mais bon ça ne résoud que la moitié du problème : il faudrait que prestashop soit capable de greffer un module sur un hook sans modifier le code du module. Pour ça rien de plus simple : permettre de créer un hook dans le back-office.

Link to comment
Share on other sites

il faudrait que prestashop soit capable de greffer un module sur un hook sans modifier le code du module. 

 

Modules > Positions > Greffer un module : tu sélectionnes le module, le hook, tu cliques sur Valider

Link to comment
Share on other sites

Je confirme que sur 1.5 comme 1.6, il n'y a pas lieu d'overrider le FrontController pour ajouter un hook (j'en suis sûr car je suis à l'origine de cette modification ^^).

 

Je te propose de lire ce topic :

http://www.prestashop.com/forums/topic/173027-solved-how-to-create-a-new-hook-in-15-am-i-doing-it-wrong/

 

Je viens de tester avec une 1.6 :

 

J'ai rajouté !$this->registerHook('displayHomenews')) rajouté avec les autres dans le module.

 

Puis ça :

 

public function hookDisplayHomenews($params)
        {
            if (!$this->isCached('evnewshome.tpl', $this->getCacheId()))
        {
            $this->_cacheProducts();
            $this->smarty->assign(
                array(
                    'products' => EvnewsHome::$cache_products,
                    'add_prod_display' => Configuration::get('PS_ATTRIBUTE_CATEGORY_DISPLAY'),
                    'homeSize' => Image::getSize(ImageType::getFormatedName('home')),
                )
            );
        }

 

J'ai mis ça dans mon template : {hook h='displayHomenews' mod='evnewshome'} et... ça ne marche pas.

 

 

Oui le code est complet

Heu, moi je compte 2 "{" et 1 "}"

Donc soit ton code n'est pas complet, soit ça te fait une jolie fatal error :)

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...