Mercurial > defr > drupal > core
comparison modules/trigger/trigger.admin.inc @ 1:c1f4ac30525a 6.0
Drupal 6.0
author | Franck Deroche <webmaster@defr.org> |
---|---|
date | Tue, 23 Dec 2008 14:28:28 +0100 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
0:5a113a1c4740 | 1:c1f4ac30525a |
---|---|
1 <?php | |
2 // $Id: trigger.admin.inc,v 1.5 2008/01/08 10:35:43 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' => check_plain($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 $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 } |