Parcourir la source

Tripal Views: Fixed integration form to correctly handle joins and the new type of relationships

Lacey Sanderson il y a 11 ans
Parent
commit
91b17fd90c

+ 204 - 132
tripal_views/includes/tripal_views_integration.inc

@@ -465,6 +465,7 @@ function tripal_views_integration_form($form, $form_state, $arg) {
       '#title' => t('Table Fields'),
       '#prefix' => '<div id="fieldset-table-rows-wrapper">',
       '#suffix' => '</div>',
+      '#collapsible' => TRUE
     );
 
     // get the columns in this materialized view.  They are separated by commas
@@ -499,6 +500,40 @@ function tripal_views_integration_form($form, $form_state, $arg) {
     );
     $data['field_types'] = array();
 
+    $form['view_setup_table']['header'] = array(
+      '#type' => 'markup',
+      '#prefix' => '<div class="joins-new-row field-headers">',
+      '#suffix' => '</div>',
+    );
+
+    $form['view_setup_table']['header']['column-1'] = array(
+         '#type' => 'markup',
+         '#prefix' => "<div class=\"column-one\">",
+         '#suffix' => "</div>",
+         '#markup' => 'Field'
+    );
+
+    $form['view_setup_table']['header']['column-2'] = array(
+         '#type' => 'markup',
+         '#prefix' => "<div class=\"column-two\">",
+         '#suffix' => "</div>",
+         '#markup' => 'Labels'
+    );
+
+    $form['view_setup_table']['header']['column-3'] = array(
+         '#type' => 'markup',
+         '#prefix' => "<div class=\"column-three\">",
+         '#suffix' => "</div>",
+         '#markup' => ''
+    );
+
+    $form['view_setup_table']['header']['column-4'] = array(
+         '#type' => 'markup',
+         '#prefix' => "<div class=\"column-four\">",
+         '#suffix' => "</div>",
+         '#markup' => 'Handlers'
+    );
+
     // get the list of chado tables to join on
     $chado_join_tables = tripal_core_get_chado_tables(TRUE);
     $chado_join_tables = array_merge(array('Select a Join Table'), $chado_join_tables);
@@ -616,77 +651,6 @@ function tripal_views_integration_form($form, $form_state, $arg) {
            '#value' => filter_xss('')
       );
 
-      // set the default values for the join table and columns
-      $default_join_table = 0;
-      $default_join_field = 0;
-      if (isset($setup_id) && !isset($form_state['values']["fields_join_$table_id-$i"]) && isset($default_joins[$column_name])) {
-        $default_join_table = $default_joins[$column_name]['left_table'];
-        $default_join_field = $default_joins[$column_name]['left_field'];
-        $form_state['values']["fields_join_$table_id-$i"] = $default_join_table;
-        $form_state['values']["fields_join_column_$table_id-$i"] = $default_join_field;
-      }
-      else {
-        if (isset($form_state['values']["fields_join_$table_id-$i"])) {
-          $default_join_table = $form_state['values']["fields_join_$table_id-$i"];
-        }
-        if (isset($form_state['values']["fields_join_column_$table_id-$i"])) {
-          $default_join_field = $form_state['values']["fields_join_column_$table_id-$i"];
-        }
-      }
-
-      $form['view_setup_table']["$table_id-$i"]['column-3']["fields_join_$table_id-$i"] = array(
-        '#type' => 'select',
-        '#prefix' => "<div class=\"fields-column-join\">",
-        '#suffix' => "</div>",
-        '#options' => $chado_join_tables,
-        '#required' => FALSE,
-        '#default_value' => $default_join_table,
-        '#ajax' => array(
-           'callback' => 'tripal_views_integration_ajax_join_field',
-           'wrapper' => "fields-column-join-column-$table_id-$i",
-           'effect' => 'fade',
-           'event' => 'change',
-           'method' => 'replace',
-        ),
-      );
-
-      $columns = array();
-      if ($default_join_table) {
-        // get the table description
-        $table_desc = tripal_core_get_chado_table_schema($default_join_table);
-        foreach ($table_desc['fields'] as $column => $def) {
-          $columns[$column] = $column;
-        }
-      }
-      else {
-        $columns = array('Select Join Column');
-      }
-      $form['view_setup_table']["$table_id-$i"]['column-3']["fields_join_column_$table_id-$i"] = array(
-        '#type' => 'select',
-        '#prefix' => "  <div id=\"fields-column-join-column-$table_id-$i\" class=\"fields-column-join-column\">",
-        '#suffix' => "</div>",
-        '#options' => $columns,
-        '#required' => FALSE,
-        '#default_value' => $default_join_field
-      );
-
-      $default_join_handler = 0;
-      if (isset($setup_id) && !isset($form_state['values']["fields_join_handler_$table_id-$i"]) && isset($default_handlers[$column_name]['join'])) {
-        $default_join_handler = $default_handlers[$column_name]['join']['handler_name'];
-        $form_state['values']["fields_join_handler_$table_id-$i"] = $default_join_handler;
-      }
-      elseif (isset($form_state['values']["fields_join_handler_$table_id-$i"])) {
-        $default_join_handler = $form_state['values']["fields_join_handler_$table_id-$i"];
-      }
-      $form['view_setup_table']["$table_id-$i"]['column-3']["fields_join_handler_$table_id-$i"] = array(
-        '#type' => 'select',
-        '#prefix' => "<div class=\"fields-join-handler\">",
-        '#suffix' => "</div>",
-        '#options' => $handlers_join,
-        '#required' => FALSE,
-        '#default_value' => $default_join_handler,
-      );
-
       // COLUMN 4
       $form['view_setup_table']["$table_id-$i"]['column-4'] = array(
         '#type' => 'markup',
@@ -838,54 +802,172 @@ function tripal_views_integration_form($form, $form_state, $arg) {
         '#default_value' => $default_argument_handler,
       );
 
-      $default_relationship_handler = 0;
-      if (isset($setup_id)
-        && !isset($form_state['values']["fields_relationship_handler_$table_id-$i"])
-        && isset($default_handlers[$column_name]['relationship']))
-      {
-        $default_relationship_handler = $default_handlers[$column_name]['relationship']['handler_name'];
-        $form_state['values']["fields_relationship_handler_$table_id-$i"]=$default_relationship_handler;
-      }
-      else {
-        if (isset($form_state['values']["fields_relationship_handler_$table_id-$i"])) {
-          $default_relationship_handler = $form_state['values']["fields_relationship_handler_$table_id-$i"];
-        }
-        if (!$default_relationship_handler) {
-          if ($column_type == 'integer' or $column_type == 'int' or $column_type == 'serial') {
-            $default_relationship_handler = 'views_handler_relationship';
-          }
-          elseif (preg_match("/character varying/", $column_type) or $column_type == 'char' or $column_type == 'text' or $column_type == 'varchar') {
-            $default_relationship_handler = 'views_handler_relationship';
-          }
-          elseif ($column_type == 'boolean') {
-            $default_relationship_handler = 'views_handler_relationship';
-          }
-          elseif ($column_type == 'float') {
-            $default_relationship_handler = 'views_handler_relationship';
-          }
-          elseif ($column_type == 'datetime') {
-            $default_relationship_handler = 'views_handler_relationship';
-          }
-        }
-      }
-      $form['view_setup_table']["$table_id-$i"]['column-4']["fields_relationship_handler_$table_id-$i"] = array(
+      $i++;
+    }
+
+    $form['view_setup_join'] = array(
+      '#type' => 'fieldset',
+      '#title' => t('Joins & Relationships'),
+      '#prefix' => '<div id="fieldset-join-rows-wrapper">',
+      '#suffix' => '</div>',
+      '#description' => t('Below is a list of the joins/relationships between the '
+        . 'current base table and other chado tables.'),
+      '#collapsible' => TRUE,
+      '#collapsed' => TRUE
+    );
+
+    $form['view_setup_join']['header'] = array(
+      '#type' => 'markup',
+      '#prefix' => '<div class="joins-new-row field-headers">',
+      '#suffix' => '</div>',
+    );
+
+    $form['view_setup_join']['header']['column-1'] = array(
+         '#type' => 'markup',
+         '#prefix' => "<div class=\"join-column-one\">",
+         '#suffix' => "</div>",
+         '#markup' => 'Base'
+    );
+
+    $form['view_setup_join']['header']['column-2'] = array(
+         '#type' => 'markup',
+         '#prefix' => "<div class=\"join-column-two\">",
+         '#suffix' => "</div>",
+         '#markup' => 'Handlers'
+    );
+
+    $form['view_setup_join']['header']['column-3'] = array(
+         '#type' => 'markup',
+         '#prefix' => "<div class=\"join-column-three\">",
+         '#suffix' => "</div>",
+         '#markup' => 'Joined to'
+    );
+
+    $base_field_options = array('Select the Base Column');
+    $table_desc = tripal_core_get_chado_table_schema($table_name);
+    foreach ($table_desc['fields'] as $column => $def) {
+      $base_field_options[$column] = $column;
+    }
+    $chado_join_tables[0] = 'Select the Left Table';
+    unset($handlers_join[0]);
+
+    $query = db_select('tripal_views_join','tvj');
+    $query->fields('tvj')
+      ->condition('tvj.setup_id',$setup_id,'=')
+      ->orderBy('tvj.relationship_only','ASC')
+      ->orderBy('tvj.base_field', 'ASC')
+      ->orderBy('tvj.left_table', 'ASC');
+    foreach ($query->execute() as $i => $result) {
+      $form['view_setup_join']["$table_id-$i"] = array(
+           '#type' => 'markup',
+           '#prefix' => "<div class=\"joins-new-row\">",
+           '#suffix' => "</div>",
+           '#value' => filter_xss('')
+      );
+
+      // COLUMN I
+      $form['view_setup_join']["$table_id-$i"]['column-1'] = array(
+           '#type' => 'markup',
+           '#prefix' => "<div class=\"join-column-one\">",
+           '#suffix' => "</div>",
+      );
+
+      $form['view_setup_join']["$table_id-$i"]['column-1']['join_base_table'] = array(
+        '#type' => 'item',
+        '#markup' => '<span class="column-name">' . filter_xss($result->base_table) . '</span>'
+      );
+
+      $form['view_setup_join']["$table_id-$i"]['column-1']["join_base_table-$i"] = array(
+        '#type' => 'hidden',
+        '#value' => $result->base_table
+      );
+
+      $form['view_setup_join']["$table_id-$i"]['column-1']["join_base_field-$i"] = array(
+        '#type' => 'select',
+        '#options' => $base_field_options,
+        '#required' => FALSE,
+        '#default_value' => $result->base_field
+      );
+
+      // COLUMN II
+      $form['view_setup_join']["$table_id-$i"]['column-2'] = array(
+           '#type' => 'markup',
+           '#prefix' => "<div class=\"join-column-two\">",
+           '#suffix' => "</div>",
+           '#value' => filter_xss('')
+      );
+
+      $form['view_setup_join']["$table_id-$i"]['column-2']["join_join_handler-$i"] = array(
+        '#type' => 'select',
+        '#prefix' => "<div class=\"fields-join-handler\">",
+        '#suffix' => "</div>",
+        '#options' => $handlers_join,
+        '#required' => FALSE,
+        '#default_value' => $result->handler,
+      );
+
+      $form['view_setup_join']["$table_id-$i"]['column-2']["join_relationship_handler-$i"] = array(
         '#type' => 'select',
         '#prefix' => "<div class=\"fields-relationship-handler\">",
         '#suffix' => "</div>",
         '#options' => $handlers_rel,
         '#required' => FALSE,
-        '#default_value' => $default_relationship_handler,
+        '#default_value' => $result->relationship_handler,
       );
 
-      $i++;
+      $form['view_setup_join']["$table_id-$i"]['column-2']["join_relationship_only-$i"] = array(
+        '#type' => 'checkbox',
+        '#title' => 'Relationship Only?',
+        '#default_value' => $result->relationship_only
+      );
+
+      // COLUMN III
+      $form['view_setup_join']["$table_id-$i"]['column-3'] = array(
+           '#type' => 'markup',
+           '#prefix' => "<div class=\"join-column-three\">",
+           '#suffix' => "</div>",
+           '#value' => filter_xss('')
+      );
+
+      $form['view_setup_join']["$table_id-$i"]['column-3']["join_left_table-$i"] = array(
+        '#type' => 'select',
+        '#options' => $chado_join_tables,
+        '#default_value' => $result->left_table,
+      );
+
+      $columns = array();
+      if ($result->left_table) {
+        // get the table description
+        $table_desc = tripal_core_get_chado_table_schema($result->left_table);
+        foreach ($table_desc['fields'] as $column => $def) {
+          $columns[$column] = $column;
+        }
+      }
+      else {
+        $columns = array('Select Left Column');
+      }
+      $form['view_setup_join']["$table_id-$i"]['column-3']["join_left_field-$i"] = array(
+        '#type' => 'select',
+        '#prefix' => "  <div id=\"fields-column-join-column-$table_id-$i\" class=\"fields-column-join-column\">",
+        '#suffix' => "</div>",
+        '#options' => $columns,
+        '#required' => FALSE,
+        '#default_value' => $result->left_field
+      );
     }
-    $form['view_setup_table']['save'] = array(
+
+    $form['num_joins'] = array(
+      '#type' => 'hidden',
+      '#value' => $i
+    );
+
+    $form['save'] = array(
       '#type'  => 'submit',
       '#value' => t('Save'),
     );
 
     $data['row_count'] = $i - 1;
-  }
+  } //end of if table/mview
 
   //use this to put values into $form_state['values']
   $form['data'] = array();
@@ -945,7 +1027,6 @@ function tripal_views_integration_form_validate($form, &$form_state) {
       .'views integrations created by core modules. Please set the priority between '
       .'0 and -10 to ensure your changes are used rather over the defaults.');
   }
-  // TODO: do we need to require that a handler be set for each field and each type of handler?
 }
 
 /**
@@ -1061,32 +1142,8 @@ function tripal_views_integration_form_submit($form, &$form_state) {
     );
     drupal_write_record('tripal_views_field', $view_field_record);
 
-    // first add the join if it exists
-    $left_table = $form_state['values']["fields_join_$table_id-$i"];
-    $left_column = $form_state['values']["fields_join_column_$table_id-$i"];
-
-    if ($left_column) {
-      if ($mview_id) {
-        $base_table = $mview->mv_table;
-      }
-      else {
-        $base_table = $table_name;
-      }
-      $view_join_record = array(
-        'setup_id' => $tripal_views_record['setup_id'],
-        'base_table' => $base_table,
-        'base_field' => $key,
-        'left_table' => $left_table,
-        'left_field' => $left_column,
-        'handler' => $form_state['values']["fields_join_handler_$table_id-$i"],
-      );
-
-      // write the new joins to the database
-      drupal_write_record('tripal_views_join', $view_join_record);
-    }
-
     // add the hanlders
-    $handlers = array('filter', 'field', 'sort', 'argument', 'join', 'relationship');
+    $handlers = array('filter', 'field', 'sort', 'argument');
 
     foreach ($handlers as $handler) {
       $handler_name = $form_state['values']["fields_" . $handler . "_handler_$table_id-$i"];
@@ -1103,6 +1160,21 @@ function tripal_views_integration_form_submit($form, &$form_state) {
     $i++;
   }
 
+  // Now add all the joins
+  for($i = 0; $i <= $form_state['values']['num_joins']; $i++) {
+    $join_record = array(
+      'setup_id' => $tripal_views_record['setup_id'],
+      'base_table' => $form_state['values']["join_base_table-$i"],
+      'base_field' => $form_state['values']["join_base_field-$i"],
+      'left_table' => $form_state['values']["join_left_table-$i"],
+      'left_field' => $form_state['values']["join_left_field-$i"],
+      'handler' => $form_state['values']["join_join_handler-$i"],
+      'relationship_handler' => $form_state['values']["join_relationship_handler-$i"],
+      'relationship_only' => $form_state['values']["join_relationship_only-$i"]
+    );
+    drupal_write_record('tripal_views_join', $join_record);
+  }
+
   if ($setup_id) {
     drupal_set_message(t('Record Updated'));
   }

+ 25 - 3
tripal_views/tripal_views_integration_fields_form.tpl.php

@@ -28,12 +28,14 @@
 
 #tripal-views-integration-form  .field-headers {
    font-weight: bold;
+   height: 15px;
 }
 
 #tripal-views-integration-form  .field-headers div {
    display: inline-block;
    margin: 0px;
    vertical-align: top;
+   padding-left: 15px;
 }
 
 #tripal-views-integration-form .column-name {
@@ -45,12 +47,16 @@
 }
 
 #tripal-views-integration-form .column-one {
-   width: 10%;
+   width: 30%;
    height: 50px;
 }
 
-#tripal-views-integration-form .column-two, .column-three, .column-four {
-   width: 25%;
+#tripal-views-integration-form .column-two, .column-four {
+   width: 30%;
+}
+
+#tripal-views-integration-form .column-three {
+   width: 0%;
 }
 
 #tripal-views-integration-form  .fields-new-row {
@@ -59,6 +65,22 @@
    padding-top: 10px;
 }
 
+#tripal-views-integration-form  .joins-new-row {
+   padding-bottom: 10px;
+   margin-bottom: 5px;
+   padding-top: 10px;
+   border-bottom-style: solid;
+   border-bottom-width: 1px;
+}
+
+#tripal-views-integration-form .join-column-one, .join-column-two, .join-column-three {
+   display: inline-block;
+   margin: 0px;
+   vertical-align: top;
+   margin-left: 15px;
+   width: 30%;
+}
+
 </style>
 
 <?php print drupal_render_children($form); ?>