Browse Source

Added a tripal views api function to add fields to a given integration -good for calculated fields added by other modules

Lacey Sanderson 12 years ago
parent
commit
a726356264
1 changed files with 132 additions and 0 deletions
  1. 132 0
      tripal_views/api/tripal_views.api.inc

+ 132 - 0
tripal_views/api/tripal_views.api.inc

@@ -664,3 +664,135 @@ function tripal_views_add_node_relationship_to_chado_table_integration($defn_arr
 
   return $integrations;
 }
+
+/**
+ *
+ */
+function tripal_views_add_field_to_integration($table_name, $priority, $field) {
+  $no_errors = TRUE;
+
+  // First get the setup_id
+  $setup_id = db_result(db_query("SELECT setup_id FROM tripal_views WHERE table_name='%s' AND priority=%d", $table_name, $priority));
+
+  // If there isn't an integration matching that table/priority combination
+  // then clone the lightest priority integration
+  if (empty($setup_id)) {
+    $lightest_setup_id = tripal_views_get_lightest_priority_setup($table_name);
+    $defn_array = tripal_views_integration_export_entry($lightest_setup_id);
+    $defn_array['priority'] = $priority;
+    tripal_views_integration_add_entry($defn_array);
+    $setup_id = db_result(db_query("SELECT setup_id FROM tripal_views WHERE table_name='%s' AND priority=%d", $table_name, $priority));
+
+    if (empty($setup_id)) {
+      watchdog('tripal_views','Unable to clone lightest priority setup for %table in order to add the following field to the integration: %field.',
+        array('%table' => $table_name, '%field' => print_r($field_array,TRUE)),WATCHDOG_ERROR);
+      return FALSE;
+    }
+  }
+
+  // Now delete any existing field
+  db_query("DELETE FROM {tripal_views_field} WHERE setup_id=%d AND column_name='%s'", $setup_id, $field['name']);
+  db_query("DELETE FROM {tripal_views_handlers} WHERE setup_id=%d AND column_name='%s'", $setup_id, $field['name']);
+  db_query("DELETE FROM {tripal_views_join} WHERE setup_id=%d AND base_table='%s' AND base_field='%s'", $setup_id, $table_name, $field['name']);
+
+  // Now we need to add/update the field
+  $field_record = array(
+    'setup_id' => $setup_id,
+    'column_name' => $field['name'],
+    'name' => $field['title'],
+    'description' => $field['description'],
+    'type' => $field['type'],
+  );
+  if ($setup_id && $field['name'] && $field['title'] && $field['description'] && $field['type']) {
+    if ($defn_array['additional_content']) {
+      $is = db_fetch_object(db_query("SELECT true as present FROM {tripal_views_field} WHERE column_name='%s' AND setup_id=%d", $field_record['column_name'], $field_record['setup_id']));
+      if (!$is->present) {
+        $status = drupal_write_record('tripal_views_field', $field_record);
+      }
+      else {
+        $status = drupal_write_record('tripal_views_field', $field_record, array('setup_id', 'column_name'));
+      }
+    }
+    else {
+      $status = drupal_write_record('tripal_views_field', $field_record);
+    }
+  }
+  else {
+    drupal_set_message(t('Unable to integrate %name field due to missing required fields.', array('%name' => $field['name'])), 'error');
+    $status = FALSE;
+  }
+
+  if ($status) {
+
+    // Insert Handler Definitions
+    foreach ($field['handlers'] as $handler_type => $handler) {
+      $handler_record = array(
+        'setup_id' => $setup_id,
+        'column_name' => $field['name'],
+        'handler_type' => $handler_type,
+        'handler_name' => $handler['name'],
+        'arguments' => serialize($handler)
+      );
+      if ($setup_id && $field['name'] && $handler_type && $handler['name'] && $handler) {
+        $status = drupal_write_record('tripal_views_handlers', $handler_record);
+      }
+      else {
+        $status = FALSE;
+      }
+      if (!$status) {
+        drupal_set_message(t('Unable to integrate %handler_type handler: %handler_name', array('%handler_type' => $handler_type, '%handler_name' => $handler['name'])), 'error');
+        $no_errors = FALSE;
+      }
+    }
+
+    // Insert Joins
+    if (!is_array($field['joins'])) {
+      $field['joins'] = array();
+    }
+    foreach ($field['joins'] as $join) {
+      $join_record = array(
+        'setup_id' => $setup_id,
+        'base_table' => $defn_array['table'],
+        'base_field' => $field['name'],
+        'left_table' => $join['table'],
+        'left_field' => $join['field'],
+      );
+
+      if (!empty($join['handler'])) {
+        $join_record['handler'] = $join['handler'];
+      }
+      else {
+        $join_record['handler'] = 'views_join';
+      }
+
+      if ($setup_id && $defn_array['table'] && $field['name'] && $join['table'] && $join['field']) {
+        $status = drupal_write_record('tripal_views_join', $join_record);
+      }
+      else {
+        $status = FALSE;
+      }
+      if (!$status) {
+        drupal_set_message(
+          t(
+            'Unable to join %left_table.%left_field with %table.%field',
+            array(
+              '%left_table' => $join['table'],
+              '%left_field' => $join['field'],
+              '%table' => $defn_array['table'],
+              '%field' => $field['name']
+            )
+          ),
+          'error'
+        );
+        $no_errors = FALSE;
+      }
+    }
+
+  }
+  else {
+    drupal_set_message(t('Unable to integrate %field_name field', array('%field_name' => $field['name'])), 'error');
+    $no_errors = FALSE;
+  }
+
+  return $no_errors;
+}