casetracker_actions.module in Case Tracker 7
Same filename and directory in other branches
Implements Actions integration for Case Tracker
File
casetracker_actions/casetracker_actions.moduleView source
<?php
/**
* casetracker_actions.module
* @file
* Implements Actions integration for Case Tracker
*/
/**
* Implements hook_action_info().
* Used to define new actions:
* set priority, set status, set type, set project, set assign-to, take case.
*/
function casetracker_actions_action_info() {
return array(
'casetracker_actions_set_priority_action' => array(
'label' => t('Set case priority'),
'type' => 'node',
'configurable' => TRUE,
'triggers' => array(
'any' => TRUE,
),
),
'casetracker_actions_set_status_action' => array(
'label' => t('Set case status'),
'type' => 'node',
'configurable' => TRUE,
'triggers' => array(
'any' => TRUE,
),
),
'casetracker_actions_set_type_action' => array(
'label' => t('Set case type'),
'type' => 'node',
'configurable' => TRUE,
'triggers' => array(
'any' => TRUE,
),
),
'casetracker_actions_set_assign_to_action' => array(
'label' => t('Set case assigned user'),
'type' => 'node',
'configurable' => TRUE,
'triggers' => array(
'any' => TRUE,
),
),
'casetracker_actions_set_project_action' => array(
'label' => t('Set case project'),
'type' => 'node',
'configurable' => TRUE,
'triggers' => array(
'any' => TRUE,
),
),
'casetracker_actions_take_case_action' => array(
'label' => t('Take over case'),
'type' => 'node',
'configurable' => FALSE,
'triggers' => array(
'any' => TRUE,
),
),
);
}
/**
* Definitions of Action Behaviors
*/
/**
* Set Priority action behavior.
*/
function casetracker_actions_set_priority_action(&$object, $context = array()) {
$nid = _casetracker_actions_get_nid($object->nid, $context['nid']);
_casetracker_actions_act($nid, 'case_priority_id', $context['priority']);
}
/**
* Set Status action behavior.
*/
function casetracker_actions_set_status_action(&$object, $context = array()) {
$nid = _casetracker_actions_get_nid($object->nid, $context['nid']);
_casetracker_actions_act($nid, 'case_status_id', $context['status']);
}
/**
* Set Type action behavior.
*/
function casetracker_actions_set_type_action(&$object, $context = array()) {
$nid = _casetracker_actions_get_nid($object->nid, $context['nid']);
_casetracker_actions_act($nid, 'case_type_id', $context['type']);
}
/**
* Set Assign to action behavior.
*/
function casetracker_actions_set_assign_to_action(&$object, $context = array()) {
$nid = _casetracker_actions_get_nid($object->nid, $context['nid']);
_casetracker_actions_act($nid, 'assign_to', $context['assign_to']);
}
/**
* Set Project action behavior.
*/
function casetracker_actions_set_project_action(&$object, $context = array()) {
$nid = _casetracker_actions_get_nid($object->nid, $context['nid']);
_casetracker_actions_act($nid, 'pid', $context['project']);
}
/**
* Take Case action behavior.
*/
function casetracker_actions_take_case_action(&$object, $context = array()) {
global $user;
$nid = _casetracker_actions_get_nid($object->nid, $context['nid']);
_casetracker_actions_act($nid, 'assign_to', $user->name);
}
/**
* Action Configuration Forms
*/
/**
* Select a priority level for the Set Priority action.
*/
function casetracker_actions_set_priority_action_form($context) {
$case_priority_options = casetracker_realm_load('priority');
$default_priority = variable_get('casetracker_default_case_priority', key($case_priority_options));
$form['casetracker_actions_priority'] = array(
'#title' => t('Priority'),
'#type' => 'select',
'#description' => t('The case will be updated with the priority selected above.'),
'#default_value' => $default_priority,
'#options' => $case_priority_options,
);
return $form;
}
/**
* @todo Please document this function.
* @see http://drupal.org/node/1354
*/
function casetracker_actions_set_priority_action_submit($form, $form_state) {
return array(
'priority' => $form_state['values']['casetracker_actions_priority'],
);
}
/**
* Select a status condition for the Set Status action.
*/
function casetracker_actions_set_status_action_form($context) {
$case_status_options = casetracker_realm_load('status');
$default_status = variable_get('casetracker_default_case_status', key($case_status_options));
$form['casetracker_actions_status'] = array(
'#title' => t('Status'),
'#type' => 'select',
'#description' => t('The case will be updated with the status selected above.'),
'#default_value' => $default_status,
'#options' => $case_status_options,
);
return $form;
}
/**
* @todo Please document this function.
* @see http://drupal.org/node/1354
*/
function casetracker_actions_set_status_action_submit($form, $form_state) {
return array(
'status' => $form_state['values']['casetracker_actions_status'],
);
}
/**
* Select a type for the Set Type action.
*/
function casetracker_actions_set_type_action_form($context) {
$case_type_options = casetracker_realm_load('type');
$default_type = variable_get('casetracker_default_case_type', key($case_type_options));
$form['casetracker_actions_type'] = array(
'#title' => t('Type'),
'#type' => 'select',
'#description' => t('The case will be updated with the type selected above.'),
'#default_value' => $default_type,
'#options' => $case_type_options,
);
return $form;
}
/**
* @todo Please document this function.
* @see http://drupal.org/node/1354
*/
function casetracker_actions_set_type_action_submit($form, $form_state) {
return array(
'type' => $form_state['values']['casetracker_actions_type'],
);
}
/**
* Select a user to assign for the Set Assign to action.
*/
function casetracker_actions_set_assign_to_action_form($context) {
$options = casetracker_user_options();
$form['casetracker_actions_assign_to'] = array(
'#type' => 'textfield',
'#title' => t('Assign to'),
'#autocomplete_path' => 'casetracker_autocomplete',
'#required' => TRUE,
'#size' => 12,
);
if (count($options) < 20) {
$normalized = array();
foreach ($options as $uid => $name) {
$normalized[$uid] = $name;
}
$form['casetracker_actions_assign_to'] = array(
'#type' => 'radios',
'#title' => t('Assign to'),
'#required' => TRUE,
'#options' => $normalized,
);
}
$form['casetracker_actions_assign_to']['#default_value'] = variable_get('casetracker_default_assign_to', t('Unassigned'));
return $form;
}
/**
* @todo Please document this function.
* @see http://drupal.org/node/1354
*/
function casetracker_actions_set_assign_to_action_submit($form, $form_state) {
return array(
'assign_to' => $form_state['values']['casetracker_actions_assign_to'],
);
}
/**
* Select a project for the Set Project action
*/
function casetracker_actions_set_project_action_form($context) {
$project_options = casetracker_project_options();
// if there's no project ID from the URL, or more than one project,
// we'll create a select menu for the user; otherwise, we'll save
// the passed (or only) project ID into a hidden field.
if (count($project_options) > 1) {
$form['casetracker_actions_pid'] = array(
'#title' => t('Project'),
'#type' => 'select',
'#options' => $project_options,
);
}
else {
$form['casetracker']['pid'] = array(
'#type' => 'value',
'#value' => !empty($default_project) ? $default_project : key($project_options),
);
}
return $form;
}
/**
* @todo Please document this function.
* @see http://drupal.org/node/1354
*/
function casetracker_actions_set_project_action_submit($form, $form_state) {
return array(
'project' => $form_state['values']['casetracker_actions_pid'],
);
}
/**
* Helper Functions
*/
/**
* generalized casetracker update function
* All casetracker actions have the same fundamental behavior.
*/
function _casetracker_actions_act($nid, $field, $value) {
if (!$nid) {
return;
}
// make sure we have a valid case node
$node = node_load($nid);
$success = _casetracker_actions_update_by_comment($field, $value, $node);
if ($success) {
_casetracker_actions_log($field, $value, $nid);
}
}
/**
* Get nid from action invocation.
* Failing that, grab it off the current node.
*/
function _casetracker_actions_get_nid($object_nid, $context_nid) {
// get the nid from the object.
if (isset($object_nid)) {
$nid = $object_nid;
}
elseif (isset($context_nid)) {
$nid = $context_nid;
}
elseif (arg(0) == 'node') {
$nid = arg(1);
}
return $nid;
}
/**
* Update case by programmatically inserting a comment posted by current user.
*/
function _casetracker_actions_update_by_comment($field, $value, $node) {
global $user;
if (user_access('post comments') && (user_access('administer comments') || node_comment_mode($nid) == COMMENT_NODE_READ_WRITE)) {
$case_info = get_object_vars($node->casetracker);
$case_info[$field] = $field == 'assign_to' ? casetracker_get_name($value) : $value;
if ($field != 'assign_to') {
$case_info['assign_to'] = casetracker_get_name($case_info['assign_to']);
}
// casetracker uses revision_id as a primary key for casetracker_case table.
$edit = array(
'nid' => $node->nid,
'pid' => 0,
// comment parent id
'comment' => t('Case changed in bulk update.'),
// comment body
'subject' => t('Update'),
'uid' => $user->uid,
'revision_id' => $node->vid,
'casetracker' => $case_info,
);
return comment_save($edit);
}
drupal_set_message(t('You may not post an update to case #%nid. Either you do not have the necessary permissions or the case has been locked.', array(
'%nid' => $nid,
)));
return 0;
}
/**
* Watchdog logging & verbose user message for actions
*/
function _casetracker_actions_log($field, $value, $nid) {
watchdog('action', 'Case nid %nid: %field set to %value.', array(
'%field' => $field,
'%value' => $value,
'%nid' => $nid,
));
drupal_set_message(t("Case #%nid: %field set to %value", array(
'%nid' => $nid,
'%field' => $field,
'%value' => $value,
)));
}
Functions
Name | Description |
---|---|
casetracker_actions_action_info | Implements hook_action_info(). Used to define new actions: set priority, set status, set type, set project, set assign-to, take case. |
casetracker_actions_set_assign_to_action | Set Assign to action behavior. |
casetracker_actions_set_assign_to_action_form | Select a user to assign for the Set Assign to action. |
casetracker_actions_set_assign_to_action_submit | @todo Please document this function. |
casetracker_actions_set_priority_action | Set Priority action behavior. |
casetracker_actions_set_priority_action_form | Select a priority level for the Set Priority action. |
casetracker_actions_set_priority_action_submit | @todo Please document this function. |
casetracker_actions_set_project_action | Set Project action behavior. |
casetracker_actions_set_project_action_form | Select a project for the Set Project action |
casetracker_actions_set_project_action_submit | @todo Please document this function. |
casetracker_actions_set_status_action | Set Status action behavior. |
casetracker_actions_set_status_action_form | Select a status condition for the Set Status action. |
casetracker_actions_set_status_action_submit | @todo Please document this function. |
casetracker_actions_set_type_action | Set Type action behavior. |
casetracker_actions_set_type_action_form | Select a type for the Set Type action. |
casetracker_actions_set_type_action_submit | @todo Please document this function. |
casetracker_actions_take_case_action | Take Case action behavior. |
_casetracker_actions_act | generalized casetracker update function All casetracker actions have the same fundamental behavior. |
_casetracker_actions_get_nid | Get nid from action invocation. Failing that, grab it off the current node. |
_casetracker_actions_log | Watchdog logging & verbose user message for actions |
_casetracker_actions_update_by_comment | Update case by programmatically inserting a comment posted by current user. |