Line 12:
Line 12:
=Introduction=
=Introduction=
−
Les Hooks sont une fonctionnalité, pour les développeurs, leur permettant d'ajouter du code personnalisé aux pages standards de Dolibarr sans avoir à modifier les fichiers du coeur de Dolibarr. Contrairement au [[Système de Triggers]] (autre manière d'interagir avec le code de Dolibarr) qui sont liés aux événements de Dolibarr, les Hooks peuvent s'exécuter n'importe ou et à n'importe quel moment dès lors qu'ils ont été prévu dans le core de Dolibarr. Ce sont des points d'insertion dans le programme.
+
Les Hooks (hameçon en anglais) sont une fonctionnalité destinée aux développeurs, leur permettant d'ajouter du code personnalisé aux pages standards de Dolibarr sans avoir à modifier le ''core'' de Dolibarr. Contrairement au [[Système de Triggers]] (autre manière d'interagir avec le code de Dolibarr) qui sont liés aux événements de Dolibarr, les Hooks peuvent s'exécuter n'importe ou et à n'importe quel moment dès lors qu'ils ont été prévus dans le ''core'' de Dolibarr. Ce sont des points d'insertion dans le programme.
*Les Hooks sont actifs ou pas selon un contexte (souvent un contexte par module : par exemple "productcard" pour les produits, "invoicecard" pour les factures...). Pour trouver les Hooks existants faites une recherche pour "'''initHooks('''"
*Les Hooks sont actifs ou pas selon un contexte (souvent un contexte par module : par exemple "productcard" pour les produits, "invoicecard" pour les factures...). Pour trouver les Hooks existants faites une recherche pour "'''initHooks('''"
Line 18:
Line 18:
=Ajouter un hook pour permettre l'insertion de code=
=Ajouter un hook pour permettre l'insertion de code=
−
Pour implémenter un hook dans votre propre module (afin que votre module puisse être "hooké" par d'autres), vous devrez procéder à 2 étapes.
+
Pour implémenter un hook dans votre propre module (afin que votre module puisse être "hameçonné" par d'autres), vous devrez procéder en 2 étapes.
Ces étapes doivent êtres reproduites pour chaque script php de votre module où vous voulez implémenter des hooks.
Ces étapes doivent êtres reproduites pour chaque script php de votre module où vous voulez implémenter des hooks.
Line 25:
Line 25:
1- Initialiser l'object HookManager
1- Initialiser l'object HookManager
−
Pour une page, placez ce bout de code au début de votre script php (après le include du main):
+
Pour une page, placez ce bout de code au début de votre script php (après le ''include'' du ''main''):
−
<syntaxHighlight lang="php">
+
<syntaxhighlight lang="php">
// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array
// Initialize technical object to manage hooks of thirdparties. Note that conf->hooks_modules contains array array
include_once(DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php');
include_once(DOL_DOCUMENT_ROOT.'/core/class/hookmanager.class.php');
$hookmanager=new HookManager($db);
$hookmanager=new HookManager($db);
$hookmanager->initHooks(array('context'));
$hookmanager->initHooks(array('context'));
−
</syntaxHighlight>
+
</syntaxhighlight>
$hookmanager->initHooks() accepte 1 paramètre (un array de contextes) et active la prise en charge des hooks pour ce script. '<nowiki/>'''context'''' est la chaine qui contient le contexte d'exécution. C'est un simple indicateur qui peut être utilisé par les fonctions de hook pour détecter dans quel cas elles sont appelées (plusieurs pages/modules peuvent appeler le même hook à différent endroit, et une fonction de hook peut ne vouloir s'exécuter que pour un contexte donné et pas les autres).
$hookmanager->initHooks() accepte 1 paramètre (un array de contextes) et active la prise en charge des hooks pour ce script. '<nowiki/>'''context'''' est la chaine qui contient le contexte d'exécution. C'est un simple indicateur qui peut être utilisé par les fonctions de hook pour détecter dans quel cas elles sont appelées (plusieurs pages/modules peuvent appeler le même hook à différent endroit, et une fonction de hook peut ne vouloir s'exécuter que pour un contexte donné et pas les autres).
−
Note: Vous pouvez positionner plusieurs contextes en même temps (par exemple si vous avez besoin d'avoir un context commun à plusieurs pages mais que vous voulez aussi un context propre à une page donnée).
+
Note: Vous pouvez positionner plusieurs contextes en même temps (par exemple si vous avez besoin d'avoir un contexte commun à plusieurs pages mais que vous voulez aussi un contexte propre à une page donnée).
Pour une méthode ou fonction, il est possible de récupérer le gestionnaire de Hook par:
Pour une méthode ou fonction, il est possible de récupérer le gestionnaire de Hook par:
−
<syntaxHighlight lang="php">
+
<syntaxhighlight lang="php">
global $hookmanager;
global $hookmanager;
−
</syntaxHighlight>
+
</syntaxhighlight>
−
2- Placer ensuite l'appel des hooks la où permettre l'ajout de code:
+
2- Placer ensuite l'appel des hooks là où l'ajout de code est désiré :
<source lang="php">
<source lang="php">
Line 67:
Line 67:
- '''$object''' est l'objet que vous voulez passer à la fonction du hook, certainement les données du module courant (ex: l'objet facture si on est dans un module de facture, etc..). Ce peut être ce que vous voulez, mais souvenez vous qu'il sera le principal composant utilisé par les fonctions du hook.
- '''$object''' est l'objet que vous voulez passer à la fonction du hook, certainement les données du module courant (ex: l'objet facture si on est dans un module de facture, etc..). Ce peut être ce que vous voulez, mais souvenez vous qu'il sera le principal composant utilisé par les fonctions du hook.
−
- '''$action''' est une chaîne indiquant l'action courante (peut être null ou quelque chose qui ressemble à 'create' ou 'edit').
+
- '''$action''' est une chaîne indiquant l'action courante (peut être ''null'' ou quelque chose qui ressemble à 'create' ou 'edit').
Note: Vous devrez refaire cette étape plusieurs fois si vous voulez ajouter plusieurs hooks à différent endroits de votre script.
Note: Vous devrez refaire cette étape plusieurs fois si vous voulez ajouter plusieurs hooks à différent endroits de votre script.
−
Maintenant votre module devrait pouvoir être hooké, vous pouvez suivre la procédure ci-dessous dans '''Implémenter un hook''' pour implémenter une fonction hook qui en prendra avantage (permet aussi de tester que cela fonctionne).
+
Maintenant votre module devrait pouvoir être "hameçonné". Vous pouvez à présent suivre la procédure ci-dessous ( '''Implémenter un hook''' ) pour construire une fonction qui se raccrochera au hook (permet aussi de tester que cela fonctionne).
=Implémenter un Hook=
=Implémenter un Hook=
Line 89:
Line 89:
print('Module context: '.$object->context);
print('Module context: '.$object->context);
</source>
</source>
−
(rajoutez ce bout de code dans le fichier php où réside l'appel des hooks, et supprimez le, une fois la valeur du context relevée).
+
(rajoutez ce bout de code dans le fichier php où réside l'appel des hooks, et supprimez le, une fois la valeur du contexte relevée).
−
[[File:warning.png]] Attention: N'oubliez pas de désactiver puis de réactiver votre module dans l'interface d'administration des modules afin que la modification soit prise en compte car la sauvegarde des couples "modules-hooks" qui doit être gérée est faite en base, laquelle n'est mise à jour qu'au moment de l'activation du module.
+
[[File:warning.png]] Attention: N'oubliez pas de désactiver puis de réactiver votre module dans l'interface d'administration des modules (ou directement dans le "constructeur de module") afin que la modification soit prise en compte, car l'enregistrement qui relie les éléments du couple "module-hook" est géré en base de donnée; celle-ci n'étant mise à jour qu'au moment de la (ré)activation du module.