Line 2:
Line 2:
<!-- Do NOT edit this section
<!-- Do NOT edit this section
Links below are automatically managed by PolyglotBot
Links below are automatically managed by PolyglotBot
−
You can edit links on the English source page : Triggers -->
+
You can edit links on the English source page : Triggers_system -->
−
[[en:Triggers]]
+
[[en:Triggers_system]]
[[es:Triggers-acciones]]
[[es:Triggers-acciones]]
+
[[zh:触发系统]]
<!-- END interlang links -->
<!-- END interlang links -->
{{TemplateDocDevFr}}
{{TemplateDocDevFr}}
−
= Ajouter son code sur un événement métier =
+
=Ajouter son code sur un événement métier=
Pour permettre de déclencher du code personnalisé en réaction à un événement Dolibarr (création/modification/suppression d'une société/facture/produit/utilisateur ou autre), Dolibarr propose un mécanisme de triggers métiers. Ce mécanisme vous permet de personnaliser un workflow afin que les événements de gestion Dolibarr soient répercutés dans une autre application par exemple.
Pour permettre de déclencher du code personnalisé en réaction à un événement Dolibarr (création/modification/suppression d'une société/facture/produit/utilisateur ou autre), Dolibarr propose un mécanisme de triggers métiers. Ce mécanisme vous permet de personnaliser un workflow afin que les événements de gestion Dolibarr soient répercutés dans une autre application par exemple.
Rien n'empêche également de l'utiliser pour modifier le comportement de Dolibarr même: par exemple, pour que la validation d'une facture provoque la création d'un contrat automatiquement.
Rien n'empêche également de l'utiliser pour modifier le comportement de Dolibarr même: par exemple, pour que la validation d'une facture provoque la création d'un contrat automatiquement.
−
Notez que les Triggers sont une fonctionnalité pour les développeurs qui est limitée aux événements métiers CRUD (Créer | Lire (Read) | Mettre à jour (Update) | Supprimer (Delete)). Il existe une autre fonctionnalité permettant aux développeurs d'injecter du code personnalisé dans une application appelée le [[Système de Hooks]].
+
Notez que les Triggers sont une fonctionnalité pour les développeurs, qui est limitée:
+
* aux événements métiers CRUD (Créer | Mettre à jour (Update) | Supprimer (Delete)).
+
* ou au changement du statut principal d'un objet.
+
Pour les autres cas, il existe une autre fonctionnalité permettant aux développeurs d'injecter du code personnalisé dans une application appelée le [[Système de Hooks]]. Note: Historiquement, l'envoi d'un email génère aussi un appel trigger bien que ne rentrant pas dans le cadre des 2 cas précédents autorisés.
+
Donc, pour ajouter son propre code qui sera déclenché par trigger, la procédure est la suivante:
Donc, pour ajouter son propre code qui sera déclenché par trigger, la procédure est la suivante:
−
1) Copier le fichier '''htdocs/core/triggers/interface_90_all_Demo.class.php-NORUN''' sous le nom:
+
1) Copier le fichier modèle '''htdocs/modulebuilder/template/core/triggers/interface_99_modMyModule_MyModuleTriggers.class.php''' sous le nom:
−
* '''interface_99_all_''Xxx''.class.php'''
+
+
*'''interface_99_''all_Xxx''.class.php'''
+
ou bien
ou bien
−
* '''interface_99_mod''MonModule_Xxx''.class.php'''
+
−
où ''Xxx'' est une chaine de votre choix commençant par une majuscule, ''99'' est le numéro de priorité du trigger (''01'' étant le plus prioritaire), ''MonModule'' est le nom du module si votre trigger ne doit être activé que si le module MonModule est actif. Si on désire que le trigger soit toujours actif, on mettra ''all'' à la place de modMonModule.
+
*'''interface_99_''modMonModule_Xxx''.class.php'''
+
+
où ''Xxx'' est une chaîne de votre choix commençant par une majuscule, ''99'' est le numéro de priorité du trigger (''01'' étant le plus prioritaire), ''MonModule'' est le nom du module si votre trigger ne doit être activé que si le module MonModule est actif. Si on désire que le trigger soit toujours actif, on mettra ''all'' à la place de modMonModule.
Il faut laisser ce nouveau fichier dans le même répertoire.
Il faut laisser ce nouveau fichier dans le même répertoire.
Rem: Les valeurs utilisables pour modMonModule sont visibles dans le répertoire
Rem: Les valeurs utilisables pour modMonModule sont visibles dans le répertoire
Line 31:
Line 40:
''htdocs/core/triggers/interface_99_modFacture_Monworkflow.class.php''
''htdocs/core/triggers/interface_99_modFacture_Monworkflow.class.php''
−
En créant un fichier nommé comme dans cet exemple, notre nouveau trigger sera déclenché à chaque évènement métier Dolibarr et à condition que le module Facture soit actif.
+
En créant un fichier nommé comme dans cet exemple, notre nouveau trigger sera déclenché à chaque événement métier Dolibarr et à condition que le module Facture soit actif.
−
'''Note''': Avec Dolibarr 3.2+, il est aussi possible de placer les fichiers triggers dans un sous-dossier de module. Ex: si le module réside dans htdocs/mymodule/, alors il est possible de placer les triggers dans htdocs/mymodule/core/triggers/.
+
'''Note''': Il est aussi possible de placer les fichiers triggers dans un sous-dossier d'un module externe. Ex: si le module réside dans htdocs/custom/mymodule/, alors il est possible de placer les triggers dans htdocs/custom/mymodule/core/triggers/.
−
Mais dans ce cas, le trigger ne sera trouvé que si vous le déclarer dans le fichier descripteur de votre module. Pour cela, ajouter ajouter triggers->1 dans le tableau module_parts (ex: '''/monmodule/core/modules/modMonModule.class.php'''):
+
Mais dans ce cas, le trigger ne sera trouvé que si vous le déclarer dans le fichier descripteur de votre module. Pour cela, ajouter triggers->1 dans le tableau module_parts (ex: '''/monmodule/core/modules/modMonModule.class.php'''):
−
<source lang="php">
+
<syntaxhighlight lang="php">
// Defined all module parts (triggers, login, substitutions, menus, etc...) (0=disable,1=enable)
// Defined all module parts (triggers, login, substitutions, menus, etc...) (0=disable,1=enable)
$this->module_parts = array('triggers' => 1);
$this->module_parts = array('triggers' => 1);
Line 42:
Line 51:
// 'substitutions' => 0,
// 'substitutions' => 0,
// 'menus' => 0);
// 'menus' => 0);
−
</source>
+
</syntaxhighlight>
Puis désactiver et réactiver le module. Ceci aura pour effet d'ajouter une ligne dans la [[Table llx_const]] pour indiquer à Dolibarr qu'il faut aussi rechercher les triggers dans le répertoire de votre module '''htdocs/monmodule/core/triggers'''.
Puis désactiver et réactiver le module. Ceci aura pour effet d'ajouter une ligne dans la [[Table llx_const]] pour indiquer à Dolibarr qu'il faut aussi rechercher les triggers dans le répertoire de votre module '''htdocs/monmodule/core/triggers'''.
−
2) Editer ce fichier ''interface_99_modMonModule_Monworkflow.class.php'' afin de renommer la classe ''InterfaceDemo'' par ''InterfaceMonworkflow''
+
2) Editer ce fichier ''interface_99_modMyModule_MyModuleTriggers.class.php'' afin de renommer la classe ''InterfaceMyModuleTriggers'' par ''InterfaceMonworkflow''
Ensuite, accéder à la page Accueil-> Infos Systèmes -> Dolibarr -> Triggers.
Ensuite, accéder à la page Accueil-> Infos Systèmes -> Dolibarr -> Triggers.
−
Votre fichier trigger doit apparaitre dans la liste sans erreur indiquant que les opérations précédentes ont été réalisées avec succès.
+
Votre fichier trigger doit apparaître dans la liste sans erreur indiquant que les opérations précédentes ont été réalisées avec succès.
−
3) Revenez maintenant à l'édition du fichier trigger afin d'ajouter votre code dans la fonction ''run_trigger''.
+
3) Revenez maintenant à l'édition du fichier trigger afin d'ajouter votre code dans la fonction ''runTrigger''.
−
Cette fonction est appelée à chaque évènement Dolibarr. Placer votre code en fonction du ou des évènements sur lesquels vous voulez réagir, chaque évènement étant identifié par un code (voir chapitres suivant pour la liste des codes), on peut réagir ou non à un évènement donné par un test sur la variable '''$action''':
+
Cette fonction est appelée à chaque événement Dolibarr. Placer votre code en fonction du ou des événements sur lesquels vous voulez réagir, chaque événement étant identifié par un code (voir chapitres suivant pour la liste des codes), on peut réagir ou non à un événement donné par un test sur la variable '''$action''':
−
<source lang="php">
+
<syntaxhighlight lang="php">
public function runtrigger($action,$object,$user,$langs,$conf)
public function runtrigger($action,$object,$user,$langs,$conf)
{
{
Line 73:
Line 82:
...
...
}
}
−
</source>
+
</syntaxhighlight>
−
Vous pouvez faire ce que vous voulez dans cette portion de code du moment que la fonction runtrigger renvoie un code retour sur le principe suivant:
+
Vous pouvez faire ce que vous voulez dans cette portion de code du moment que la fonction runTrigger renvoie un code retour sur le principe suivant:
<0 si ko, 0 si aucune action faite, >0 si ok
<0 si ko, 0 si aucune action faite, >0 si ok
Vous pouvez de plus dans cette fonction utiliser les objets suivant:
Vous pouvez de plus dans cette fonction utiliser les objets suivant:
−
* '''$object''' est l'objet sur lequel porte l'action (voir chapitre suivant)
−
* '''$user''' est l'objet de l'utilisateur Dolibarr qui réalise l'action
−
* '''$langs''' est l'objet qui contient la langue de l'utilisateur Dolibarr
−
* '''$conf''' est l'objet qui contient toute la configuration de Dolibarr.
+
*'''$object''' est l'objet sur lequel porte l'action (voir chapitre suivant)
+
*'''$user''' est l'objet de l'utilisateur Dolibarr qui réalise l'action
+
*'''$langs''' est l'objet qui contient la langue de l'utilisateur Dolibarr
+
*'''$conf''' est l'objet qui contient toute la configuration de Dolibarr.
−
4) Une fois le code réalisé, il n'y a plus qu'à tester, en provoquant l'évènement déclencheur dans Dolibarr. Attention, l'appel au '''runtrigger''' et encapsuler dans un transaction. Si votre trigger renvoie un code ko, la fonction appelante peut annuler la transaction (ceci dépend de la fonction appelante).
+
−
Ajouter des traces dans un fichier dans la fonction '''run_trigger''' afin de vous assurer que le code s'exécute bien. Vous pouvez pour cela si vous le désirer, utiliser la fonction
+
4) Une fois le code réalisé, il n'y a plus qu'à tester, en provoquant l’événement déclencheur dans Dolibarr. Attention, l'appel au '''runTrigger''' et encapsuler dans un transaction. Si votre trigger renvoie un code ko, la fonction appelante peut annuler la transaction (ceci dépend de la fonction appelante).
+
Ajouter des traces dans un fichier dans la fonction '''runTrigger''' afin de vous assurer que le code s'exécute bien. Vous pouvez pour cela si vous le désirer, utiliser la fonction
dol_syslog("mon texte de trace", LOG_DEBUG);
dol_syslog("mon texte de trace", LOG_DEBUG);
−
= Liste des événements gérés =
+
=Liste des événements gérés=
Voici un vue rapide des événements qui provoquent une recherche et exécution de triggers. Un événement est caractérisés par la valeur du code '''$action''', avec le type de l'objet reçu dans '''$object'''.
Voici un vue rapide des événements qui provoquent une recherche et exécution de triggers. Un événement est caractérisés par la valeur du code '''$action''', avec le type de l'objet reçu dans '''$object'''.
−
Remarque: Le [[Module Agenda]] et le [[Module Notification Fr]] utilise la table [[Table llx c action trigger]] comme liste de triggers connus. Cela évite de scanner le disque pour avoir cette information mais cette table ne contient qu'une liste très limité des triggers.
+
Remarque: Le [[Module Agenda]] et le [[Module Notification FR|Module Notification]] utilise la table [[Table llx c action trigger]] comme liste de triggers connus. Cela évite de scanner le disque pour avoir cette information mais cette table ne contient qu'une liste très limité des triggers.
En général, le code action de trigger commence par le nom du module suivi du caractère _.
En général, le code action de trigger commence par le nom du module suivi du caractère _.
Line 101:
Line 111:
Liste non exhaustive.
Liste non exhaustive.
−
= Créer de nouveaux événements Triggers =
+
=Créer de nouveaux événements Triggers=
Pour gérer d'autres événements que ceux ci-dessus, il faut modifier le code Dolibarr pour y ajouter la séquence suivante dans les méthodes métiers des classes des objects manipulés:
Pour gérer d'autres événements que ceux ci-dessus, il faut modifier le code Dolibarr pour y ajouter la séquence suivante dans les méthodes métiers des classes des objects manipulés:
−
<source lang="php">
+
<syntaxhighlight lang="php">
+
// Call trigger
+
$result=$this->call_trigger('CODE_TRIGGER',$user);
+
if ($result < 0) $error++;
+
// End call triggers
+
</syntaxhighlight>
+
+
Pour ajouter des informations de context (par exemple pour dissocier 2 cas différents appelés avec le même code Trigger), il est possible de placer ces informations dans la propriétés ->context de l'object sur lequel porte l'appel du trigger. Exemple:
+
+
<syntaxhighlight lang="php">
// Call trigger
// Call trigger
−
$result=$this->call_trigger('XXXXX_YYYYY',$user);
+
$this->context = array('paramX'=>$valueX, 'anyparamofyourchoice'=>$anyvalue);
+
$result=$this->call_trigger('CODE_TRIGGER',$user);
if ($result < 0) $error++;
if ($result < 0) $error++;
// End call triggers
// End call triggers
−
</source>
+
</syntaxhighlight>
−
Il sera alors possible d'ajouter dans la méthode run_trigger de tout fichier trigger, un if qui permet de gérer ce code. La méthode run_trigger serait alors de la forme :
−
<source lang="php">
+
+
Il sera alors possible d'ajouter dans la méthode runTrigger de tout fichier trigger, un if qui permet de gérer ce code. La méthode runTrigger serait alors de la forme :
+
+
<syntaxhighlight lang="php">
function run_trigger($action,$object,$user,$lang,$conf)
function run_trigger($action,$object,$user,$lang,$conf)
{
{
Line 136:
Line 158:
...
...
}
}
−
</source>
+
</syntaxhighlight>
−
= Conclusion =
+
=Conclusion=
Vous pouvez donc en quelques minutes, ajouter une interface Dolibarr vers exterieur sans risque puisqu'on ne touche pas au code Dolibarr, on s'est contenté de placer un nouveau fichier trigger dans le répertoire des triggers.
Vous pouvez donc en quelques minutes, ajouter une interface Dolibarr vers exterieur sans risque puisqu'on ne touche pas au code Dolibarr, on s'est contenté de placer un nouveau fichier trigger dans le répertoire des triggers.
Si cette interface peut être utile à d'autre, n'hésitez pas à la packager en tgz (voir la page [[Développement_module#Créer_un_package_pour_livrer_et_installer_votre_module]]) et de la soumettre dans l'espace des téléchargement-contributions sur le site de Dolibarr.
Si cette interface peut être utile à d'autre, n'hésitez pas à la packager en tgz (voir la page [[Développement_module#Créer_un_package_pour_livrer_et_installer_votre_module]]) et de la soumettre dans l'espace des téléchargement-contributions sur le site de Dolibarr.
−
= Voir aussi =
+
=Voir aussi=
−
* [[Système de Hooks]]
+
−
* [[Interfaces Dolibarr vers exterieur]]
+
*[[Système de Hooks]]
−
* [[Interfaces Exterieur vers Dolibarr]]
+
*[[Interfaces Dolibarr vers exterieur]]
+
*[[Interfaces Exterieur vers Dolibarr]]