Sfoglia il codice sorgente

Issue 1764346 #5: Added API functions to delete records and fields. On delete of either the indicies of the template are reset to ensure there is no gap. This should fix the weird behaviour.

Lacey Sanderson 12 anni fa
parent
commit
95b740ff06

+ 124 - 0
tripal_bulk_loader/api/tripal_bulk_loader.api.templates.inc

@@ -0,0 +1,124 @@
+<?php
+/**
+ * @file
+ * All functions in this file provide an API to administrative management of bulk loader templates
+ */
+
+/**
+ * Meant to be called from a form_validate function to ensure a newly added bulk loader record
+ * name is unique and not empty.
+ *
+ * @param $new_record_name
+ *   The record name to check for uniqueness
+ * @param $template_id
+ *   The template_id of the template to add the record to
+ * @param $template_array
+ *   The array describing the template. Optional -will be loaded using template_id if not provided
+ * @param $current_priority
+ *   The priority of the already existing record -checks that the name only occurs on this particular record
+ *
+ * @return
+ *   TRUE if the record name is not empty and not already in the template_array; FALSE otherwise
+ */
+function tripal_bulk_loader_is_record_name_unique($new_record_name, $template_id, $template_array = NULL, $current_priority = NULL) {
+
+  // get the template array if it's not supplied
+  if (empty($template_array)) {
+    $template = db_fetch_object(db_query("SELECT * FROM {tripal_bulk_loader_template} WHERE template_id=%d", $template_id));
+    $template_array = unserialize($template->template_array);
+    if (!is_array($template_array)) {
+      watchdog(
+        'tripal_bulk_loader',
+        'Unable to retrieve template array from database where template_id=%template_id',
+        array('%template_id' => $template_id),
+        WATCHDOG_WARNING
+      );
+      return FALSE;
+    }
+  }
+
+  // Check that the new record name is not empty
+  if (empty($new_record_name)) {
+    return FALSE;
+  }
+
+  // Check the new record name is unique
+  foreach ($template_array as $priority => $t) {
+    if (strcmp($t['record_id'], $new_record_name) == 0) {
+    	if (($priority != $current_priority) AND ($current_priority !== NULL)) {
+	      return FALSE;
+	    }
+    }
+  }
+  return TRUE;
+}
+
+/**
+ * An API function to delete a record from a template array
+ *
+ * @param $delete_priority
+ *   The priority of the record to be deleted
+ * @param $template_array
+ *   The array describing the template
+ *
+ * @return
+ *   The modified template array
+ */
+function tripal_bulk_loader_delete_record($delete_priority, $template_array) {
+
+	if (empty($template_array)) {
+		drupal_set_message("Unable to delete record with a priority of $priority since the template was not supplied",'error');
+		return FALSE;
+	}
+
+	$new_template_array = array();
+	$i=0;
+	foreach ($template_array as $priority => $record) {
+		if ($priority != $delete_priority) {
+			$new_template_array[$i] = $record;
+			$i++;
+		}
+	}
+
+	return $new_template_array;
+}
+
+/**
+ * An API function to delete a field from a template array
+ *
+ * @param $priority
+ *   The priority of the record containing the field
+ * @param $delete_field_index
+ *   The index of the field to be deleted
+ * @param $template_array
+ *   The array describing the template
+ *
+ * @return
+ *   The modified template array
+ */
+function tripal_bulk_loader_delete_field($priority, $delete_field_index, $template_array) {
+
+	if (empty($template_array)) {
+		drupal_set_message("Unable to delete record with a priority of $priority since the template was not supplied",'error');
+		return FALSE;
+	}
+
+	// Re-order the remaining fields of the same record to ensure that the indicies are
+	// 0 to size and. If this is not done, weird behaviour may result
+	$new_template_array = $template_array;
+	$new_template_array[$priority]['fields'] = array();
+	$i=0;
+	foreach ($template_array[$priority]['fields'] as $field_index => $field_details) {
+		if ($field_index != $delete_field_index) {
+			$new_template_array[$priority]['fields'][$i] = $field_details;
+			$i++;
+		}
+	}
+
+	// If this field was the only one in the current record, also delete the record
+	if (empty($new_template_array[$priority]['fields'])) {
+		$new_template_array = tripal_bulk_loader_delete_record($priority, $new_template_array);
+	}
+
+	return $new_template_array;
+}

+ 18 - 59
tripal_bulk_loader/tripal_bulk_loader.admin.templates.inc

@@ -210,6 +210,11 @@ function tripal_bulk_loader_modify_template_base_form($form_state = NULL, $mode)
             '#name' => ($priority !== 0) ? (string)$priority : 'zero',
             '#value' => 'Edit Record',
           ),
+          'submit-delete_record' => array(
+            '#type' => 'submit',
+            '#name' => ($priority !== 0) ? (string)$priority : 'zero',
+            '#value' => 'Delete Record',
+          ),
           'submit-add_field' => array(
             '#type' => 'submit',
             '#name' => ($priority !== 0) ? (string)$priority : 'zero',
@@ -425,6 +430,14 @@ function tripal_bulk_loader_modify_template_base_form_submit($form, &$form_state
       drupal_goto('admin/tripal/tripal_bulk_loader_template/edit_record', $query);
     break;
 
+    case 'Delete Record':
+    	$form_state['storage']['record2priority'] = array();
+      $new_template = tripal_bulk_loader_delete_record($form_state['clicked_button']['#name'], $form_state['storage']['template']);
+      if (!empty($new_template)) {
+      	$form_state['storage']['template'] = $new_template;
+      }
+    break;
+
     case 'Add Field':
       $query = array(
         'template_id' => $form_state['storage']['template_id'],
@@ -455,14 +468,14 @@ function tripal_bulk_loader_modify_template_base_form_submit($form, &$form_state
     break;
 
     case 'Delete Field':
+    	// Delete Field
       $field_data = $form_state['values']['fields-data'][$form_state['clicked_button']['#name']];
       $priority = $field_data['priority_hidden'];
       $field_key = $field_data['field_index'];
-      unset($form_state['storage']['template'][$priority]['fields'][$field_key]);
-      if (!$form_state['storage']['template'][$priority]['fields']) {
-        unset($form_state['storage']['record2priority'][$form_state['storage']['template'][$priority]['record_id']]);
-        unset($form_state['storage']['template'][$priority]);
-      }
+      $new_template = tripal_bulk_loader_delete_field($priority, $field_key, $form_state['storage']['template']);
+			if (!empty($new_template)) {
+				$form_state['storage']['template'] = $new_template;
+			}
       drupal_set_message(t('Deleted Field from Template.'));
     break;
   } //end of switch
@@ -2511,60 +2524,6 @@ function tripal_bulk_loader_edit_template_field_form_submit($form, &$form_state)
 
 }
 
-/**
- * @section
- * Helper Functions
- */
-
-/**
- * Meant to be called from a form_validate function to ensure a newly added bulk loader record
- * name is unique and not empty.
- *
- * @param $new_record_name
- *   The record name to check for uniqueness
- * @param $template_id
- *   The template_id of the template to add the record to
- * @param $template_array
- *   The array describing the template. Optional -will be loaded using template_id if not provided
- * @param $current_priority
- *   The priority of the already existing record -checks that the name only occurs on this particular record
- *
- * @return
- *   TRUE if the record name is not empty and not already in the template_array; FALSE otherwise
- */
-function tripal_bulk_loader_is_record_name_unique($new_record_name, $template_id, $template_array = NULL, $current_priority = NULL) {
-
-  // get the template array if it's not supplied
-  if (empty($template_array)) {
-    $template = db_fetch_object(db_query("SELECT * FROM {tripal_bulk_loader_template} WHERE template_id=%d", $template_id));
-    $template_array = unserialize($template->template_array);
-    if (!is_array($template_array)) {
-      watchdog(
-        'tripal_bulk_loader',
-        'Unable to retrieve template array from database where template_id=%template_id',
-        array('%template_id' => $template_id),
-        WATCHDOG_WARNING
-      );
-      return FALSE;
-    }
-  }
-
-  // Check that the new record name is not empty
-  if (empty($new_record_name)) {
-    return FALSE;
-  }
-
-  // Check the new record name is unique
-  foreach ($template_array as $priority => $t) {
-    if (strcmp($t['record_id'], $new_record_name) == 0) {
-    	if (($priority != $current_priority) AND ($current_priority !== NULL)) {
-	      return FALSE;
-	    }
-    }
-  }
-  return TRUE;
-}
-
 /**
  * @section
  * AHAH Callbacks

+ 3 - 0
tripal_bulk_loader/tripal_bulk_loader.module

@@ -5,6 +5,9 @@ include('tripal_bulk_loader.constants.inc');
 include('tripal_bulk_loader.admin.inc');
 include('tripal_bulk_loader.admin.templates.inc');
 
+// API
+include('api/tripal_bulk_loader.api.templates.inc');
+
 /**
  * Implements hook_init
  * Used to add stylesheets and javascript files to the header