[ Index ]

PHP Cross Reference of Drupal 6 (gatewave)

title

Body

[close]

/sites/all/modules/rules/rules_admin/ -> rules_admin.sets.inc (source)

   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  


Generated: Thu Mar 24 11:18:33 2011 Cross-referenced by PHPXref 0.7