Jump to content

Ajout de hook module


Recommended Posts

Bonjour,

 

J'aurais aimé savoir si la méthode pour ajouter un nouveau hook à un module est toujours la même ?

 

A savoir dupliquer le module , ajouter le hook dans la base et dans le module.

 

Typiquement je souhaite ajouter un hook au blockcategories, qu'elle est la méthode pour la version 1.5.

 

Merci

Link to comment
Share on other sites

Je suis étonné qu'il n'y est aucune réponse à ce sujet sur un point tel que celui là, c'est quelque chose d'assez important dans la personnalisation d'un thème.

 

Pourquoi limiter l'emplacement des modules à des hooks particulier.

 

Si on ajoute le hook directement dans le module on le perdra à la mise à jour du module

et

si on duplique le module on perd les potentiels mise à jour.

Link to comment
Share on other sites

Bonjour,

 

Voici une méthode qui devrait vous intéresser. Elle permet de ne pas dupliquer le module et en prime de ne pas modifier l'original.

 

Si l'on étend la classe du module que l'on souhaite modifier, on peut traiter l'ensemble des informations qui y sont liées et en prime en rajouter.

 

Bien entendu, tout dépend du module et il à tester si la méthode est préférable voire même acceptable.

 

Dans mon test, ça l'était. (Tout en sachant que le module original était désactivé).

 

En voici l'illustration (le fichier est défini comme /modules/blockpaymentlogo2/blockpaymentlogo2.php)

 

<?php
if (!defined('_PS_VERSION_'))
exit;

require_once(_PS_MODULE_DIR_.'blockpaymentlogo/blockpaymentlogo.php');
class BlockPaymentLogo2 extends BlockPaymentLogo
{
public function __construct()
{
 parent::__construct();

 $this->name = 'blockpaymentlogo2';
 $this->version = '0.1';
 $this->author = 'PrestaEdit';
}
public function install()
{
 if (!parent::install())
  return false;
 if (!$this->registerHook('displayTop'))
  return false;
 return true;
}
/**
* Returns module content
*
* @param array $params Parameters
* @return string Content
*/
public function hookDisplayTop($params)
{
 if (Configuration::get('PS_CATALOG_MODE'))
  return;

 if (!Configuration::get('PS_PAYMENT_LOGO_CMS_ID'))
  return;
 $cms = new CMS(Configuration::get('PS_PAYMENT_LOGO_CMS_ID'), $this->context->language->id);
 if (!Validate::isLoadedObject($cms))
  return;
 $this->smarty->assign('cms_payement_logo', $cms);
 return $this->display(__FILE__, 'blockpaymentlogo.tpl');
}
}

 

Avec cet exemple, on se rend compte que j'ai accès au "getContent" de base sans en avoir déclaré un.

Link to comment
Share on other sites

if (!defined('_PS_VERSION_'))
exit;
include_once(_PS_MODULE_DIR_.'homeslider/HomeSlide.php');
class HomeSlider extends Module
{
private $_html = '';
public function __construct()
{
 $this->name = 'homeslider';
 $this->tab = 'front_office_features';
 $this->version = '1.2';
 $this->author = 'PrestaShop';
 $this->need_instance = 0;
 $this->secure_key = Tools::encrypt($this->name);
 parent::__construct();
 $this->displayName = $this->l('Image slider for your homepage');
 $this->description = $this->l('Adds an image slider to your homepage.');
}
/**
 * @see Module::install()
 */
public function install()
{
 /* Adds Module */
 if (!parent::install()) return false;
 if (!$this->registerHook('displayTop'))
  return false;
 return true;
 if (parent::install() && $this->registerHook('displayHome') && $this->registerHook('actionShopDataDuplication'))
 {
  /* Sets up configuration */
  $res = Configuration::updateValue('HOMESLIDER_WIDTH', '535');
  $res &= Configuration::updateValue('HOMESLIDER_HEIGHT', '300');
  $res &= Configuration::updateValue('HOMESLIDER_SPEED', '500');
  $res &= Configuration::updateValue('HOMESLIDER_PAUSE', '3000');
  $res &= Configuration::updateValue('HOMESLIDER_LOOP', '1');
  /* Creates tables */
  $res &= $this->createTables();
  /* Adds samples */
  if ($res)
$this->installSamples();
  return $res;
 }
 return false;
}
/**
 * Adds samples
.........

Edited by tom21 (see edit history)
Link to comment
Share on other sites

En voici une version corrigée et light.

 

Concernant les erreurs:

  • Il faut inclure la classe correspondante au module étendu (include_once(_PS_MODULE_DIR_.'homeslider/homeslider.php');) ;
  • Il faut étendre le module et non la classe "Module" (extends HomeSlider) ;
  • Il faut indiquer le nom du module en fonction du nouveau module ($this->name = 'homeslider2';, par exemple) ;

Concernant la version light:

  • Pas besoin de recopier le code en entier. Sinon, la technique est inutile voir même complètement nulle ;
  • Il faut modifier les quelques données souhaitées (comme le nom voire l'auteur) ;
  • Il faut rajouter les hooks souhaités.

<?php
if (!defined('_PS_VERSION_'))
exit;
include_once(_PS_MODULE_DIR_.'homeslider/homeslider.php');
include_once(_PS_MODULE_DIR_.'homeslider/HomeSlide.php');
class HomeSlider2 extends HomeSlider
{
public function __construct()
{
  parent::__construct();
  $this->name = 'homeslider2';
}

public function install()
{
  /* Adds Module */
  if (!parent::install())
   return false;
  if (!$this->registerHook('displayTop'))
   return false;

  return true;
}

public function hookDisplayTop()
{

}
}

Link to comment
Share on other sites

Bonjour,

 

Comme je l'ai déjà dit, j'ai dupliqué le module pour le positionner sur le hook top. Cela marche bien

avec Internet Explorer, mais pas avec Firefox. Comment pourrais je y remédier ? Je poste une image fin de vous montrer précisément mon problème.

 

 

Merci d'avance.

 

 

h-page-slider.png

Link to comment
Share on other sites

  • 3 weeks later...

Dans mon test, ça l'était. (Tout en sachant que le module original était désactivé).

 

Cela fonctionne en effet mais si j'active la copie du module, cela active aussi le module original. Je me retrouve donc avec deux modules activés. J'imagine que je dois dédoublonner les fonctions d'installation ?

Link to comment
Share on other sites

Je me réponds à moi-même.

Pour distinguer les deux modules, je procède ainsi :

Au lieu d'appeler le parent::__construct() qui équivaut donc au module original, j'appelle Module::__construct() ce qui courcircuite la configuration faite par le module original. J'ai donc ce code :

Cela fonctionne bien, je ne pense pas que cela cause de problème particulier mais à vérifier cependant.

 

class Blocktopmenu2 extends Blocktopmenu
{
public function __construct()
{

 $this->name = 'blocktopmenu2';
 $this->tab = 'front_office_features';
 $this->version = 1.5;
 $this->author = 'PrestaShop - override de toto';

 Module::__construct();
etc...

 

a+

Edited by PSBeginner (see edit history)
Link to comment
Share on other sites

Exact. En fait, c'est encore un peu chaotique comme méthode... Il faut parfois installer le premier pour avoir les installations correctes et le désactiver par après... Mais bon. C'est une technique qui à le mérite d'exister et de, peut-être, aider un peu :)

Link to comment
Share on other sites

En fait cela marche plutôt bien.

Je me suis heurté aux déclarations privées (private) de fonctions et variables du parent mais si on fait bien le boulot de les recopier et d'ajuster les appels, tout fonctionne comme sur des roulettes et le jeu de l'override garde son intérêt.

Link to comment
Share on other sites

Cette méthode est séduisante mais le soucis c'est au niveau des fichiers inclus par le module (js,php,css ..)

 

Voici les différents cas d'inclusion de fichier que j'ai vu dans les modules :

CAS 1 le dossier courant + nom du fichier à inclure

CAS 2 répertoire des modules + nom du module(en dur) + nom du fichier à inclure

CAS 3 répertoire des modules + nom du module(propriété name du module) + nom du fichier à inclure

 

Dans le cas des fichiers CSS / JS on se retrouve avec:

CAS 1 et CAS 2override en utilisant l'ancien nom du module et pas le nouveau

CAS 3 override en utilisant le nouveau nom du module

 

Dans le cas des fichiers PHP on se retrouve avec:

CAS 1 + CAS3 obliger de copier le fichier dans le répertoire du nouveau module en perdant les mise à jour du fichier dans le module d'origine

CAS 2 OK on conserve bien les mises à jour

 

J'espère ne pas avoir dit de bêtises, dans tout les cas cela implique de faire bien attention avec toute les inclusions faite par le module, le processus d'ajout d'un hook tout en conservant les mises à jour du module n'est donc toujours pas une "tâche aisée" et implique d'avoir des doublons de module en BO

Edited by wokky (see edit history)
Link to comment
Share on other sites

  • 2 weeks later...

En grand merci pour cette solution! :)

 

J'ai toute fois deux problèmes:

  • Impossible de changer les points d'accroches ni d'en supprimer (message: le module ne peut être chargé)
  • Problème à la désinstallation du module (la supression des entrées dans la table ne se fait pas: module, module_acces, etc.)

 

Avez-vous aussi ces problèmes?

Edited by Clem01 (see edit history)
Link to comment
Share on other sites

Impossible de changer les points d'accroches ni d'en supprimer (message: le module ne peut être chargé)

Problème à la désinstallation du module (la supression des entrées dans la table ne se fait pas: module, module_acces, etc.)

Il est possible que des problèmes apparaissent, la méthode étant un peu exotique mais concernant tes problèmes j'ai plutôt l'impression qu'ils sont liés à autre chose.

"Le module ne peut être chargé" => j'ai déjà eu le problème (en dehors de la méthode discutée), je ne sais plus trop à quoi cela est lié maisc'est surement une histoire de contrôle d'existence du module et de sa bonne distinction avec son module parent etc...

Pour la désinstallation, il faut la présence de la fonction uninstall dans le module "enfant" sinon ce dernier ne sera pas désinstallé car ce sera la fonction parente (donc du module parent) qui sera appelée. Mais ce n'est peut-être pas exactement ton problème, je fais une supposition... :)

Edited by PSBeginner (see edit history)
Link to comment
Share on other sites

Après quelques tests, cette solution semble sans faille... :wub:

On se retrouve avec les surcharges js, css et php au même endroit du coups.

 

Ps: dans le lien donné (PS 1.4) ils surchargent avec la variable: $moduleName, en 1.5 c'est $module_name

Link to comment
Share on other sites

  • 3 weeks later...

Bonjour !

 

Je débute plus ou moins sur prestashop, et je désire justement faire passer le homeslide de base qui est restreint au block displayHome au block displayTop. C'est justement ce dont vous parliez. Mais je ne suis pas sur d'avoir tout compris à votre conversation.

 

Pouvez vous me dire concrètement ce que je dois faire pour avoir mon homeslide dans le block displayTop?

 

Merci d'avance !

Link to comment
Share on other sites

Bonjour,

 

Voici une nouvelle méthode que je viens de mettre au point. Elle n'est peut-être pas top et (là, je suis sur) ne fonctionne pas avec des modules qui requiert l'accès à des méthodes qui sont privées.

 

Cette méthode consiste en un module. Le voici:

 

Pouvez-vous me dire ce que vous en pensez, que ce soit en utilisabilité, en cout serveur ou quoi que ce soit, éventuellement ?

Link to comment
Share on other sites

Merci de vos réponses. Juste pour bien comprendre: je dois installer ces .zip comme des modules, et ensuite greffer le carrousel au block displayTop? Parce que si tel est le cas, je n'ai pas réussi à le faire fonctionner.

 

Detail qui peut avoir son importance, je suis sous Prestashop 1.5 .

Link to comment
Share on other sites

Non, il s'agit d'un "complément de module" pour Prestashop 1.5. Il n'y a rien à installer.

Il faut simplement placer une partie des fichiers dans override et l'autre dans votre thème.

Une fois l'opération faite, vous devrez aller dans Modules > Positions et greffer le module "carrousel" sur le hook "displayTop"

Link to comment
Share on other sites

J'ai bien placé les fichiers dans les dossiers respectifs, mais malgré plusieurs essais ça ne fonctionne hélas pas chez moi.

J'ai essayé de dégreffer le block de la homepage puis de le mettre dans le top, ça ne marche pas. J'ai essayé de le laisser dans la homepage, de le greffer dans le top pour le supprimer ensuite de la homepage, ça ne fonctionne pas non plus. :unsure:

Link to comment
Share on other sites

Après test, je me suis rendu compte qu'il y avait un léger souçis au niveau du dossier fournit.

 

Dans ton thème, tu as placé le dossier homeslider à la racine ce qui est faux!!

 

Il faut placer ce dernier dans:

/themes/mon-theme/modules/

 

ET PAS

 

/themes/mon-theme/

 

Voici le pack corrigé: override_exemple.zip

 

J'ai testé, c'est OK de mon côté maintenant ;-)

  • Like 1
Link to comment
Share on other sites

  • 5 months later...

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