From 6068b6d5ad181a9cc39b6b2f35b117602b18be1a Mon Sep 17 00:00:00 2001
From: Lorenz Schori <lo@znerol.ch>
Date: Wed, 25 May 2011 23:33:42 +0200
Subject: [PATCH] Port regcode_dynamic user interface to drupal 7

---
 regcode_dynamic/regcode_dynamic.module |  167 +++++++++++++++++---------------
 1 files changed, 90 insertions(+), 77 deletions(-)

diff --git a/regcode_dynamic/regcode_dynamic.module b/regcode_dynamic/regcode_dynamic.module
index a48bce9..ccae3f3 100644
--- a/regcode_dynamic/regcode_dynamic.module
+++ b/regcode_dynamic/regcode_dynamic.module
@@ -40,7 +40,7 @@ function regcode_dynamic_menu() {
     'title' => 'Dynamic',
     'description' => 'Dynamic codes',
     'page callback' => 'drupal_get_form',
-    'page arguments' => array('regcode_dynamic_create'),
+    'page arguments' => array('regcode_dynamic_rules_page'),
     'access arguments' => array('administer registration codes'),
     'type' => MENU_LOCAL_TASK,
     'weight' => 70,
@@ -50,16 +50,25 @@ function regcode_dynamic_menu() {
     'title' => 'Edit rule',
     'description' => 'Modify settings for this dynamic code rule',
     'page callback' => 'drupal_get_form',
-    'page arguments' => array('regcode_dynamic_settings', 5),
+    'page arguments' => array('regcode_dynamic_settings', 6),
     'access arguments' => array('administer registration codes'),
     'type' => MENU_CALLBACK,
   );
 
+  $items['admin/config/people/regcode/dynamic/add-rule'] = array(
+    'title' => 'Add rule',
+    'description' => 'Create a new dynamic code rule',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('regcode_dynamic_create'),
+    'access arguments' => array('administer registration codes'),
+    'type' => MENU_LOCAL_ACTION,
+  );
+
   $items['admin/config/people/regcode/dynamic/rule/%/delete'] = array(
     'title' => 'Delete rule',
     'description' => 'Delete settings for this dynamic code rule',
     'page callback' => 'regcode_dynamic_settings_delete',
-    'page arguments' => array(5),
+    'page arguments' => array(6),
     'access arguments' => array('administer registration codes'),
     'type' => MENU_CALLBACK,
   );
@@ -81,7 +90,7 @@ function regcode_dynamic_user_presave(&$edit, $account, $category) {
     }
 
     // Ensure this is a valid dynamic code
-    $rules = regcode_dynamic_rules();
+    $rules = variable_get('regcode_dynamic_settings', array());
     $valid = FALSE;
     foreach ($rules as $rule) {
       $handler = regcode_dynamic_handlers($rule['handler']);
@@ -106,27 +115,30 @@ function regcode_dynamic_user_presave(&$edit, $account, $category) {
 /**
  * Callback: Delete a rule
  */
-function regcode_dynamic_settings_delete($rule_id) {
-  variable_del('regcode_dynamic_settings_' . $rule_id);
+function regcode_dynamic_settings_delete($machine_name) {
+  $settings = variable_get('regcode_dynamic_settings', array());
+  unset($settings[$machine_name]);
+  variable_set('regcode_dynamic_settings', $settings);
+
   drupal_set_message(t('Rule deleted'));
-  drupal_goto('admin/user/regcode/dynamic');
+  drupal_goto('admin/config/people/regcode/dynamic');
 }
 
 
 /**
  * Form: Settings form for dynamic codes
  */
-function regcode_dynamic_settings($form, $form_state, $rule_id) {
+function regcode_dynamic_settings($form, &$form_state, $machine_name) {
+  $settings = variable_get('regcode_dynamic_settings', array());
+  if (!isset($settings[$machine_name])) {
+    drupal_not_found();
+  }
 
-  $data    = variable_get('regcode_dynamic_settings_' . $rule_id, array());
+  $data = $settings[$machine_name];
   $handler = regcode_dynamic_handlers($data['handler']);
 
-  $form = array();
-
-  $form['regcode_dynamic_rule_id'] = array(
-    '#type' => 'value',
-    '#value' => $rule_id,
-  );
+  // store rule in form state
+  $form_state['regcode_dynamic_rule'] = $data;
 
   $form['regcode_dynamic_handler'] = array(
     '#type' => 'fieldset',
@@ -175,14 +187,19 @@ function regcode_dynamic_settings($form, $form_state, $rule_id) {
  * Form submit: Save settings form
  */
 function regcode_dynamic_settings_submit($form, $form_state) {
+  $data = $form_state['regcode_dynamic_rule'];
+  $machine_name = $data['machine_name'];
+
   foreach (element_children($form['regcode_dynamic_handler']) as $key) {
     $data[$key] = $form_state['values'][$key];
   }
 
-  $rule_id = $form_state['values']['regcode_dynamic_rule_id'];
-  variable_set('regcode_dynamic_settings_' . $rule_id, $data);
+  $settings = variable_get('regcode_dynamic_settings', array());
+  $settings[$machine_name] = $data;
+  variable_set('regcode_dynamic_settings', $settings);
+
   drupal_set_message(t('Your settings have been saved.'));
-  drupal_goto('admin/user/regcode/dynamic');
+  drupal_goto('admin/config/people/regcode/dynamic');
 }
 
 
@@ -197,21 +214,25 @@ function regcode_dynamic_create($form, &$form_state) {
     $options[$handler_key] = $handler['title'];
   }
 
-  $form = array();
-
-  $form['regcode_dynamic_settings'] = array(
-    '#type' => 'fieldset',
-    '#title' => t('Create new configuration'),
-  );
-
-  $form['regcode_dynamic_settings']['name'] = array(
+  $form['name'] = array(
     '#type' => 'textfield',
     '#title' => t('Rule name'),
+    '#maxlength' => 255,
     '#description' => t('Name this rule for administration purposes.'),
     '#required' => TRUE,
   );
 
-  $form['regcode_dynamic_settings']['handler'] = array(
+  $form['machine_name'] = array(
+    '#type' => 'machine_name',
+    '#title' => t('Machine name'),
+    '#maxlength' => 21,
+    '#description' => t('A unique name to construct the URL for this rule. It must only contain lowercase letters, numbers and hyphens.'),
+    '#machine_name' => array(
+      'exists' => 'regcode_dynamic_name_exists',
+    ),
+  );
+
+  $form['handler'] = array(
     '#type' => 'select',
     '#title' => t('Handler'),
     '#options' => $options,
@@ -219,13 +240,16 @@ function regcode_dynamic_create($form, &$form_state) {
     '#required' => TRUE,
   );
 
-  $form['regcode_dynamic_settings']['save'] = array(
-    '#type' => 'submit',
-    '#value' => t('Create handler'),
+  $form['terms'] = array(
+    '#type' => 'checkboxes',
+    '#title' => t('Tags codes'),
+    '#description' => t('Tag dynamically created codes as they are used.'),
+    '#options' => regcode_get_vocab_terms(),
   );
 
-  $form['regcode_dynamic_rules_list'] = array(
-    '#value' => regcode_dynamic_rules_list(),
+  $form['save'] = array(
+    '#type' => 'submit',
+    '#value' => t('Create handler'),
   );
 
   return $form;
@@ -233,80 +257,69 @@ function regcode_dynamic_create($form, &$form_state) {
 
 
 /**
- * Form submit: Create a new rule set
+ * Returns true if a rule with the given machine_name exists
  */
-function regcode_dynamic_create_submit($form, $form_state) {
-
-  // Grab all of the existing handlers so we can know the next ID to create
-  $res = db_query("SELECT name FROM {variable} WHERE name like 'regcode_dynamic_settings_%' ORDER BY name DESC");
-
-  $count = db_affected_rows($res);
-  if ($count === 0) {
-    $id = 1;
-  }
-  else {
-    $key = explode('_', $res->fetchField()); // Strip the integer out of the key name
-    $id = ((int) $key[3]) + 1;
-  }
-
-  $data = array(
-    'name' => $form_state['values']['name'],
-    'handler' => $form_state['values']['handler'],
-  );
-  variable_set(sprintf('regcode_dynamic_settings_%d', $id), $data);
-
-  drupal_set_message('New dynamic rule created');
-  drupal_goto('admin/user/regcode/dynamic/rule/' . $id);
+function regcode_dynamic_name_exists($value) {
+  $settings = variable_get('regcode_dynamic_settings', array());
+  return isset($settings[$value]);
 }
 
 
 /**
- * Return all of the rules
+ * Form submit: Create a new rule set
  */
-function regcode_dynamic_rules() {
-  $res = db_query("SELECT name FROM {variable} WHERE name like 'regcode_dynamic_settings_%'");
-
-  $rows = array();
-  foreach ($res as $row) {
-    $key        = explode('_', $row['name']);
-    $id         = $key[3];
-    $data       = variable_get($row['name'], array());
-    $data['id'] = $id;
-    $rows[]     = $data;
-  }
+function regcode_dynamic_create_submit($form, $form_state) {
+  $machine_name = $form_state['values']['machine_name'];
+  $settings = variable_get('regcode_dynamic_settings', array());
+  $settings[$machine_name] = array(
+    'name' => $form_state['values']['name'],
+    'machine_name' => $form_state['values']['machine_name'],
+    'handler' => $form_state['values']['handler'],
+    'terms' => $form_state['values']['terms'],
+  );
+  variable_set('regcode_dynamic_settings', $settings);
 
-  return $rows;
+  drupal_set_message(t('New dynamic rule created'));
+  drupal_goto('admin/config/people/regcode/dynamic/rule/' . $machine_name);
 }
 
 
 /**
  * List all of the rules as a HTML table
  */
-function regcode_dynamic_rules_list() {
-
-  $rules = regcode_dynamic_rules();
+function regcode_dynamic_rules_page() {
+  $rules = variable_get('regcode_dynamic_settings', array());
   $rows  = array();
 
   foreach ($rules as $row) {
     $actions = array();
-    $actions[] = l('Edit', sprintf('admin/user/regcode/dynamic/rule/%d', $row['id']));
-    $actions[] = l('Delete', sprintf('admin/user/regcode/dynamic/rule/%d/delete', $row['id']));
+    $actions[] = l('Edit', sprintf(
+      'admin/config/people/regcode/dynamic/rule/%s', $row['machine_name']));
+    $actions[] = l('Delete', sprintf(
+      'admin/config/people/regcode/dynamic/rule/%s/delete', $row['machine_name']));
 
     $rows[] = array(
-      $row['id'],
       $row['name'],
       $row['handler'],
       implode(' | ', $actions),
     );
   }
 
-  $headers = array(
-    t('Rule #'),
+  $header = array(
     t('Name'),
     t('Handler'),
+    t('Operations'),
+  );
+
+  $table = array(
+    '#theme' => 'table',
+    '#header' => $header,
+    '#rows' => $rows,
+    '#empty' => t('No rules defined. <a href="@link">Add rule</a>.', array('@link' => url('admin/config/people/regcode/dynamic/add-rule'))),
+
   );
 
-  return theme('table', array('header' => $headers, 'rows' => $rows));
+  return $table;
 }
 
 
-- 
1.7.1

