除系統提供的五類Trigger外, 使用者也可自行定義 Trigger 項目, 除須實作 hook_trigger_info() 外, 也須實作自訂出的hook
hook_trigger_info() 亦可在現有類型的 Trigeer 內增加新項目// 實作 hook_trigger_info(); 定義自己的 Trigger及hook function annotate_trigger_info() { return array( 'annotate' => array( //群組名稱 'annotate_insert' => array( //trigger 項目, 也是 hook 'label' => t('After saving new annotate'), ), 'annotate_update' => array( 'label' => t('After saving updated annotate'), ), ... ), ); } // hook_node_insert function annotate_node_insert($node) { if (判斷是否需要觸發) { module_invoke_all('annotate_insert', $node); //觸發自己的 hook 或直接呼叫 //annotate_annotate_insert($node); } } // 實作自訂 hook, 在此觸發 action 項目 function annotate_annotate_insert($options = array()) { // 由 trigger module 傳回所有已啟用 'annotate_insert' 的活動trigger. $aids = trigger_get_assigned_actions('annotate_insert'); // 設定基本參數 "group" and "hook", 然後觸發所有啟用的 actions. $context = array( 'group' => 'annotate', 'hook' => 'annotate_insert', 'node' => (object) $options ); actions_do(array_keys($aids), NULL, $context); //無參數型acion 通常 node或user 資料接放置於 $context //有參數型則 $context 放置參數資料, node或user 資料則已參數形式傳入, 如下 //actions_do(array_keys($aids), (object) $options, $context); } /** * Implements hook_action_info(); */ function annotate_action_info() { return array( 'annotate_annotate_action' => array(// action呼叫的函式名稱 'type' => 'node', 'label' => t('own trigger'), 'configurable' => FALSE, 'triggers' => array('annotate_insert'), ), ); } function annotate_annotate_action($object, $context) { watchdog('annotate', '自動 Trigger 的 action 被觸發'); }
//在 Node Trigger 內增加 archive_nodes 觸發項目 function annotate_trigger_info() { return array( 'node' => array( 'archive_nodes' => array( 'label' => t('Archive old nodes'), ) ) ); }