定義自己的 action 項目

1 篇文章 / 0 new
author
定義自己的 action 項目
在宣告 action 相關參數. 啟用後即可在 admin/structure/trigger 來指派是否啟用項目. 若有需要額外參數設定則在 admin/config/system/actions 進行. 同樣的動作雖然可在 hook內達成, 但差異是直接使用 hook 一般沒有管理介面來選擇是否啟用, 使用 action 則可以隨時變更.

Trigger 在 drupal 系統內應該算是 hook的延伸, 因為 trigger 算是依附在某些 hook 下而動作, 而 Trigger 主要是為提供使用者管理介面而產生的模組而已

要在系統現有的 Trigger 下自訂 action 項目, 則需實作 hook_action_info(), 其分 有參數無參數類型
/**
 * Implements hook_action_info();
 */
function beep_action_info() {
    return array(
        'beep_beep_action' => array(// 無參數型
            'type' => 'system',
            'label' => t('Beep annoyingly'),
            'configurable' => FALSE,
            'triggers' => array('node_view', 'node_insert', 'node_update', 'node_delete'),
        ),
        'beep_multiple_beep_action' => array(// 有參數型, advanced action or configurable action
            'type' => 'node',
            'label' => t('Beep multiple times'),
            'configurable' => TRUE,
            'triggers' => array('node_view', 'node_insert', 'node_update', 'node_delete'),
        ),
    );
}
action 動作時呼叫的 function, 即為 hook_action_info() 內 array 所定義的 key 值
/**
 * 無參數型(simple action).
 * $object通常為null, $context 則存放動作目標的相關資料
 */
function beep_beep_action($object, $context) {
    //處理動作
}
/**
 * 有參數型, advanced action or configurable actio.
 * $object通常放動作目標的相關資料, $context 則存放該 action 的相關參數
 */
function beep_multiple_beep_action($object, $context) {
    for ($i = 0; $i < $context['beeps']; $i++) {
        //處理動作
    }
}
有參數型之參數設定表單實作項目, 與一般表單作業雷同
function beep_multiple_beep_action_form($context) {
    $form['beeps'] = array(// key:參數名稱
        '#type' => 'textfield',
        '#title' => t('Number of beeps'),
        '#description' => t('Enter the number of times to beep when this action executes'),
        '#default_value' => isset($context['beeps']) ? $context['beeps'] : 1,
        '#required' => TRUE,
    );
    return $form;
}
function beep_multiple_beep_action_validate($form, $form_state) {
    $beeps = $form_state['values']['beeps'];
    if ((!is_numeric($beeps)) or ((int) $beeps > 10) or ((int) $beeps < 0)) {
        form_set_error('beeps', t('Please enter a whole number between 0 and 10.'));
    }
}
function beep_multiple_beep_action_submit($form, $form_state) {
    return array('beeps' => (int) $form_state['values']['beeps']);
}
參數設定流程
► ACTION-NAME_form
► ACTION-NAME_validate
► ACTION-NAME_submit

若要改變其他模組中 action 的觸發項目, 則需實作 hook_action_info_alter()
/**
 * Implements hook_action_info_alter();
 * 所包含的任何 trigger 其中一項有動作時均會被呼叫
 */
function beep_action_info_alter(&$actions) {
    // 讓 "Block current user" 增加動作感知項目, 新回應 時也會觸動.           
    if (!in_array("comment_insert", $actions['user_block_user_action']['triggers'])) {
        $actions['user_block_user_action']['triggers'][] = 'comment_insert';
    }
}
在程式中要啟動某 action 則呼叫 actions_do 函式來進行
Free Web Hosting