Problème création de hook

Bonjour,

Je cherche à développer un module lié en partie au module Projet. Je souhaitais me servir des hooks, et peut-être ai-je mal compris, mais je suis tombé sur quelque chose qui me choque (et pire encore, me bloque).

Je souhaite rajouter un champ sur la fiche de création d’un projet, à l’aide d’un hook (fichier concerné: htdocs/projet/fiche.php)

$hookmanager->initHooks(array(‹ projectcard ›));

Je comprends que l’on initialise le hook lié au contexte ‹ projectcard ›. Le problème, c’est qu’à aucun moment il n’y a executeHooks(‹ projectcard ›)! Il y a cependant des executeHooks(‹ formObjectOptions ›) ou executeHooks(‹ doActions ›), jamais initialisés. J’ai essayé de créer mon hook, dans mon nouveau projet, en suivant scrupuleusement la doc. Il ne se déclenche pas, à moins d’initialiser ‹ formObjectOptions ›, ce qui revient à modifier fiche.php.

Peut-être ai-je mal compris le système, toujours est-il que voir ce projectcard initialisé et jamais utilisé, et formObjectOptions et doActions exécutés mais jamais initialisés, j’ai l’impression qu’il y a un problème non?

Pour en revenir à mon module, quelqu’un saurait-il comment m’en sortir avec mon hook? Il est censé ajouter un champ à la fiche de création d’un projet je rappelle.

Merci d’avance!

Bonjour
Si votre but n’est que d’ajouter un champs sur la fiche projet, pourquoi ne pas utiliser les extrafields?

Utiliser les extrafields est possible dans mon propre module sans modifier les autres?

Pouvez-vous préciser votre question
A titre d’infos, dans certains de mes modules (Equipement, Factory, …) j’ai ajouté la possibilité de rajouter des champs supplémentaires, quand ce n’est pas directement la possibilité de rajouter des onglets (customTabs)

Salut, alors juste pour rebondir sur l’usage du hook à proprement parler, tout ce que tu as vu est normal. Le init hook définit u contexte d’appel que tu dois avoir toi même déclaré dans le core de ton module. Les execute derrière lancent simplement les fonctions du même nom dans ta classe de hook.

Ici celle qui t’intéresse est la formobjectoption. Tout ce que tu afficheras dans cet appel de hook s’affichera dans la fiche projet (utile pour un champs calculé, un lien,…). Sinon je rejoins Charles sur l’usage préférable d’un extrafield projet qui les gère. Tu peux parfaitement les déclarer dans le init de ton module (addextrafield) et ensuite les analyser au travers du hook ou bien d’un trigger.

Je sais que tout ça et un peu obscur mais après lecture et relecture du wiki sur le sujet ça finit par rentrer :wink:

Pour préciser ma question:

Je souhaite créer un module qui permettra (entre autres fonctionnalités) d’afficher un champ supplémentaire sur la fiche d’un autre module, qui se trouve être un module Dolibarr. Je ne peux donc pas modifier directement le module existant, voilà pourquoi je pensais passer par un hook.

Sinon, je pense avoir compris:
initHooks(‹ projectcard ›) => projectcard = contexte
executeHooks(‹ formObjectOptions ›) => formObjectOptions = fonction à créer dans ma classe ActionsMonmodule
Il faut donc déclarer dans mon descripteur ‹ projectcard › et non ‹ formObjectOptions ›

Je débute totalement et je tâtonne pas mal, merci pour vos réponses. Je vais creuser cette idée des extrafields, je ne suis pas encore assez renseigné dessus pour savoir comment les utiliser :happy:

Bonsoir
Je reprend ce fil car ma question porte sur la mise en place d’un hook personnel.
Mon souci est de mettre en dictionnaire une liste associant un statut et une couleur. La saisie de couleur conviviale de Agefood me satisfait. Je veux donc l’introduire sur un champ ‹ couleur › de oin dictionnaire.
Je suis donc allée voir les hook.
Dans hookmanager.class , on indique que le type de hook output est à éviter, or le type addreplace est pris par le manager si seulement si la méthode choisie se trouve dans une liste précise.
Mais le executehook de dict.php lance les méthodes viewDictionaryFieldlist, editDictionaryFieldlist ou createDictionaryFieldlist , aucne de ces méthodes n’apparait dans le tableau donnant le type addreplace.
De plus, executeHook ne retourne rien dans le cas d’un type Output , ou du moins pas dans $result comme c’est prévu dans dict.php.
Que dois-je faire: modifier les hook de dict.pgp pour les remplaces par ‹ doActions › ou formObjectOptions ou bien modifier hookmanager.php pour mettre ces méthodes dans le tableau standard

J’espère avoir été claire, cela parlera à quelqu’un qui programme les hook.
Merci
Claude

Bonsoir,

j’ai voulu modifier aussi la présentation du dictionnaire par les hooks viewDictionaryFieldlist, editDictionaryFieldlist et createDictionaryFieldlist de dict.php pour les tables de mon module.

En version 3.8.2 dans dict.php, j’ai détecté une incohérence: la méthode executeHooks renvoie $resaction.
Pour le type ‹ addreplace ›, $resaction est bien renseignée.
Par contre si le type n’est pas ‹ addreplace ›, c’est une variable $result qui est utilisée, et elle n’est pas reversée dans $resaction.

Conséquence: executeHooks retourne toujours vide dans ce 2eme cas.

Solution : dans hookmanager.class.php, remplacer les occurrence de $result par $resaction (entre la ligne 203 et la fin). A partir de là, tout fonctionne comme souhaité :

liste_dictionnaire.png

Si cela peut aider…