| [ Index ] |
PHP Cross Reference of Drupal 6 (gatewave) |
[Summary view] [Print] [Text view]
1 <?php 2 // $Id: rules_admin.sets.inc,v 1.1.2.10 2010/11/25 11:14:53 fago Exp $ 3 4 5 /** 6 * @file Rules Sets Admin UI 7 */ 8 9 rules_include('rules_admin'); 10 11 function rules_admin_sets_overview() { 12 $sets = rules_get_configured_items('rule_sets'); 13 $sets = array_filter($sets, 'rules_admin_element_filter'); 14 ksort($sets); 15 16 $header = array(t('Label'), t('Name'), t('Category'), t('Status'), t('Operations')); 17 $rows = array(); 18 19 foreach ($sets as $name => $set_info) { 20 $set_info += array('status' => 'default'); 21 22 $path = RULES_ADMIN_SET_PATH .'/'. $name; 23 $ops = array(); 24 if ($set_info['status'] == 'custom') { 25 $ops[] = l(t('delete'), $path .'/delete', array('query' => drupal_get_destination())); 26 } 27 else if ($set_info['status'] == 'altered') { 28 $ops[] = l(t('revert'), $path .'/revert', array('query' => drupal_get_destination())); 29 } 30 $categories = isset($set_info['categories']) ? array_map('check_plain', $set_info['categories']) : array(); 31 32 $rows[] = array( 33 l($set_info['label'], $path .'/edit'), 34 check_plain($name), 35 implode(', ', $categories), 36 theme('rules_admin_configuration_status', $set_info['status']), 37 implode(' ', $ops), 38 ); 39 } 40 41 if (empty($rows)) { 42 $rows[] = array(array('data' => t('There are no rule sets.'), 'colspan' => 6)); 43 } 44 45 return theme('table', $header, $rows, array('class' => 'rules-sets-configurations')); 46 } 47 48 /** 49 * Shows the delete form for items 50 */ 51 function rules_admin_item_form_delete(&$form_state, $item_type, $item) { 52 $form = array(); 53 $form_state['item'] = $item; 54 $form_state['item_type'] = $item_type; 55 56 $path = array(); 57 $path['path'] = isset($_GET['destination']) ? $_GET['destination'] : RULES_ADMIN_PATH; 58 59 return confirm_form($form, 60 t('Are you sure you want to delete %label?', array('%label' => rules_get_element_label($item))), 61 $path, 62 t('This action cannot be undone.'), t('Delete'), t('Cancel') 63 ); 64 } 65 66 function rules_admin_item_form_delete_submit($form, &$form_state) { 67 rules_item_delete($form_state['item_type'], $form_state['item']['name']); 68 rules_clear_cache(); 69 drupal_set_message(t("%label has been deleted.", array('%label' => rules_get_element_label($form_state['item'])))); 70 $form_state['redirect'] = RULES_ADMIN_PATH; 71 } 72 73 /** 74 * Shows the revert form for items 75 */ 76 function rules_admin_item_form_revert(&$form_state, $item_type, $item) { 77 $form = array(); 78 $form_state['item'] = $item; 79 $form_state['item_type'] = $item_type; 80 81 $path = array(); 82 $path['path'] = isset($_GET['destination']) ? $_GET['destination'] : RULES_ADMIN_PATH; 83 84 return confirm_form($form, 85 t('Are you sure you want to revert %label?', array('%label' => rules_get_element_label($item))), 86 $path, 87 t('This action cannot be undone.'), t('Revert'), t('Cancel') 88 ); 89 } 90 91 function rules_admin_item_form_revert_submit($form, &$form_state) { 92 rules_item_delete($form_state['item_type'], $form_state['item']['name']); 93 rules_clear_cache(); 94 drupal_set_message(t("%label has been reverted.", array('%label' => rules_get_element_label($form_state['item'])))); 95 $form_state['redirect'] = RULES_ADMIN_PATH; 96 } 97 98 /** 99 * Item type callback: Deleted rule set 100 */ 101 function rules_item_rule_set_delete($set_name) { 102 // Delete all rules belonging to this set too 103 $rules = rules_get_configured_items('rules'); 104 foreach ($rules as $name => $rule) { 105 if ($rule['#set'] == $set_name) { 106 rules_item_delete('rules', $name); 107 } 108 } 109 } 110 111 /** 112 * Shows the rule set edit page form 113 */ 114 function rules_admin_form_edit_rule_set(&$form_state, $set_info) { 115 $form_state['set'] = $set_info; 116 $changable_name = $set_info['status'] == 'custom'; 117 $rule_name = $set_info['name']; 118 // Does our name start with rules? 119 if (preg_match('/^rules_/', $set_info['name'])) { 120 $set_info['name'] = drupal_substr($set_info['name'], drupal_strlen('rules_')); 121 } 122 else { 123 $changable_name = FALSE; 124 } 125 $form = rules_admin_form_rule_set_settings($set_info, $changable_name); 126 $form['active_header'] = array('#value' => '<br /><h3>'. t('Active rules') .'</h3>'); 127 $form['active'] = rules_admin_overview_table(array('set' => $rule_name, 'active' => TRUE)); 128 $form['active']['#suffix'] = '<br />'; 129 $form['inactive_header'] = array('#value' => '<h3>'. t('Inactive rules') .'</h3>'); 130 $form['inactive'] = rules_admin_overview_table(array('set' => $rule_name, 'active' => FALSE)); 131 132 if (variable_get('rules_show_fixed', FALSE)) { 133 $form['fixed_header'] = array('#value' => '<h3>'. t('Fixed rules') .'</h3>'); 134 $form['fixed'] = rules_admin_overview_table(array('set' => $rule_name, 'active' => TRUE, 'fixed' => TRUE)); 135 } 136 return $form; 137 } 138 139 /** 140 * Returns the form for the settings of a rule set 141 */ 142 function rules_admin_form_rule_set_settings($set_info = array(), $changable_name = TRUE) { 143 $form['settings'] = array( 144 '#type' => 'fieldset', 145 '#title' => t('Rule set settings'), 146 '#collapsible' => TRUE, 147 ); 148 $form['settings']['label'] = array( 149 '#title' => t('Label'), 150 '#type' => 'textfield', 151 '#description' => t('Choose an appropriate label for this rule set.'), 152 '#default_value' => isset($set_info['label']) ? $set_info['label'] : '', 153 '#required' => TRUE, 154 ); 155 $form['settings']['name'] = array( 156 '#title' => t('Machine readable name'), 157 '#type' => 'textfield', 158 '#description' => t('Specify a unique name containing only alphanumeric characters, and underscores.'), 159 '#default_value' => isset($set_info['name']) ? $set_info['name'] : '', 160 '#disabled' => !$changable_name, 161 '#required' => TRUE, 162 ); 163 // Only set the value if name isn't changable. 164 if (!$changable_name) { 165 $form['settings']['name']['#value'] = isset($set_info['name']) ? $set_info['name'] : ''; 166 } 167 $form['settings']['categories'] = array( 168 '#type' => 'textfield', 169 '#title' => t('Categories'), 170 '#default_value' => isset($set_info['categories']) ? implode(', ', $set_info['categories']) : '', 171 '#description' => t('A comma-separated list of terms describing this rule set. Example: funny, bungee jumping.'), 172 '#autocomplete_path' => RULES_ADMIN_PATH .'/autocomplete', 173 ); 174 $form['settings']['button'] = array('#type' => 'submit', '#weight' => 10, '#value' => t('Save changes')); 175 return $form; 176 } 177 178 function rules_admin_form_edit_rule_set_validate($form, &$form_state) { 179 if ($form_state['set']['name'] != 'rules_' . $form_state['values']['name']) { 180 rules_admin_validate_machine_name('rule_sets', 'name', $form_state['values']['name']); 181 } 182 } 183 184 function rules_admin_form_edit_rule_set_submit($form, &$form_state) { 185 $set_info = $form_state['set']; 186 $set_info['label'] = $form_state['values']['label']; 187 if (!isset($set_info['status']) || $set_info['status'] == 'default') { 188 $set_info['status'] = 'altered'; 189 } 190 $set_info['categories'] = array_filter(array_map('trim', explode(',', $form_state['values']['categories']))); 191 unset($set_info['name']); 192 rules_item_save('rule_sets', $form_state['set']['name'], $set_info); 193 drupal_set_message(t("The rule set %label has been updated.", array('%label' => $set_info['label']))); 194 $name = 'rules_' . $form_state['values']['name']; 195 if ($set_info['status'] == 'custom' && $form_state['set']['name'] != $name) { 196 rules_item_change_name('rule_sets', $form_state['set']['name'], $name); 197 $form_state['redirect'] = 'admin/rules/rule_sets/' . $name . '/edit'; 198 } 199 } 200 201 /** 202 * Form for adding a rule set 203 */ 204 function rules_admin_form_add_rule_set(&$form_state) { 205 //in case of non-js we degrade to a multistep form 206 $set_info = isset($form_state['set']) ? $form_state['set'] : array('arguments' => array()); 207 208 $form = rules_admin_form_rule_set_settings($set_info); 209 unset($form['settings']['button']); 210 211 //add form for specifying arguments 212 $form['args'] = array( 213 '#type' => 'fieldset', 214 '#title' => t('Arguments'), 215 '#collapsible' => TRUE, 216 '#prefix' => '<div id="rules-set-args">', 217 '#suffix' => '</div>', 218 '#tree' => TRUE, 219 '#theme' => 'rules_admin_form_arguments', 220 '#description' => t('You may specify some arguments, which have to be passed to the rule set when it is invoked. For each argument you have to specify a certain data type, a label and a unique machine readable name containing only alphanumeric characters, and underscores.'), 221 ); 222 foreach ($set_info['arguments'] as $name => $info) { 223 $form['settings']['args'][$name] = _rules_admin_form_argument($name, $info); 224 } 225 for ($i = 0; $i < 3; $i++) { 226 $form['args'][$i] = _rules_admin_form_argument(); 227 } 228 229 $form['args']['rules_more'] = array( 230 '#type' => 'submit', 231 '#value' => t('More arguments'), 232 '#description' => t("If the amount of boxes above isn't enough, click here to add more arguments."), 233 '#weight' => 1, 234 '#submit' => array('rules_admin_form_add_rule_set_rebuild'), // If no javascript action. 235 '#ahah' => array( 236 'path' => RULES_ADMIN_SET_PATH .'/js', 237 'wrapper' => 'rules-set-args', 238 'method' => 'replace', 239 ), 240 ); 241 $form['button'] = array('#type' => 'submit', '#weight' => 10, '#value' => t('Save')); 242 return $form; 243 } 244 245 /** 246 * Validates the set and builds it -> $form_state['set'] 247 */ 248 function rules_admin_form_add_rule_set_validate($form, &$form_state) { 249 // Validate machine name. 250 rules_admin_validate_machine_name('rule_sets', 'name', $form_state['values']['name']); 251 252 //validate the arguments 253 unset($form_state['values']['args']['rules_more']); 254 foreach ($form_state['values']['args'] as $i => $values) { 255 if (array_filter($values)) { 256 foreach (array('name', 'type', 'label') as $key) { 257 if (!$values[$key]) { 258 form_set_error(implode('][', array('args', $i, $key)), t('All fields of an argument are required.')); 259 } 260 } 261 if (!preg_match('/^[a-z][a-z0-9_]*$/', $values['name'])) { 262 form_set_error(implode('][', array('args', $i, 'name')), t('The name may contain only digits, numbers and underscores.')); 263 } 264 } 265 else { 266 unset($form_state['values']['args'][$i]); 267 } 268 } 269 //build the set 270 $set_info = array('arguments' => array()); 271 $set_info['label'] = $form_state['values']['label']; 272 $set_info['name'] = $form_state['values']['name']; 273 274 foreach ($form_state['values']['args'] as $i => $values) { 275 if (isset($set_info['arguments'][ $values['name'] ])) { 276 form_set_error('args]['. $i .'][name', t('Each name may be used only once.')); 277 } 278 else { 279 $set_info['arguments'][ $values['name'] ] = array( 280 'label' => $values['label'], 281 'type' => $values['type'], 282 ); 283 } 284 } 285 $form_state['set'] = $set_info; 286 } 287 288 function rules_admin_form_add_rule_set_rebuild($form, &$form_state) { 289 $form_state['rebuild'] = TRUE; 290 } 291 292 function _rules_admin_form_argument($name = '', $info = array()) { 293 $form = array(); 294 $form['label'] = array( 295 '#type' => 'textfield', 296 '#title' => t('Label'), 297 '#size' => 40, 298 '#default_value' => isset($info['label']) ? $info['label'] : '', 299 ); 300 $options = rules_extract_property(array_filter(rules_get_data_types(), 'rules_admin_element_filter'), 'label'); 301 $options = array_map('drupal_ucfirst', $options); 302 asort($options); 303 $form['type'] = array( 304 '#type' => 'select', 305 '#title' => t('Data type'), 306 '#options' => array(0 => '--') + $options, 307 '#default_value' => isset($info['type']) ? $info['type'] : '', 308 ); 309 $form['name'] = array( 310 '#type' => 'textfield', 311 '#title' => t('Machine readable variable name'), 312 '#size' => 40, 313 '#default_value' => $name, 314 ); 315 return $form; 316 } 317 318 /** 319 * A generic AHAH JS callback. Gets the cached form and passes it to the given callback 320 * to alter it. The callback returns the a reference on the to be rendered form, 321 * which is rendered and returned to the JS. 322 */ 323 function rules_admin_form_js($callback) { 324 $form_state = array('submitted' => FALSE); 325 $form_build_id = $_POST['form_build_id']; 326 // Add the new element to the stored form. Without adding the element to the 327 // form, Drupal is not aware of this new elements existence and will not 328 // process it. We retreive the cached form, add the element, and resave. 329 $form = form_get_cache($form_build_id, $form_state); 330 331 $render = &$callback($form); 332 333 form_set_cache($form_build_id, $form, $form_state); 334 $form += array( 335 '#post' => $_POST, 336 '#programmed' => FALSE, 337 ); 338 // Rebuild the form. 339 $form = form_builder($_POST['form_id'], $form, $form_state); 340 // Render the new output. 341 print drupal_to_js(array('data' => drupal_render($render), 'status' => TRUE)); 342 exit(); 343 } 344 345 /** 346 * rules AHAH JS callback for adding arguments 347 */ 348 function &rules_admin_form_add_rule_set_add_arguments(&$form) { 349 $start = count($form['args']) - 1; 350 for ($i = $start; $i - $start < 3; $i++) { 351 $form['args'][$i] = _rules_admin_form_argument(); 352 } 353 return $form['args']; 354 } 355 356 /** 357 * Themes the rules set arguments adding form 358 */ 359 function theme_rules_admin_form_arguments($form) { 360 drupal_add_js(drupal_get_path('module', 'rules_admin') .'/rules_admin.js', 'module'); 361 362 $rows = array(); 363 $headers = array( 364 t('Data type'), 365 t('Label'), 366 t('Machine readable name'), 367 ); 368 369 $button = drupal_render($form['rules_more']); 370 unset($form['rules_more']); 371 372 foreach (element_children($form) as $key) { 373 // No need to print the field title every time. 374 unset($form[$key]['label']['#title'], $form[$key]['name']['#title'], $form[$key]['type']['#title']); 375 // Build the table row. 376 $row = array( 377 'data' => array( 378 array('data' => drupal_render($form[$key]['type']), 'class' => 'rules-argument-data-type'), 379 array('data' => drupal_render($form[$key]['label']), 'class' => 'rules-argument-label'), 380 array('data' => drupal_render($form[$key]['name']), 'class' => 'rules-argument-name'), 381 ), 382 ); 383 // Add additional attributes to the row, such as a class for this row. 384 if (isset($form[$key]['#attributes'])) { 385 $row = array_merge($row, $form[$key]['#attributes']); 386 } 387 $rows[] = $row; 388 } 389 390 $output = theme('table', $headers, $rows); 391 $output .= drupal_render($form) . $button; 392 return $output; 393 } 394 395 function rules_admin_form_add_rule_set_submit($form, &$form_state) { 396 $set_info = $form_state['set']; 397 $set_info['status'] = 'custom'; 398 $set_info['categories'] = array_filter(array_map('trim', explode(',', $form_state['values']['categories']))); 399 unset($set_info['name']); 400 rules_item_save('rule_sets', 'rules_'. $form_state['set']['name'], $set_info); 401 drupal_set_message(t("The rule set %label has been added.", array('%label' => $set_info['label']))); 402 $form_state['redirect'] = RULES_ADMIN_SET_PATH; 403 } 404
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 |