| [ Index ] |
PHP Cross Reference of Drupal 6 (gatewave) |
[Summary view] [Print] [Text view]
1 <?php 2 // $Id: trigger.admin.inc,v 1.5.2.1 2010/08/11 20:35:48 goba Exp $ 3 4 /** 5 * @file 6 * Admin page callbacks for the trigger module. 7 */ 8 9 /** 10 * Build the form that allows users to assign actions to hooks. 11 * 12 * @param $type 13 * Name of hook. 14 * @return 15 * HTML form. 16 */ 17 function trigger_assign($type = NULL) { 18 // If no type is specified we default to node actions, since they 19 // are the most common. 20 if (!isset($type)) { 21 drupal_goto('admin/build/trigger/node'); 22 } 23 if ($type == 'node') { 24 $type = 'nodeapi'; 25 } 26 27 $output = ''; 28 $hooks = module_invoke_all('hook_info'); 29 foreach ($hooks as $module => $hook) { 30 if (isset($hook[$type])) { 31 foreach ($hook[$type] as $op => $description) { 32 $form_id = 'trigger_'. $type .'_'. $op .'_assign_form'; 33 $output .= drupal_get_form($form_id, $type, $op, $description['runs when']); 34 } 35 } 36 } 37 return $output; 38 } 39 40 /** 41 * Confirm removal of an assigned action. 42 * 43 * @param $hook 44 * @param $op 45 * @param $aid 46 * The action ID. 47 * @ingroup forms 48 * @see trigger_unassign_submit() 49 */ 50 function trigger_unassign($form_state, $hook = NULL, $op = NULL, $aid = NULL) { 51 if (!($hook && $op && $aid)) { 52 drupal_goto('admin/build/trigger/assign'); 53 } 54 55 $form['hook'] = array( 56 '#type' => 'value', 57 '#value' => $hook, 58 ); 59 $form['operation'] = array( 60 '#type' => 'value', 61 '#value' => $op, 62 ); 63 $form['aid'] = array( 64 '#type' => 'value', 65 '#value' => $aid, 66 ); 67 68 $action = actions_function_lookup($aid); 69 $actions = actions_get_all_actions(); 70 71 $destination = 'admin/build/trigger/'. ($hook == 'nodeapi' ? 'node' : $hook); 72 73 return confirm_form($form, 74 t('Are you sure you want to unassign the action %title?', array('%title' => $actions[$action]['description'])), 75 $destination, 76 t('You can assign it again later if you wish.'), 77 t('Unassign'), t('Cancel') 78 ); 79 } 80 81 function trigger_unassign_submit($form, &$form_state) { 82 $form_values = $form_state['values']; 83 if ($form_values['confirm'] == 1) { 84 $aid = actions_function_lookup($form_values['aid']); 85 db_query("DELETE FROM {trigger_assignments} WHERE hook = '%s' AND op = '%s' AND aid = '%s'", $form_values['hook'], $form_values['operation'], $aid); 86 $actions = actions_get_all_actions(); 87 watchdog('actions', 'Action %action has been unassigned.', array('%action' => $actions[$aid]['description'])); 88 drupal_set_message(t('Action %action has been unassigned.', array('%action' => $actions[$aid]['description']))); 89 $hook = $form_values['hook'] == 'nodeapi' ? 'node' : $form_values['hook']; 90 $form_state['redirect'] = 'admin/build/trigger/'. $hook; 91 } 92 else { 93 drupal_goto('admin/build/trigger'); 94 } 95 } 96 97 /** 98 * Create the form definition for assigning an action to a hook-op combination. 99 * 100 * @param $form_state 101 * Information about the current form. 102 * @param $hook 103 * The name of the hook, e.g., 'nodeapi'. 104 * @param $op 105 * The name of the hook operation, e.g., 'insert'. 106 * @param $description 107 * A plain English description of what this hook operation does. 108 * @return 109 * 110 * @ingoup forms 111 * @see trigger_assign_form_validate() 112 * @see trigger_assign_form_submit() 113 */ 114 function trigger_assign_form($form_state, $hook, $op, $description) { 115 $form['hook'] = array( 116 '#type' => 'hidden', 117 '#value' => $hook, 118 ); 119 $form['operation'] = array( 120 '#type' => 'hidden', 121 '#value' => $op, 122 ); 123 // All of these forms use the same validate and submit functions. 124 $form['#validate'][] = 'trigger_assign_form_validate'; 125 $form['#submit'][] = 'trigger_assign_form_submit'; 126 127 $options = array(); 128 $functions = array(); 129 // Restrict the options list to actions that declare support for this hook-op 130 // combination. 131 foreach (actions_list() as $func => $metadata) { 132 if (isset($metadata['hooks']['any']) || (isset($metadata['hooks'][$hook]) && is_array($metadata['hooks'][$hook]) && (in_array($op, $metadata['hooks'][$hook])))) { 133 $functions[] = $func; 134 } 135 } 136 foreach (actions_actions_map(actions_get_all_actions()) as $aid => $action) { 137 if (in_array($action['callback'], $functions)) { 138 $options[$action['type']][$aid] = $action['description']; 139 } 140 } 141 142 $form[$op] = array( 143 '#type' => 'fieldset', 144 '#title' => t('Trigger: ') . $description, 145 '#theme' => 'trigger_display' 146 ); 147 // Retrieve actions that are already assigned to this hook-op combination. 148 $actions = _trigger_get_hook_actions($hook, $op); 149 $form[$op]['assigned']['#type'] = 'value'; 150 $form[$op]['assigned']['#value'] = array(); 151 foreach ($actions as $aid => $description) { 152 $form[$op]['assigned']['#value'][$aid] = array( 153 'description' => $description, 154 'link' => l(t('unassign'), "admin/build/trigger/unassign/$hook/$op/". md5($aid)) 155 ); 156 } 157 158 $form[$op]['parent'] = array( 159 '#prefix' => "<div class='container-inline'>", 160 '#suffix' => '</div>', 161 ); 162 // List possible actions that may be assigned. 163 if (count($options) != 0) { 164 array_unshift($options, t('Choose an action')); 165 $form[$op]['parent']['aid'] = array( 166 '#type' => 'select', 167 '#options' => $options, 168 ); 169 $form[$op]['parent']['submit'] = array( 170 '#type' => 'submit', 171 '#value' => t('Assign') 172 ); 173 } 174 else { 175 $form[$op]['none'] = array( 176 '#value' => t('No available actions for this trigger.') 177 ); 178 } 179 return $form; 180 } 181 182 /** 183 * Validation function for trigger_assign_form(). 184 * 185 * Makes sure that the user is not re-assigning an action to an event. 186 */ 187 function trigger_assign_form_validate($form, $form_state) { 188 $form_values = $form_state['values']; 189 if (!empty($form_values['aid'])) { 190 $aid = actions_function_lookup($form_values['aid']); 191 if (db_result(db_query("SELECT aid FROM {trigger_assignments} WHERE hook = '%s' AND op = '%s' AND aid = '%s'", $form_values['hook'], $form_values['operation'], $aid))) { 192 form_set_error($form_values['operation'], t('The action you chose is already assigned to that trigger.')); 193 } 194 } 195 } 196 197 /** 198 * Submit function for trigger_assign_form(). 199 */ 200 function trigger_assign_form_submit($form, $form_state) { 201 $form_values = $form_state['values']; 202 203 if (!empty($form_values['aid'])) { 204 $aid = actions_function_lookup($form_values['aid']); 205 $weight = db_result(db_query("SELECT MAX(weight) FROM {trigger_assignments} WHERE hook = '%s' AND op = '%s'", $form_values['hook'], $form_values['operation'])); 206 db_query("INSERT INTO {trigger_assignments} values ('%s', '%s', '%s', %d)", $form_values['hook'], $form_values['operation'], $aid, $weight + 1); 207 // If this action changes a node property, we need to save the node 208 // so the change will persist. 209 $actions = actions_list(); 210 if (isset($actions[$aid]['behavior']) && in_array('changes_node_property', $actions[$aid]['behavior']) && ($form_values['operation'] != 'presave')) { 211 // Delete previous node_save_action if it exists, and re-add a new one at a higher weight. 212 $save_post_action_assigned = db_result(db_query("SELECT aid FROM {trigger_assignments} WHERE hook = '%s' AND op = '%s' AND aid = 'node_save_action'", $form_values['hook'], $form_values['operation'])); 213 if ($save_post_action_assigned) { 214 db_query("DELETE FROM {trigger_assignments} WHERE hook = '%s' AND op = '%s' AND aid = 'node_save_action'", $form_values['hook'], $form_values['operation']); 215 } 216 db_query("INSERT INTO {trigger_assignments} VALUES ('%s', '%s', '%s', %d)", $form_values['hook'], $form_values['operation'], 'node_save_action', $weight + 2); 217 if (!$save_post_action_assigned) { 218 drupal_set_message(t('You have added an action that changes a the property of a post. A Save post action has been added so that the property change will be saved.')); 219 } 220 } 221 } 222 } 223 224 /** 225 * Display actions assigned to this hook-op combination in a table. 226 * 227 * @param array $element 228 * The fieldset including all assigned actions. 229 * @return 230 * The rendered form with the table prepended. 231 * 232 * @ingroup themeable 233 */ 234 function theme_trigger_display($element) { 235 $header = array(); 236 $rows = array(); 237 if (count($element['assigned']['#value'])) { 238 $header = array(array('data' => t('Name')), array('data' => t('Operation'))); 239 $rows = array(); 240 foreach ($element['assigned']['#value'] as $aid => $info) { 241 $rows[] = array( 242 filter_xss_admin($info['description']), 243 $info['link'] 244 ); 245 } 246 } 247 248 if (count($rows)) { 249 $output = theme('table', $header, $rows) . drupal_render($element); 250 } 251 else { 252 $output = drupal_render($element); 253 } 254 return $output; 255 } 256 257 258 /** 259 * Get the actions that have already been defined for this 260 * type-hook-op combination. 261 * 262 * @param $type 263 * One of 'node', 'user', 'comment'. 264 * @param $hook 265 * The name of the hook for which actions have been assigned, 266 * e.g. 'nodeapi'. 267 * @param $op 268 * The hook operation for which the actions have been assigned, 269 * e.g., 'view'. 270 * @return 271 * An array of action descriptions keyed by action IDs. 272 */ 273 function _trigger_get_hook_actions($hook, $op, $type = NULL) { 274 $actions = array(); 275 if ($type) { 276 $result = db_query("SELECT h.aid, a.description FROM {trigger_assignments} h LEFT JOIN {actions} a on a.aid = h.aid WHERE a.type = '%s' AND h.hook = '%s' AND h.op = '%s' ORDER BY h.weight", $type, $hook, $op); 277 } 278 else { 279 $result = db_query("SELECT h.aid, a.description FROM {trigger_assignments} h LEFT JOIN {actions} a on a.aid = h.aid WHERE h.hook = '%s' AND h.op = '%s' ORDER BY h.weight", $hook, $op); 280 } 281 while ($action = db_fetch_object($result)) { 282 $actions[$action->aid] = $action->description; 283 } 284 return $actions; 285 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
| Generated: Thu Mar 24 11:18:33 2011 | Cross-referenced by PHPXref 0.7 |