Difference between revisions of "Système de Hooks"
Tag: 2017 source edit |
m (Meilleure traduction du mot hook, capitaine) |
||
(9 intermediate revisions by 3 users not shown) | |||
Line 5: | Line 5: | ||
[[en:Hooks_system]] | [[en:Hooks_system]] | ||
[[es:El_sistema_Hooks]] | [[es:El_sistema_Hooks]] | ||
− | [[de:System_von_Hooks | + | [[de:System_von_Hooks]] |
[[zh:钩子系统]] | [[zh:钩子系统]] | ||
<!-- END interlang links --> | <!-- END interlang links --> | ||
Line 12: | Line 12: | ||
=Introduction= | =Introduction= | ||
− | Les Hooks sont une fonctionnalité | + | Les Hooks (crochet en anglais, dans le sens de détour) 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 où 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 " | + | Pour implémenter un hook dans votre propre module (afin que votre module puisse être "crocheté", "détourné" 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"> |
// 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> |
$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 | + | 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"> |
global $hookmanager; | global $hookmanager; | ||
− | </ | + | </syntaxhighlight> |
− | 2- Placer ensuite l'appel des hooks | + | 2- Placer ensuite l'appel des hooks là où l'ajout de code est désiré : |
− | < | + | <syntaxhighlight lang="php"> |
$parameters=array(); | $parameters=array(); | ||
$reshook=$hookmanager->executeHooks('hookname',$parameters,$object,$action); // See description below | $reshook=$hookmanager->executeHooks('hookname',$parameters,$object,$action); // See description below | ||
Line 54: | Line 54: | ||
... // standard code that can be disabled/replaced by hook if return code > 0. | ... // standard code that can be disabled/replaced by hook if return code > 0. | ||
} | } | ||
− | </ | + | </syntaxhighlight> |
'''$hookmanager->executeHooks()''' accepte 4 paramètres et ajoute un hook (qui est un point d'entrée dans votre script pour des fonctions externes à votre script et module): | '''$hookmanager->executeHooks()''' accepte 4 paramètres et ajoute un hook (qui est un point d'entrée dans votre script pour des fonctions externes à votre script et module): | ||
Line 61: | Line 61: | ||
- '''$parameters''' est un tableau personnalisé pour transmettre plus de données personnalisées au hook (la fonction dans le hook peut traiter ces données). Placez ici ce que vous voulez, ce peut être un fichier, un tableau de chaînes de caractères, n'importe quoi... Par exemple : | - '''$parameters''' est un tableau personnalisé pour transmettre plus de données personnalisées au hook (la fonction dans le hook peut traiter ces données). Placez ici ce que vous voulez, ce peut être un fichier, un tableau de chaînes de caractères, n'importe quoi... Par exemple : | ||
− | < | + | <syntaxhighlight lang="php"> |
$parameters=array('file'=>'my/path/to/a/file', 'customnames'=>array('henry','david','john')); | $parameters=array('file'=>'my/path/to/a/file', 'customnames'=>array('henry','david','john')); | ||
− | </ | + | </syntaxhighlight> |
- '''$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 | + | Maintenant votre module devrait pouvoir exécuté des hooks d'autres origines. 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 79: | Line 79: | ||
Ce qui veut dire que lorsqu'on se trouve dans le contexte donné, votre code sera appelé. | Ce qui veut dire que lorsqu'on se trouve dans le contexte donné, votre code sera appelé. | ||
Pour cela, éditer le descripteur de votre module ('''/htdocs/''yourmodulename''/core/modules/mod''YourModuleName''.class.php''') et renseignez la variable '''$this->module_parts''' comme sur l'exemple : | Pour cela, éditer le descripteur de votre module ('''/htdocs/''yourmodulename''/core/modules/mod''YourModuleName''.class.php''') et renseignez la variable '''$this->module_parts''' comme sur l'exemple : | ||
− | < | + | <syntaxhighlight lang="php"> |
$this->module_parts = array( | $this->module_parts = array( | ||
'hooks' => array('hookcontext1','hookcontext2') // Set here all hooks context you want to support | 'hooks' => array('hookcontext1','hookcontext2') // Set here all hooks context you want to support | ||
); | ); | ||
− | </ | + | </syntaxhighlight> |
− | Note: il est possible de trouver | + | Note: il est possible de trouver tous les contextes dans lequel vous êtes au sein d'une portion de code PHP en faisant |
− | < | + | <syntaxhighlight lang="php"> |
− | print('Module context: '.$object-> | + | print('Module context: '.join(',', $object->contextarray)); |
− | </ | + | </syntaxhighlight> |
− | (rajoutez ce bout de code dans le fichier | + | (rajoutez ce bout de code dans le fichier PHP où réside l'appel des hooks, et supprimez le, une fois la valeur des contextes 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 | + | Notez que le contexte '''all''' signifie que vous souhaitez que votre hook soit exécuté quel que soit le contexte. Le '''main''' signifie que vous voulez que votre hook soit exécuté pour n'importe quelle page Web, et '''cli''' signifie dans chaque script de ligne de commande (même si vous ne pouvez pas voir ces clés de contexte dans $object->contextarray). |
+ | |||
+ | [[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. | ||
Line 98: | Line 100: | ||
Créez '''/htdocs/''yourmodulename''/class/actions_''yourmodulename''.class.php''' dans votre module avec un code qui contient la méthode appelée par le hook (le nom de cette méthode se voit au moment de l'appel executeHooks). Voici un exemple: | Créez '''/htdocs/''yourmodulename''/class/actions_''yourmodulename''.class.php''' dans votre module avec un code qui contient la méthode appelée par le hook (le nom de cette méthode se voit au moment de l'appel executeHooks). Voici un exemple: | ||
− | < | + | <syntaxhighlight lang="php"> |
class ActionsYourModuleName | class ActionsYourModuleName | ||
{ | { | ||
Line 137: | Line 139: | ||
} | } | ||
} | } | ||
− | </ | + | </syntaxhighlight> |
La méthode sera alors automatiquement appelée au moment de l'appel du code qui contient le executeHooks fournissant à votre code les éléments $parameters, $object et $action. | La méthode sera alors automatiquement appelée au moment de l'appel du code qui contient le executeHooks fournissant à votre code les éléments $parameters, $object et $action. | ||
− | '''Avec''': | + | '''Avec''' : |
*'''$parameters''' est un tableau (array) de meta-data regroupant les données du hook (son contexte accessible par $parameters['context'] mais d'autres information peuvent etre disponible selon le cas) | *'''$parameters''' est un tableau (array) de meta-data regroupant les données du hook (son contexte accessible par $parameters['context'] mais d'autres information peuvent etre disponible selon le cas) | ||
*'''$object''' est l'objet sur lequel vous désirez travailler (par exemple : product pour le contexte productcard) | *'''$object''' est l'objet sur lequel vous désirez travailler (par exemple : product pour le contexte productcard) | ||
*'''$action''' désigne l'action à exécuter (par exemple "create", "edit" or "view"). | *'''$action''' désigne l'action à exécuter (par exemple "create", "edit" or "view"). | ||
− | *'''$hookmanager''' n'est propagé que pour permettre à votre hook d'appeler d'autres hooks. | + | *'''$hookmanager''' n'est propagé que pour permettre à votre hook d'appeler d'autres hooks.<br /> |
− | '''Retours''': | + | '''Retours de fonction''' : |
*Le code retour d'un hook doit être 0 ou 1 en cas de succès, négatif en cas d'erreur. En général, il sera 0. Il peut être 1, ce qui dans certains cas signifie que ce que fait votre hook remplace complètement ce que devait faire Dolibarr juste après l'appel du hook. Si le code est négatif, il est possible de fournir un message d'erreur à l'utilisateur en positionnant $this->errors[]='Message erreur' | *Le code retour d'un hook doit être 0 ou 1 en cas de succès, négatif en cas d'erreur. En général, il sera 0. Il peut être 1, ce qui dans certains cas signifie que ce que fait votre hook remplace complètement ce que devait faire Dolibarr juste après l'appel du hook. Si le code est négatif, il est possible de fournir un message d'erreur à l'utilisateur en positionnant $this->errors[]='Message erreur' | ||
Line 165: | Line 167: | ||
− | =Liste des | + | =Liste des Contextes disponibles dans Dolibarr= |
Pour trouver les contextes disponibles dans Dolibarr, la procédure est similaire aux hooks. | Pour trouver les contextes disponibles dans Dolibarr, la procédure est similaire aux hooks. | ||
Faites une recherche sur "'''initHooks('''" dans le code source et vous trouverez facilement tous les contextes déjà implémentées. | Faites une recherche sur "'''initHooks('''" dans le code source et vous trouverez facilement tous les contextes déjà implémentées. |
Latest revision as of 14:15, 28 April 2024
Introduction
Les Hooks (crochet en anglais, dans le sens de détour) 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 où 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 des fonctions qui s'insèrent dans ou remplacent le code standard. Pour rechercher le code qu'il est possible de surcharger faites une recherche pour "executeHooks(".
Ajouter un hook pour permettre l'insertion de code
Pour implémenter un hook dans votre propre module (afin que votre module puisse être "crocheté", "détourné" 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.
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):
// 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');
$hookmanager=new HookManager($db);
$hookmanager->initHooks(array('context'));
$hookmanager->initHooks() accepte 1 paramètre (un array de contextes) et active la prise en charge des hooks pour ce script. '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 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:
global $hookmanager;
2- Placer ensuite l'appel des hooks là où l'ajout de code est désiré :
$parameters=array();
$reshook=$hookmanager->executeHooks('hookname',$parameters,$object,$action); // See description below
// Note that $action and $object may have been modified by hook
if (empty($reshook))
{
... // standard code that can be disabled/replaced by hook if return code > 0.
}
$hookmanager->executeHooks() accepte 4 paramètres et ajoute un hook (qui est un point d'entrée dans votre script pour des fonctions externes à votre script et module):
- 'hookname' est le nom de la méthode qui sera appelée. Par exemple: 'formObjectOptions'
- $parameters est un tableau personnalisé pour transmettre plus de données personnalisées au hook (la fonction dans le hook peut traiter ces données). Placez ici ce que vous voulez, ce peut être un fichier, un tableau de chaînes de caractères, n'importe quoi... Par exemple :
$parameters=array('file'=>'my/path/to/a/file', 'customnames'=>array('henry','david','john'));
- $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').
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 exécuté des hooks d'autres origines. 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
Pour utiliser un Hook (donc ajouter ou surcharger une partie de code), vous devez d'abord avoir défini un descripteur de module (voir Développement_module#Créer_un_descripteur_de_Module_(obligatoire) pour cela). Ensuite vous devez suivre les étapes suivantes :
1. Ajouter votre module au contexte où le hook doit s'exécuter. Ce qui veut dire que lorsqu'on se trouve dans le contexte donné, votre code sera appelé. Pour cela, éditer le descripteur de votre module (/htdocs/yourmodulename/core/modules/modYourModuleName.class.php) et renseignez la variable $this->module_parts comme sur l'exemple :
$this->module_parts = array(
'hooks' => array('hookcontext1','hookcontext2') // Set here all hooks context you want to support
);
Note: il est possible de trouver tous les contextes dans lequel vous êtes au sein d'une portion de code PHP en faisant
print('Module context: '.join(',', $object->contextarray));
(rajoutez ce bout de code dans le fichier PHP où réside l'appel des hooks, et supprimez le, une fois la valeur des contextes relevée).
Notez que le contexte all signifie que vous souhaitez que votre hook soit exécuté quel que soit le contexte. Le main signifie que vous voulez que votre hook soit exécuté pour n'importe quelle page Web, et cli signifie dans chaque script de ligne de commande (même si vous ne pouvez pas voir ces clés de contexte dans $object->contextarray).
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.
2. Pour remplacer une fonction existante par la votre (surcharge)
Créez /htdocs/yourmodulename/class/actions_yourmodulename.class.php dans votre module avec un code qui contient la méthode appelée par le hook (le nom de cette méthode se voit au moment de l'appel executeHooks). Voici un exemple:
class ActionsYourModuleName
{
/**
* Overloading the doActions function : replacing the parent's function with the one below
*
* @param array() $parameters Hook metadatas (context, etc...)
* @param CommonObject &$object The object to process (an invoice if you are in invoice module, a propale in propale's module, etc...)
* @param string &$action Current action (if set). Generally create or edit or null
* @param HookManager $hookmanager Hook manager propagated to allow calling another hook
* @return int < 0 on error, 0 on success, 1 to replace standard code
*/
function doActions($parameters, &$object, &$action, $hookmanager)
{
$error = 0; // Error counter
$myvalue = 'test'; // A result value
print_r($parameters);
echo "action: " . $action;
print_r($object);
if (in_array('somecontext', explode(':', $parameters['context'])))
{
// do something only for the context 'somecontext'
}
if (! $error)
{
$this->results = array('myreturn' => $myvalue);
$this->resprints = 'A text to show';
return 0; // or return 1 to replace standard code
}
else
{
$this->errors[] = 'Error message';
return -1;
}
}
}
La méthode sera alors automatiquement appelée au moment de l'appel du code qui contient le executeHooks fournissant à votre code les éléments $parameters, $object et $action.
Avec :
- $parameters est un tableau (array) de meta-data regroupant les données du hook (son contexte accessible par $parameters['context'] mais d'autres information peuvent etre disponible selon le cas)
- $object est l'objet sur lequel vous désirez travailler (par exemple : product pour le contexte productcard)
- $action désigne l'action à exécuter (par exemple "create", "edit" or "view").
- $hookmanager n'est propagé que pour permettre à votre hook d'appeler d'autres hooks.
Retours de fonction :
- Le code retour d'un hook doit être 0 ou 1 en cas de succès, négatif en cas d'erreur. En général, il sera 0. Il peut être 1, ce qui dans certains cas signifie que ce que fait votre hook remplace complètement ce que devait faire Dolibarr juste après l'appel du hook. Si le code est négatif, il est possible de fournir un message d'erreur à l'utilisateur en positionnant $this->errors[]='Message erreur'
- Si la méthode positionne la propriété $this->results avec un tableau, alors le tableau $hookmanager->resArray sera automatiquement enrichi avec le contenu de ce tableau, lequel pourra être réutilisé plus tard.
- Si la méthode positionne la propriété $this->resprints avec une chaîne, alors cette chaîne sera affiché par le gestionnaire de hook (executeHook), tout de suite à la sortie de votre méthode.
- Votre hook peut de plus modifier les valeurs de $object et $action.
Liste des Hooks disponibles dans Dolibarr
Trouver les hooks disponibles dans Dolibarr ? Faites une recherche sur "executeHooks(" dans le code source et vous trouverez facilement toutes les fonctions déjà implémentées.
En voici une liste (non complète) : Category:Hooks ...
Note: veuillez noter que cette liste s'enrichit à chaque version, donc si vous voulez vraiment savoir si un hook ou contexte spécifique existe, veuillez chercher directement dans le code source avec la méthode indiquée ci-dessus.
Liste des Contextes disponibles dans Dolibarr
Pour trouver les contextes disponibles dans Dolibarr, la procédure est similaire aux hooks. Faites une recherche sur "initHooks(" dans le code source et vous trouverez facilement tous les contextes déjà implémentées.
adherents\card.php(111): membercard
adherents\type.php(73): membertypecard
categories\categorie.php(96): categorycard
comm\card.php(72): commcard
comm\propal.php(99): propalcard
comm\action\card.php(85): actioncard
comm\action\index.php(112): agenda
comm\mailing\card.php(55): mailingcard
commande\card.php(93): ordercard
compta\facture.php(105): invoicecard
compta\paiement.php(70): paiementcard
compta\deplacement\card.php(50): tripsandexpensescard
compta\dons\card.php(53): doncard
compta\localtax\clients.php(172): externalbalance
compta\salaries\card.php(47): salarycard
compta\tva\card.php(45): taxvatcard
contact\card.php(77): contactcard
contrat\card.php(70): contractcard
expedition\card.php(85): expeditioncard
fichinter\card.php(80): interventioncard
fourn\card.php(54): suppliercard
fourn\commande\card.php(80): ordersuppliercard
fourn\commande\orderstoinvoice.php(88): orderstoinvoicesupplier
fourn\facture\card.php(72): invoicesuppliercard
fourn\facture\paiement.php(71): paymentsupplier
livraison\card.php(68): deliverycard
product\card.php(91): productcard
product\composition\card.php(55): productcompositioncard
product\fournisseurs.php(62): pricesuppliercard
product\stats\commande.php(45): productstatsorder
product\stats\commande_fournisseur.php(45): productstatssupplyorder
product\stats\contrat.php(45): productstatscontract
product\stats\facture.php(48): productstatsinvoice
product\stats\facture_fournisseur.php(47): productstatssupplyinvoice
product\stats\propal.php(45): productstatspropal
product\stock\card.php(54): warehousecard
projet\card.php(48): projectcard
projet\tasks.php(67): projecttaskcard
resource\card.php(60): resource_card
resource\element_resource.php(58): element_resource
societe\agenda.php(41): agendathirdparty
societe\commerciaux.php(40): salesrepresentativescard
societe\consumption.php(80): consumptionthirdparty
societe\info.php(41): infothirdparty
societe\soc.php(80): thirdpartycard
user\card.php(93): usercard
user\list.php(72): userlist
user\passwordforgotten.php(56): passwordforgottenpage
Note: veuillez noter que cette liste s'enrichie à chaque version, donc si vous voulez vraiment savoir si un hook ou contexte spécifique existe, veuillez chercher directement dans le code source avec la méthode indiquée ci-dessus.