觸發系統
將您的代碼添加到業務事件
為了能夠觸發自定義代碼以響應Dolibarr事件(創建/修改/刪除、公司/發票/產品/用戶或其他),Dolibarr提供了一種業務觸發機制。例如,此機制允許您自定義工作流,以便Dolibarr的管理事件可以反映到另一個應用程序中。也沒有什麼可以阻止使用它來改變Dolibarr本身的行為:例如,在驗證發票後自動創建合同、在刪除記錄時填寫日誌文件...
請注意,觸發器是一項開發功能,僅限於CRUD業務事件(創建|讀取|更新|刪除)。還有另一個功能允許開發人員將自定義代碼注入應用程序,名為 Hooks system 。
因此,要添加將由觸發器觸發的自己的代碼,過程如下:
1)htdocs/modulebuilder/template/core/triggers/interface_99_modMyModule_MyModuleTriggers.class.phpu文件複製一份,命名為 interface_99_all_Xxx.class.php 或 interface_99_modMyModule_Xxx.class.php
其中 Xxx 是您選擇的以大寫字母開頭的字符串;99是觸發器的優先級號(01是最高優先級);如果您希望觸發器僅在 myModule 處於活動狀態時才應激活,則MyModule是模塊的名稱;如果我們希望觸發器始終處於活動狀態,我們將使用all代替modMyModule。此新文件必須保留在同一目錄中。
注意:可用於 modMyModule 的值在目錄 htdocs/core/modules 中可見。
警告:所有這些參數都是檢測觸發器所必需的!例如,如果您忘記了優先級號,將無法檢測到該觸發器!
例如,我們可以將我們的新觸發器命名為 htdocs/core/triggers/interface_99_modFacture_Myworkflow.class.php
通過創建一個名為本例的文件,我們的新觸發器將在每個Dolibarr業務事件中觸發,前提是發票模塊處於活動狀態。
注意:使用Dolibarr 3.2+,還可以將觸發器文件放置在模塊的子文件夾中。例如:如果模塊位於htdocs/mymodule/中,則可以將觸發器放置在htdocs/mymodule/core/triggers/中。但在這種情況下,必須將觸發器聲明到模塊的描述符文件(如: /mymodule/core/modules/modMyModule.class.php)中,才會找到觸發器。
為此,請在數組 module_parts 中添加 'triggers' => 1
// 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,
// 'login' => 0,
// 'substitutions' => 0,
// 'menus' => 0);
然後停用並重新激活模塊。這將在 表llx_const 中添加一行記錄,告訴Dolibarr必須在模塊的目錄 htdocs/mymodule/core/triggers/ 中查找觸發器。
2)編輯文件interface_99_modMyModule_Myworkflow.class.php,以便將InterfaceDemo類重命名為InterfaceMyworkflow
然後轉到 主頁->管理工具->關於Dolibarr->Triggers。您的觸發器文件應顯示在「可用的觸發器」清單中,表明前面的操作已成功完成。
3) 現在返回編輯觸發器文件,將代碼添加到 run_trigger 函數中。此函數在每個Dolibarr業務事件中調用。根據您希望響應的事件放置代碼,每個事件都由一個代碼標識(代碼列表請參閱下一章),您可以通過判斷變量 $action 對給定事件做出反應,也可以不做出反應:
function run_trigger($action,$object,$user,$langs,$conf)
{
// Put here code to execute after an action
// The type of Dolibarr business event is stored into $action
// Data of action are stored into object $object
// Setup, user and language are saved into $conf, $user and $lang
if ($action == 'COMPANY_CREATE')
{
dol_syslog("Trigger for action '$action' launched. id=".$object->id);
}
elseif ($action == 'COMPANY_MODIFY')
{
dol_syslog("Trigger for action '$action' launched. id=".$object->id);
}
elseif ($action == 'COMPANY_DELETE')
...
}
只要 run_trigger 函數根據以下原則返回一個返回代碼,您就可以在這段代碼中執行任何操作:
<0(如果ko),0(如果沒有執行任何操作),>0(如果ok)
此外,在此函數中,您可以使用以下對象:
- $object 是操作所針對的對象(請參閱下一章)
- $user 是執行操作的dolibarr用戶的對象
- $langs 是包含dolibarr用戶語言的對象
- $conf 是包含整個Dolibarr配置的對象。
4) 代碼開發完成後,只需在Dolibarr中觸發觸發事件即可進行測試。注意,函數 run_trigger 的調用被封裝在事務中。如果觸發器返回代碼是 ko,調用函數可能會回滾事務(這取決於調用函數)。要在函數 run_trigger 中添加日誌跟蹤,用以確保代碼運行良好。如果您願意,可以使用函數 dol_syslog("my log message", LOG_DEBUG);
管理事件列表
以下是導致觸發器被搜索和執行的事件的快速視圖。事件的特徵在於事件代碼 $action 的值,以及在 $object 中接收的對象類型。
注意:日程模塊 和 通知模塊 使用 表llx c action trigger 作為已知觸發器的表。這避免了掃描磁盤以獲取此信息,但此表僅包含非常有限的觸發器列表。
通常,觸發事件代碼 $action 以模塊名稱開頭,後跟字符 _ 。
Trigger code ($action) | Type object ($object) |
USER_CREATE | user.class.php |
USER_MODIFY | user.class.php |
USER_DELETE | user.class.php |
USER_LOGIN | user.class.php |
USER_LOGIN_FAILED | user.class.php |
USER_LOGOUT | user.class.php |
USER_ENABLEDISABLE | user.class.php |
USER_NEW_PASSWORD | user.class.php |
USER_SETINGROUP | user.class.php |
USER_REMOVEFROMGROUP | user.class.php |
USERGROUP_CREATE (>= 12.0.0) | usergroup.class.php |
USERGROUP_MODIFY(>= 12.0.0) | usergroup.class.php |
USERGROUP_DELETE(>= 12.0.0) | usergroup.class.php |
GROUP_CREATE | usergroup.class.php |
GROUP_MODIFY | usergroup.class.php |
GROUP_DELETE (>= 3.3.0) | usergroup.class.php |
COMPANY_CREATE | societe.class.php |
COMPANY_MODIFY | societe.class.php |
COMPANY_DELETE | societe.class.php |
COMPANY_SENTBYMAIL (>= 3.5.0) | societe.class.php |
CONTACT_CREATE | contact.class.php |
CONTACT_MODIFY | contact.class.php |
CONTACT_DELETE | contact.class.php |
CONTACT_ENABLEDISABLE (>= 3.5.0) | contact.class.php |
PRODUCT_CREATE | product.class.php |
PRODUCT_MODIFY | product.class.php |
PRODUCT_PRICE_MODIFY | product.class.php |
PRODUCT_DELETE | product.class.php |
SUPPLIER_PRODUCT_BUYPRICE_MODIFY | fournisseur.product.class.php |
SUPPLIER_PRODUCT_BUYPRICE_CREATE | fournisseur.product.class.php |
ORDER_CREATE | commande.class.php |
ORDER_VALIDATE | commande.class.php |
ORDER_SENTBYMAIL | commande.class.php |
ORDER_DELETE | commande.class.php |
ORDER_MODIFY | commande.class.php |
ORDER_CLASSIFY_BILLED | commande.class.php |
ORDER_CLONE | commande.class.php |
ORDER_CLOSE | commande.class.php |
ORDER_CANCEL | commande.class.php |
ORDER_REOPEN (>= 3.3.0) | commande.class.php |
ORDER_UNVALIDATE | commande.class.php |
COMMANDE_ADD_CONTACT | commande.class.php |
COMMANDE_DELETE_CONTACT | commande.class.php |
COMMANDE_DELETE_RESOURCE (>= 3.6.0) | commande.class.php |
LINEORDER_INSERT | commande.class.php |
LINEORDER_UPDATE | commande.class.php |
LINEORDER_DELETE | commande.class.php |
LINEORDER_DISPATCH (>= 3.4.0) | commande.class.php |
ORDER_SUPPLIER_CREATE | fournisseur.commande.class.php |
ORDER_SUPPLIER_CLONE | fournisseur.commande.class.php |
ORDER_SUPPLIER_VALIDATE | fournisseur.commande.class.php |
ORDER_SUPPLIER_SENTBYMAIL | fournisseur.commande.class.php |
ORDER_SUPPLIER_APPROVE | fournisseur.commande.class.php |
ORDER_SUPPLIER_REFUSE | fournisseur.commande.class.php |
ORDER_SUPPLIER_CANCEL | fournisseur.commande.class.php |
ORDER_SUPPLIER_DELETE | fournisseur.commande.class.php |
ORDER_SUPPLIER_DISPATCH (>= 3.4.0) | fournisseur.commande.class.php |
ORDER_SUPPLIER_ADD_CONTACT | fournisseur.commande.class.php |
ORDER_SUPPLIER_DELETE_CONTACT | fournisseur.commande.class.php |
ORDER_SUPPLIER_DELETE_RESOURCE (>= 3.6.0) | fournisseur.commande.class.php |
LINEORDER_SUPPLIER_CREATE | fournisseur.commande.class.php |
LINEORDER_SUPPLIER_UPDATE | fournisseur.commande.class.php |
LINEORDER_SUPPLIER_DELETE (>= 3.6.0) | fournisseur.commande.class.php |
PROPAL_CREATE | propal.class.php |
PROPAL_DELETE | propal.class.php |
PROPAL_CLONE | propal.class.php |
PROPAL_REOPEN (>= 3.5.0) | propal.class.php |
PROPAL_VALIDATE | propal.class.php |
PROPAL_CLOSE_SIGNED | propal.class.php |
PROPAL_CLOSE_REFUSED | propal.class.php |
PROPAL_SENTBYMAIL | propal.class.php |
PROPAL_MODIFY | propal.class.php |
PROPAL_ADD_CONTACT | propal.class.php |
PROPAL_DELETE_CONTACT | propal.class.php |
PROPAL_DELETE_RESOURCE (>= 3.6.0) | propal.class.php |
LINEPROPAL_INSERT | propal.class.php |
LINEPROPAL_UPDATE | propal.class.php |
LINEPROPAL_DELETE | propal.class.php |
CONTRACT_CREATE | contrat.class.php |
CONTRACT_VALIDATE | contrat.class.php |
CONTRACT_SERVICE_ACTIVATE | contrat.class.php |
CONTRACT_SERVICE_CLOSE | contrat.class.php |
CONTRACT_DELETE | contrat.class.php |
CONTRAT_ADD_CONTACT | contrat.class.php |
CONTRAT_DELETE_CONTACT | contrat.class.php |
CONTRAT_DELETE_RESOURCE (>= 3.6.0) | contrat.class.php |
LINECONTRACT_INSERT | contrat.class.php |
LINECONTRACT_MODIFY | contrat.class.php |
LINECONTRACT_DELETE | contrat.class.php |
BILL_CREATE | facture.class.php |
BILL_MODIFY | facture.class.php |
BILL_CLONE | facture.class.php |
BILL_VALIDATE | facture.class.php |
BILL_UNVALIDATE (>= 3.4.0) | facture.class.php |
BILL_PAYED | facture.class.php |
BILL_UNPAYED | facture.class.php |
BILL_CANCEL | facture.class.php |
BILL_DELETE | facture.class.php |
BILL_SENTBYMAIL | facture.class.php |
FACTURE_ADD_CONTACT | facture.class.php |
FACTURE_DELETE_CONTACT | facture.class.php |
FACTURE_DELETE_RESOURCE (>= 3.6.0) | facture.class.php |
LINEBILL_INSERT | facture.class.php |
LINEBILL_UPDATE | facture.class.php |
LINEBILL_DELETE | facture.class.php |
BILL_SUPPLIER_CREATE | fournisseur.facture.class.php |
BILL_SUPPLIER_MODIFY | fournisseur.facture.class.php |
BILL_SUPPLIER_DELETE | fournisseur.facture.class.php |
BILL_SUPPLIER_VALIDATE | fournisseur.facture.class.php |
BILL_SUPPLIER_PAYED | fournisseur.facture.class.php |
BILL_SUPPLIER_UNPAYED | fournisseur.facture.class.php |
BILL_SUPPLIER_SENTBYMAIL | fournisseur.facture.class.php |
INVOICE_SUPPLIER_ADD_CONTACT | fournisseur.facture.class.php |
INVOICE_SUPPLIER_DELETE_CONTACT | fournisseur.facture.class.php |
INVOICE_SUPPLIER_DELETE_RESOURCE (>= 3.6.0) | fournisseur.facture.class.php |
LINEBILL_SUPPLIER_CREATE | fournisseur.facture.class.php |
LINEBILL_SUPPLIER_UPDATE | fournisseur.facture.class.php |
LINEBILL_SUPPLIER_DELETE (>= 3.4.0) | fournisseur.facture.class.php |
PAYMENT_CUSTOMER_CREATE | paiement.class.php |
PAYMENT_DELETE (<= 3.8) | paiement.class.php |
PAYMENT_CUSTOMER_DELETE (>= 3.9) | paiement.class.php |
PAYMENT_ADD_TO_BANK | paiement.class.php |
PAYMENT_SUPPLIER_CREATE | paiementfourn.class.php |
PAYMENT_SUPPLIER_DELETE (>= 3.9) | paiement.class.php |
PAYMENT_SALARY_CREATE (>= 3.6.0) | paymentsalary.class.php |
PAYMENT_SALARY_MODIFY (>= 3.6.0) | paymentsalary.class.php |
PAYMENT_SALARY_DELETE (>= 3.6.0) | paymentsalary.class.php |
FICHINTER_CREATE | fichinter.class.php |
FICHINTER_MODIFY | fichinter.class.php |
FICHINTER_DELETE | fichinter.class.php |
FICHINTER_VALIDATE | fichinter.class.php |
FICHINTER_SENTBYMAIL | fichinter.class.php |
FICHINTER_ADD_CONTACT | fichinter.class.php |
FICHINTER_DELETE_CONTACT | fichinter.class.php |
FICHINTER_DELETE_RESOURCE (>= 3.6.0) | fichinter.class.php |
LINEFICHINTER_CREATE (>= 3.5.0) | fichinter.class.php |
LINEFICHINTER_UPDATE (>= 3.5.0) | fichinter.class.php |
LINEFICHINTER_DELETE (>= 3.5.0) | fichinter.class.php |
MEMBER_CREATE | adherent.class.php |
MEMBER_VALIDATE | adherent.class.php |
MEMBER_SUBSCRIPTION | adherent.class.php |
MEMBER_MODIFY | adherent.class.php |
MEMBER_RESILIATE | adherent.class.php |
MEMBER_NEW_PASSWORD | adherent.class.php |
MEMBER_DELETE | adherent.class.php |
CATEGORY_CREATE | category.class.php |
CATEGORY_MODIFY | category.class.php |
CATEGORY_DELETE | category.class.php |
CATEGORY_LINK (>= 3.5.0) | category.class.php |
CATEGORY_UNLINK (>= 3.5.0) | category.class.php |
SHIPPING_CREATE | expedition.class.php |
SHIPPING_VALIDATE | expedition.class.php |
SHIPPING_MODIFY | expedition.class.php |
SHIPPING_DELETE | expedition.class.php |
SHIPPING_SENTBYMAIL | expedition.class.php |
DELIVERY_VALIDATE | livraison.class.php |
DELIVERY_DELETE | livraison.class.php |
ACTION_CREATE | actioncomm.class.php |
ACTION_MODIFY | actioncomm.class.php |
ACTION_DELETE | actioncomm.class.php |
ACTION_ADD_CONTACT | actioncomm.class.php |
ACTION_DELETE_CONTACT | actioncomm.class.php |
ACTION_DELETE_RESOURCE (>= 3.6.0) | actioncomm.class.php |
DEPLACEMENT_CREATE | deplacement.class.php |
DON_CREATE | don.class.php |
DON_MODIFY (>= 3.7.0) | don.class.php |
DON_DELETE (>= 3.7.0) | don.class.php |
LOCALTAX_CREATE | localtax.class.php |
LOCALTAX_MODIFY | localtax.class.php |
LOCALTAX_DELETE | localtax.class.php |
TVA_CREATE | tva.class.php |
TVA_MODIFY | tva.class.php |
TVA_DELETE | tva.class.php |
TVA_ADDPAYMENT | tva.class.php |
PROJECT_CREATE | project.class.php |
PROJECT_MODIFY | project.class.php |
PROJECT_DELETE | project.class.php |
PROJECT_VALIDATE | project.class.php |
PROJECT_CLOSE | project.class.php |
PROJECT_ADD_CONTACT | project.class.php |
PROJECT_DELETE_CONTACT | project.class.php |
PROJECT_DELETE_RESOURCE (>= 3.6.0) | project.class.php |
TASK_CREATE | task.class.php |
TASK_MODIFY | task.class.php |
TASK_DELETE | task.class.php |
TASK_TIMESPENT_CREATE | task.class.php |
TASK_TIMESPENT_MODIFY | task.class.php |
TASK_TIMESPENT_DELETE | task.class.php |
PROJECT_TASK_ADD_CONTACT | task.class.php |
PROJECT_TASK_DELETE_CONTACT | task.class.php |
PROJECT_TASK_DELETE_RESOURCE (>= 3.6.0) | task.class.php |
MYECMDIR_CREATE | ecmdirectory.class.php |
MYECMDIR_MODIFY | ecmdirectory.class.php |
MYECMDIR_DELETE | ecmdirectory.class.php |
STOCK_MOVEMENT | mouvementstock.class.php |
PAYBOX_PAYMENT_OK | |
PAYPAL_PAYMENT_OK | |
LINK_CREATE (>= 3.5.0) | link.class.php |
LINK_MODIFY (>= 3.5.0) | link.class.php |
LINK_DELETE (>= 3.5.0) | link.class.php |
OPENSURVEY_CREATE (>= 3.6.0) | opensurveysondage.class.php |
OPENSURVEY_DELETE (>= 3.6.0) | opensurveysondage.class.php |
此清單可能不完整。
創建新的觸發器事件
要處理上述事件之外的其它事件,必須修改 Dolibarr 代碼,以便在操作對象類的業務方法中添加以下序列:
// Call trigger
//$this->context = array('paramX'=>$valueX);
$result = $this->call_trigger('XXXXX_YYYYY', $user);
if ($result <0) $error++;
// End call triggers
然後,可以在任何觸發器文件的 run_trigger 方法中添加一個 if 來管理該代碼。run_trigger 方法的形式如下:
function run_trigger($action,$object,$user,$lang,$conf)
{
// Put here code to execute after an action
// The type of Dolibarr business event is stored into $action
// Data of action are stored into object $object
// Setup, user and language are saved into $conf, $user and $lang
if ($action == 'XXXXX_YYYYY')
{
dol_syslog("Trigger for action '$action' launched. id=".$object->id);
}
elseif ($action == 'COMPANY_CREATE')
{
dol_syslog("Trigger for action '$action' launched. id=".$object->id);
}
elseif ($action == 'COMPANY_MODIFY')
{
dol_syslog("Trigger for action '$action' launched. id=".$object->id);
}
elseif ($action == 'COMPANY_DELETE')
...
}
結論
因此,您可以在幾分鐘內添加一個Dolibarr到外部系統的接口,而不會有任何風險,因為我們沒有接觸 Dolibarr 代碼,我們只是在觸發器目錄中放置了一個新的觸發器文件。如果此接口對其他人有用,請毫不猶豫地將其打包為tgz文件(請參閱頁面 模塊開發#創建一個安裝包來分發和安裝您的模塊),並將其提交到Dolibarr官網上的貢獻下載空間。