觸發系統


將您的代碼添加到業務事件

為了能夠觸發自定義代碼以響應Dolibarr事件(創建/修改/刪除、公司/發票/產品/用戶或其他),Dolibarr提供了一種業務觸發機制。例如,此機制允許您自定義工作流,以便Dolibarr的管理事件可以反映到另一個應用程式中。也沒有什麼可以阻止使用它來改變Dolibarr本身的行為:例如,在驗證發票後自動創建合同、在刪除記錄時填寫日誌文件...

請注意,觸發器是一項開發功能,僅限於CRUD業務事件(創建|讀取|更新|刪除)。還有另一個功能允許開發人員將自定義代碼注入應用程式,名為 Hooks system

因此,要添加將由觸發器觸發的自己的代碼,過程如下:

1)htdocs/modulebuilder/template/core/triggers/interface_99_modMyModule_MyModuleTriggers.class.phpu文件複製一份,命名為 interface_99_all_Xxx.class.phpinterface_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官網上的貢獻下載空間。

See also