$set_info) {
$set_info += array('status' => 'default');
$path = RULES_ADMIN_SET_PATH .'/'. $name;
$ops = array();
if ($set_info['status'] == 'custom') {
$ops[] = l(t('delete'), $path .'/delete', array('query' => drupal_get_destination()));
}
else if ($set_info['status'] == 'altered') {
$ops[] = l(t('revert'), $path .'/revert', array('query' => drupal_get_destination()));
}
$categories = isset($set_info['categories']) ? array_map('check_plain', $set_info['categories']) : array();
$rows[] = array(
l($set_info['label'], $path .'/edit'),
check_plain($name),
implode(', ', $categories),
theme('rules_admin_configuration_status', $set_info['status']),
implode(' ', $ops),
);
}
if (empty($rows)) {
$rows[] = array(array('data' => t('There are no rule sets.'), 'colspan' => 6));
}
return theme('table', $header, $rows, array('class' => 'rules-sets-configurations'));
}
/**
* Shows the delete form for items
*/
function rules_admin_item_form_delete(&$form_state, $item_type, $item) {
$form = array();
$form_state['item'] = $item;
$form_state['item_type'] = $item_type;
$path = array();
$path['path'] = isset($_GET['destination']) ? $_GET['destination'] : RULES_ADMIN_PATH;
return confirm_form($form,
t('Are you sure you want to delete %label?', array('%label' => rules_get_element_label($item))),
$path,
t('This action cannot be undone.'), t('Delete'), t('Cancel')
);
}
function rules_admin_item_form_delete_submit($form, &$form_state) {
rules_item_delete($form_state['item_type'], $form_state['item']['name']);
rules_clear_cache();
drupal_set_message(t("%label has been deleted.", array('%label' => rules_get_element_label($form_state['item']))));
$form_state['redirect'] = RULES_ADMIN_PATH;
}
/**
* Shows the revert form for items
*/
function rules_admin_item_form_revert(&$form_state, $item_type, $item) {
$form = array();
$form_state['item'] = $item;
$form_state['item_type'] = $item_type;
$path = array();
$path['path'] = isset($_GET['destination']) ? $_GET['destination'] : RULES_ADMIN_PATH;
return confirm_form($form,
t('Are you sure you want to revert %label?', array('%label' => rules_get_element_label($item))),
$path,
t('This action cannot be undone.'), t('Revert'), t('Cancel')
);
}
function rules_admin_item_form_revert_submit($form, &$form_state) {
rules_item_delete($form_state['item_type'], $form_state['item']['name']);
rules_clear_cache();
drupal_set_message(t("%label has been reverted.", array('%label' => rules_get_element_label($form_state['item']))));
$form_state['redirect'] = RULES_ADMIN_PATH;
}
/**
* Item type callback: Deleted rule set
*/
function rules_item_rule_set_delete($set_name) {
// Delete all rules belonging to this set too
$rules = rules_get_configured_items('rules');
foreach ($rules as $name => $rule) {
if ($rule['#set'] == $set_name) {
rules_item_delete('rules', $name);
}
}
}
/**
* Shows the rule set edit page form
*/
function rules_admin_form_edit_rule_set(&$form_state, $set_info) {
$form_state['set'] = $set_info;
$changable_name = $set_info['status'] == 'custom';
$rule_name = $set_info['name'];
// Does our name start with rules?
if (preg_match('/^rules_/', $set_info['name'])) {
$set_info['name'] = drupal_substr($set_info['name'], drupal_strlen('rules_'));
}
else {
$changable_name = FALSE;
}
$form = rules_admin_form_rule_set_settings($set_info, $changable_name);
$form['active_header'] = array('#value' => '
'. t('Active rules') .'
');
$form['active'] = rules_admin_overview_table(array('set' => $rule_name, 'active' => TRUE));
$form['active']['#suffix'] = '
';
$form['inactive_header'] = array('#value' => ''. t('Inactive rules') .'
');
$form['inactive'] = rules_admin_overview_table(array('set' => $rule_name, 'active' => FALSE));
if (variable_get('rules_show_fixed', FALSE)) {
$form['fixed_header'] = array('#value' => ''. t('Fixed rules') .'
');
$form['fixed'] = rules_admin_overview_table(array('set' => $rule_name, 'active' => TRUE, 'fixed' => TRUE));
}
return $form;
}
/**
* Returns the form for the settings of a rule set
*/
function rules_admin_form_rule_set_settings($set_info = array(), $changable_name = TRUE) {
$form['settings'] = array(
'#type' => 'fieldset',
'#title' => t('Rule set settings'),
'#collapsible' => TRUE,
);
$form['settings']['label'] = array(
'#title' => t('Label'),
'#type' => 'textfield',
'#description' => t('Choose an appropriate label for this rule set.'),
'#default_value' => isset($set_info['label']) ? $set_info['label'] : '',
'#required' => TRUE,
);
$form['settings']['name'] = array(
'#title' => t('Machine readable name'),
'#type' => 'textfield',
'#description' => t('Specify a unique name containing only alphanumeric characters, and underscores.'),
'#default_value' => isset($set_info['name']) ? $set_info['name'] : '',
'#disabled' => !$changable_name,
'#required' => TRUE,
);
// Only set the value if name isn't changable.
if (!$changable_name) {
$form['settings']['name']['#value'] = isset($set_info['name']) ? $set_info['name'] : '';
}
$form['settings']['categories'] = array(
'#type' => 'textfield',
'#title' => t('Categories'),
'#default_value' => isset($set_info['categories']) ? implode(', ', $set_info['categories']) : '',
'#description' => t('A comma-separated list of terms describing this rule set. Example: funny, bungee jumping.'),
'#autocomplete_path' => RULES_ADMIN_PATH .'/autocomplete',
);
$form['settings']['button'] = array('#type' => 'submit', '#weight' => 10, '#value' => t('Save changes'));
return $form;
}
function rules_admin_form_edit_rule_set_validate($form, &$form_state) {
if ($form_state['set']['name'] != 'rules_' . $form_state['values']['name']) {
rules_admin_validate_machine_name('rule_sets', 'name', $form_state['values']['name']);
}
}
function rules_admin_form_edit_rule_set_submit($form, &$form_state) {
$set_info = $form_state['set'];
$set_info['label'] = $form_state['values']['label'];
if (!isset($set_info['status']) || $set_info['status'] == 'default') {
$set_info['status'] = 'altered';
}
$set_info['categories'] = array_filter(array_map('trim', explode(',', $form_state['values']['categories'])));
unset($set_info['name']);
rules_item_save('rule_sets', $form_state['set']['name'], $set_info);
drupal_set_message(t("The rule set %label has been updated.", array('%label' => $set_info['label'])));
$name = 'rules_' . $form_state['values']['name'];
if ($set_info['status'] == 'custom' && $form_state['set']['name'] != $name) {
rules_item_change_name('rule_sets', $form_state['set']['name'], $name);
$form_state['redirect'] = 'admin/rules/rule_sets/' . $name . '/edit';
}
}
/**
* Form for adding a rule set
*/
function rules_admin_form_add_rule_set(&$form_state) {
//in case of non-js we degrade to a multistep form
$set_info = isset($form_state['set']) ? $form_state['set'] : array('arguments' => array());
$form = rules_admin_form_rule_set_settings($set_info);
unset($form['settings']['button']);
//add form for specifying arguments
$form['args'] = array(
'#type' => 'fieldset',
'#title' => t('Arguments'),
'#collapsible' => TRUE,
'#prefix' => '',
'#suffix' => '
',
'#tree' => TRUE,
'#theme' => 'rules_admin_form_arguments',
'#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.'),
);
foreach ($set_info['arguments'] as $name => $info) {
$form['settings']['args'][$name] = _rules_admin_form_argument($name, $info);
}
for ($i = 0; $i < 3; $i++) {
$form['args'][$i] = _rules_admin_form_argument();
}
$form['args']['rules_more'] = array(
'#type' => 'submit',
'#value' => t('More arguments'),
'#description' => t("If the amount of boxes above isn't enough, click here to add more arguments."),
'#weight' => 1,
'#submit' => array('rules_admin_form_add_rule_set_rebuild'), // If no javascript action.
'#ahah' => array(
'path' => RULES_ADMIN_SET_PATH .'/js',
'wrapper' => 'rules-set-args',
'method' => 'replace',
),
);
$form['button'] = array('#type' => 'submit', '#weight' => 10, '#value' => t('Save'));
return $form;
}
/**
* Validates the set and builds it -> $form_state['set']
*/
function rules_admin_form_add_rule_set_validate($form, &$form_state) {
// Validate machine name.
rules_admin_validate_machine_name('rule_sets', 'name', $form_state['values']['name']);
//validate the arguments
unset($form_state['values']['args']['rules_more']);
foreach ($form_state['values']['args'] as $i => $values) {
if (array_filter($values)) {
foreach (array('name', 'type', 'label') as $key) {
if (!$values[$key]) {
form_set_error(implode('][', array('args', $i, $key)), t('All fields of an argument are required.'));
}
}
if (!preg_match('/^[a-z][a-z0-9_]*$/', $values['name'])) {
form_set_error(implode('][', array('args', $i, 'name')), t('The name may contain only digits, numbers and underscores.'));
}
}
else {
unset($form_state['values']['args'][$i]);
}
}
//build the set
$set_info = array('arguments' => array());
$set_info['label'] = $form_state['values']['label'];
$set_info['name'] = $form_state['values']['name'];
foreach ($form_state['values']['args'] as $i => $values) {
if (isset($set_info['arguments'][ $values['name'] ])) {
form_set_error('args]['. $i .'][name', t('Each name may be used only once.'));
}
else {
$set_info['arguments'][ $values['name'] ] = array(
'label' => $values['label'],
'type' => $values['type'],
);
}
}
$form_state['set'] = $set_info;
}
function rules_admin_form_add_rule_set_rebuild($form, &$form_state) {
$form_state['rebuild'] = TRUE;
}
function _rules_admin_form_argument($name = '', $info = array()) {
$form = array();
$form['label'] = array(
'#type' => 'textfield',
'#title' => t('Label'),
'#size' => 40,
'#default_value' => isset($info['label']) ? $info['label'] : '',
);
$options = rules_extract_property(array_filter(rules_get_data_types(), 'rules_admin_element_filter'), 'label');
$options = array_map('drupal_ucfirst', $options);
asort($options);
$form['type'] = array(
'#type' => 'select',
'#title' => t('Data type'),
'#options' => array(0 => '--') + $options,
'#default_value' => isset($info['type']) ? $info['type'] : '',
);
$form['name'] = array(
'#type' => 'textfield',
'#title' => t('Machine readable variable name'),
'#size' => 40,
'#default_value' => $name,
);
return $form;
}
/**
* A generic AHAH JS callback. Gets the cached form and passes it to the given callback
* to alter it. The callback returns the a reference on the to be rendered form,
* which is rendered and returned to the JS.
*/
function rules_admin_form_js($callback) {
$form_state = array('submitted' => FALSE);
$form_build_id = $_POST['form_build_id'];
// Add the new element to the stored form. Without adding the element to the
// form, Drupal is not aware of this new elements existence and will not
// process it. We retreive the cached form, add the element, and resave.
$form = form_get_cache($form_build_id, $form_state);
$render = &$callback($form);
form_set_cache($form_build_id, $form, $form_state);
$form += array(
'#post' => $_POST,
'#programmed' => FALSE,
);
// Rebuild the form.
$form = form_builder($_POST['form_id'], $form, $form_state);
// Render the new output.
print drupal_to_js(array('data' => drupal_render($render), 'status' => TRUE));
exit();
}
/**
* rules AHAH JS callback for adding arguments
*/
function &rules_admin_form_add_rule_set_add_arguments(&$form) {
$start = count($form['args']) - 1;
for ($i = $start; $i - $start < 3; $i++) {
$form['args'][$i] = _rules_admin_form_argument();
}
return $form['args'];
}
/**
* Themes the rules set arguments adding form
*/
function theme_rules_admin_form_arguments($form) {
drupal_add_js(drupal_get_path('module', 'rules_admin') .'/rules_admin.js', 'module');
$rows = array();
$headers = array(
t('Data type'),
t('Label'),
t('Machine readable name'),
);
$button = drupal_render($form['rules_more']);
unset($form['rules_more']);
foreach (element_children($form) as $key) {
// No need to print the field title every time.
unset($form[$key]['label']['#title'], $form[$key]['name']['#title'], $form[$key]['type']['#title']);
// Build the table row.
$row = array(
'data' => array(
array('data' => drupal_render($form[$key]['type']), 'class' => 'rules-argument-data-type'),
array('data' => drupal_render($form[$key]['label']), 'class' => 'rules-argument-label'),
array('data' => drupal_render($form[$key]['name']), 'class' => 'rules-argument-name'),
),
);
// Add additional attributes to the row, such as a class for this row.
if (isset($form[$key]['#attributes'])) {
$row = array_merge($row, $form[$key]['#attributes']);
}
$rows[] = $row;
}
$output = theme('table', $headers, $rows);
$output .= drupal_render($form) . $button;
return $output;
}
function rules_admin_form_add_rule_set_submit($form, &$form_state) {
$set_info = $form_state['set'];
$set_info['status'] = 'custom';
$set_info['categories'] = array_filter(array_map('trim', explode(',', $form_state['values']['categories'])));
unset($set_info['name']);
rules_item_save('rule_sets', 'rules_'. $form_state['set']['name'], $set_info);
drupal_set_message(t("The rule set %label has been added.", array('%label' => $set_info['label'])));
$form_state['redirect'] = RULES_ADMIN_SET_PATH;
}