Browse Source

Tripal Views: Updating of handlers select string and select cvterm

Lacey Sanderson 11 years ago
parent
commit
f3c817b0ed

+ 6 - 6
tripal_views/tripal_views.views.inc

@@ -68,6 +68,12 @@ function tripal_views_views_handlers() {
       'tripal_views_handler_filter_no_results' => array(
         'parent' => 'views_handler_filter'
       ),
+      'tripal_views_handler_filter_select_cvterm' => array(
+        'parent' => 'tripal_views_handler_filter_select_string',
+      ),
+      'tripal_views_handler_filter_select_string' => array(
+        'parent' => 'views_handler_filter_string',
+      ),
       /** D7 @todo: get handlers working
       'tripal_views_handler_filter_file_upload' => array(
         'parent' => 'views_handler_filter',
@@ -75,12 +81,6 @@ function tripal_views_views_handlers() {
       'tripal_views_handler_filter_textarea' => array(
         'parent' => 'views_handler_filter',
       ),
-      'tripal_views_handler_filter_select_cvterm' => array(
-        'parent' => 'views_handler_filter_string',
-      ),
-      'tripal_views_handler_filter_select_string' => array(
-        'parent' => 'chado_views_handler_filter_string',
-      ),
       'tripal_views_handler_filter_sequence' => array(
         'parent' => 'chado_views_handler_filter_string',
       ),

+ 10 - 187
tripal_views/views/handlers/tripal_views_handler_filter_select_cvterm.inc

@@ -10,14 +10,16 @@
  * @ingroup views_filter_handlers
  * @ingroup tripal_core
  */
-class tripal_views_handler_filter_select_cvterm extends views_handler_filter_string {
+class tripal_views_handler_filter_select_cvterm extends tripal_views_handler_filter_select_string {
 
- /**
-  * Executed when the field is added
-  * Determine which cv to limit the cvterms to
-  */
-  function init(&$view, $options) {
-    parent::init($view, $options);
+  /**
+   * Provide the options used in the select list.
+   * Override this function in extended handlers to easily change option list.
+   *
+   * @return
+   *   An array of options where the key is the value of this field in the database
+   */
+  function get_select_options() {
 
     if (isset($this->options['show_all'])) {
       $cv_id = variable_get('chado_' . $this->view->base_table . '_cv', NULL);
@@ -69,187 +71,8 @@ class tripal_views_handler_filter_select_cvterm extends views_handler_filter_str
     //sort cvterms by name (case insensitive)
     natcasesort($cvterms);
 
-    //add to this handler
-    $this->cvterm_options = $cvterms;
-
-  }
-
-  /**
-   * Defines the options form (form available to admin when they add a field to a view)
-   */
-  function options_form(&$form, &$form_state) {
-    $form['msg'] = array(
-      '#type' => 'item',
-      '#value' => '<b>If this filter applies to a table that is aggregated, additionally options may be ignored.</b>'
-    );
-
-    parent::options_form($form, $form_state);
-
-    $form['values_form_type'] = array(
-      '#type' => 'radios',
-      '#title' => t('Filter Type'),
-      '#options' => array(
-        'textfield' => 'Text Field',
-        'select' => 'Drop-Down Box',
-      ),
-      '#default_value' => ($this->options['values_form_type']) ? $this->options['values_form_type'] : 'select',
-    );
-
-    $form['select_multiple'] = array(
-      '#type' => 'checkbox',
-      '#title' => t('Select Multiple'),
-      '#description' => t('Allows more then one option to be selected.'),
-      '#default_value' => (isset($this->options['select_multiple'])) ? $this->options['select_multiple'] : FALSE,
-    );
-
-    $form['select_optional'] = array(
-      '#type' => 'checkbox',
-      '#title' => t('Optional'),
-      '#description' => t('Adds --Any-- to the available options.'),
-      '#default_value' => (isset($this->options['optional'])) ? $this->options['optional'] : TRUE,
-    );
-
-    $form['show_all'] = array(
-      '#type' => 'checkbox',
-      '#title' => t('Show All Terms'),
-      '#description' => 'Otherwise only cvterms used in the base table will be used'
-    );
-
-  }
-
-  /**
-   * Assign our new form elements values to the options array
-   */
-  function options_submit(&$form, &$form_state) {
-    $this->options['values_form_type'] = $form_state['input']['options']['values_form_type'];
-    $this->options['select_multiple'] = $form_state['input']['options']['select_multiple'];
-    $this->options['select_optional'] = $form_state['input']['options']['select_optional'];
-  }
-
-  /**
-   * If the table to be filtered is not aggregated uses the parent::query()
-   * However, if it is uses postgresql any() function to compare
-   */
-  function query() {
-
-    // make optional
-    // if it is not set or empty then don't restrict the query
-    if (!$this->value) {
-      return;
-    }
-
-    if (is_array($this->value)) {
-      if (isset($this->value['All'])) {
-        unset($this->value['All']);
-      }
-
-      if ($this->operator == '!=') {
-        $this->operator = 'NOT IN';
-      }
-      else {
-        $this->operator = 'IN';
-      }
-    }
-
-    $this->ensure_my_table();
-    $field = $this->table_alias . "." . $this->real_field;
-    $table = $this->query->get_table_info($this->table);
-
-    if ($this->value) {
-      $this->query->add_where($this->options['group'], $field, $this->value, $this->operator);
-    }
+    return $cvterms;
 
   }
 
- /**
-  * Defines the value field in both the views filter options form
-  *   and the exposed form
-  */
-  function value_form(&$form, &$form_state) {
-    parent::value_form($form, $form_state);
-
-    if (isset($this->options['values_form_type']) AND preg_match('/textfield/', $this->options['values_form_type'])) {
-      $form['value'] = array(
-        '#type' => 'textfield',
-        '#title' => t('%label', array('%label' => $this->options['expose']['label'])),
-        '#default_value' => $this->value,
-      );
-    }
-    else {
-      // Get Options
-      if ($this->options['select_optional']) {
-        $options['<select ' . $this->table . '>'] = '--None--';
-        $options['All'] = '--Any--';
-      }
-      $max_length = 40;
-      foreach ($this->cvterm_options as $cvterm_id => $cvterm_name) {
-        if (drupal_strlen($cvterm_name) > $max_length) {
-          $options[$cvterm_id] = drupal_substr($cvterm_name, 0, $max_length) . '...';
-        }
-        else {
-          $options[$cvterm_id] = $cvterm_name;
-        }
-      }
-
-      if (empty($options)) {
-        $options[0] = '';
-      }
-
-      //Select List
-      $form['value'] = array(
-          '#type' => 'select',
-          '#title' => t('%label', array('%label' => $this->options['expose']['label'])),
-          '#options' => $options,
-          '#default_value' => $this->value,
-      );
-
-      if ($this->options['select_multiple']) {
-        $form['value']['#multiple'] = TRUE;
-      }
-
-    }
-
-  }
-
-  /**
-   * Ensure the value form gets exposed correctly
-   */
-  function exposed_form(&$form, &$form_state) {
-    parent::exposed_form($form, $form_state);
-
-    if ($this->options['select_multiple']) {
-      $form[$this->real_field]['#multiple'] = TRUE;
-    }
-
-  }
-
-  /**
-   * This kind of construct makes it relatively easy for a child class
-   * to add or remove functionality by overriding this function and
-   * adding/removing items from this array.
-   */
-  function operators() {
-    $operators = array(
-      '=' => array(
-        'title' => t('Is equal to'),
-        'short' => t('='),
-        'method' => 'op_equal',
-        'values' => 1,
-      ),
-      '!=' => array(
-        'title' => t('Is not equal to'),
-        'short' => t('!='),
-        'method' => 'op_equal',
-        'values' => 1,
-      ),
-      '~' => array(
-        'title' => t('Contains'),
-        'short' => t('contains'),
-        'method' => 'op_contains',
-        'values' => 1,
-      ),
-    );
-
-    return $operators;
-  }
 }

+ 97 - 264
tripal_views/views/handlers/tripal_views_handler_filter_select_string.inc

@@ -8,7 +8,63 @@
  * @ingroup views_filter_handlers
  * @ingroup tripal_core
  */
-class tripal_views_handler_filter_select_string extends chado_views_handler_filter_string {
+class tripal_views_handler_filter_select_string extends views_handler_filter_string {
+
+  /**
+   * Provide the options used in the select list.
+   * Override this function in extended handlers to easily change option list.
+   *
+   * @return
+   *   An array of options where the key is the value of this field in the database
+   */
+  function get_select_options() {
+
+    // build a where clause that will filter the list in the drop box
+    // using fields that are not exposed and that are for the table
+    // from whcih the values in the drop box will be slected and
+    // we only want to use non-exposed fields because these are not
+    // available to the user to edit--they're fixed.
+    $where = '';
+    $filters = (is_array($this->view->filter)) ? $this->view->filter : array();
+    foreach ($filters as $filter_name => $details) {
+       // we only want to inclue non-exposed filters
+       if ($details->options['exposed'] == FALSE) {
+          // we only want to filter on the table we're getting the list from
+          if (strcmp($details->table, $this->table)==0) {
+            $where .= "$details->field $details->operator " . $details->value['value'];
+            $where .= ' AND ';
+          }
+       }
+    }
+    if ($where) {
+       $where = "WHERE $where";
+       $where = substr($where, 0, -5); # remove the final ' AND '
+    }
+
+    // get the values from the table
+    $sql = 'SELECT ' . $this->real_field . ' FROM {' . $this->table . '}' . $where . ' ORDER BY ' . $this->field . ' ASC';
+    $results = chado_query($sql);
+
+    // Build the select box options
+    $max_length = $this->options['max_length'];
+    if (!$max_length) {
+      $max_length = 40;
+    }
+    $options = array();
+    if ($this->options['optional']) {
+      $options['All'] = '--Any--';
+    }
+    foreach ($results as $r) {
+      if (drupal_strlen($r->{$this->field}) > $max_length) {
+        $options[$r->{$this->field}] = drupal_substr($r->{$this->field}, 0, $max_length) . '...';
+      }
+      else {
+        $options[$r->{$this->field}] = $r->{$this->field};
+      }
+    }
+
+    return $options;
+  }
 
   function options_form(&$form, &$form_state) {
     parent::options_form($form, $form_state);
@@ -23,18 +79,18 @@ class tripal_views_handler_filter_select_string extends chado_views_handler_filt
       '#default_value' => ($this->options['values_form_type']) ? $this->options['values_form_type'] : 'select',
     );
 
-    $form['multiple'] = array(
+    $form['select_multiple'] = array(
       '#type' => 'checkbox',
       '#title' => t('Select Multiple'),
       '#description' => t('Allows more then one option to be selected.'),
-      '#default_value' => (isset($this->options['multiple'])) ? $this->options['multiple'] : FALSE,
+      '#default_value' => (isset($this->options['select_multiple'])) ? $this->options['select_multiple'] : FALSE,
     );
 
-    $form['optional'] = array(
+    $form['select_optional'] = array(
       '#type' => 'checkbox',
       '#title' => t('Optional'),
       '#description' => t('Adds --Any-- to the available options.'),
-      '#default_value' => (isset($this->options['optional'])) ? $this->options['optional'] : TRUE,
+      '#default_value' => (isset($this->options['select_optional'])) ? $this->options['select_optional'] : TRUE,
     );
 
     $form['max_length'] = array(
@@ -53,6 +109,15 @@ class tripal_views_handler_filter_select_string extends chado_views_handler_filt
 
   }
 
+  /**
+   * Assign our new form elements values to the options array
+   */
+  function options_submit(&$form, &$form_state) {
+    $this->options['values_form_type'] = $form_state['input']['options']['values_form_type'];
+    $this->options['select_multiple'] = $form_state['input']['options']['select_multiple'];
+    $this->options['select_optional'] = $form_state['input']['options']['select_optional'];
+  }
+
  /**
   * Defines the value field in both the views filter options form
   *   and the exposed form
@@ -60,106 +125,40 @@ class tripal_views_handler_filter_select_string extends chado_views_handler_filt
   function value_form(&$form, &$form_state) {
     parent::value_form($form, $form_state);
 
-    if (preg_match('/textfield/', $this->options['values_form_type'])) {
-      $form['value'] = array(
-        '#type' => 'textfield',
-        '#title' => t('%label', array('%label' => $this->options['label'])),
-        '#default_value' => $this->value,
-      );
-
-    }
-    else {
-
-      // build a where clause that will filter the list in the drop box
-      // using fields that are not exposed and that are for the table
-      // from whcih the values in the drop box will be slected and
-      // we only want to use non-exposed fields because these are not
-      // available to the user to edit--they're fixed.
-      $where = '';
-      $filters = (is_array($this->view->filter)) ? $this->view->filter : array();
-      foreach ($filters as $filter_name => $details) {
-         // we only want to inclue non-exposed filters
-         if ($details->options['exposed'] == FALSE) {
-            // we only want to filter on the table we're getting the list from
-            if (strcmp($details->table, $this->table)==0) {
-              $where .= "$details->field $details->operator " . $details->value['value'];
-              $where .= ' AND ';
-            }
-         }
-      }
-      if ($where) {
-         $where = "WHERE $where";
-         $where = substr($where, 0, -5); # remove the final ' AND '
-      }
-
-      // get the values from the table
-      $sql = "SELECT $this->real_field FROM {$this->table} $where ORDER BY $this->field ASC";
-      $results = chado_query($sql);
-
-      // Build the select box options
-      $max_length = $this->options['max_length'];
-      if (!$max_length) {
-        $max_length = 40;
-      }
-      $options = array();
-      if ($this->options['optional']) {
-        //$options['<select '.$this->table.'>'] = '--None--';
-        $options['All'] = '--Any--';
-      }
-      // D7 TODO: Check DBTNG changes work
-      foreach ($results as $r) {
-        if (drupal_strlen($r->{$this->field}) > $max_length) {
-          $options[$r->{$this->field}] = drupal_substr($r->{$this->field}, 0, $max_length) . '...';
-        }
-        else {
-          $options[$r->{$this->field}] = $r->{$this->field};
-        }
-      }
+    if (preg_match('/select/', $this->options['values_form_type'])) {
 
       //Select List
       $form['value'] = array(
           '#type' => 'select',
           '#title' => t('%label', array('%label' => $this->options['label'])),
-          '#options' => $options,
+          '#options' => $this->get_select_options(),
           '#default_value' => $this->value,
       );
 
-      if ($this->options['multiple']) {
+      if ($this->options['select_multiple']) {
         $form['value']['#multiple'] = TRUE;
       }
     }
-  }
-
- /**
-  * Ensures the select list gets rendered when the filter is exposed
-  */
-  function exposed_form(&$form, &$form_state) {
-    if (empty($this->options['exposed'])) {
-      return;
-    }
-
-    $value = $this->options['expose']['identifier'];
-    $this->value_form($form, $form_state);
-    $form[$value] = $form['value'];
-
-    if (isset($form[$value]['#title']) && !empty($form[$value]['#type']) && $form[$value]['#type'] != 'checkbox') {
-      unset($form[$value]['#title']);
-    }
+    else {
 
-    $this->exposed_translate($form[$value], 'value');
+      $form['value'] = array(
+        '#type' => 'textfield',
+        '#title' => t('%label', array('%label' => $this->options['label'])),
+        '#default_value' => $this->value,
+      );
 
-    if (!empty($form['#type']) && ($form['#type'] == 'checkboxes' || ($form['#type'] == 'select' && !empty($form['#multiple'])))) {
-      unset($form[$value]['#default_value']);
     }
+  }
 
-    if (!empty($form['#type']) && $form['#type'] == 'select' && empty($form['#multiple'])) {
-      $form[$value]['#default_value'] = 'All';
-    }
+  /**
+   * Ensure the value form gets exposed correctly
+   */
+  function exposed_form(&$form, &$form_state) {
+    parent::exposed_form($form, $form_state);
 
-    if ($value != 'value') {
-      unset($form['value']);
+    if ($this->options['select_multiple']) {
+      $form[$this->options['id']]['#multiple'] = TRUE;
     }
-
   }
 
  /**
@@ -173,192 +172,26 @@ class tripal_views_handler_filter_select_string extends chado_views_handler_filt
       return;
     }
 
-    $this->ensure_my_table();
-
-    $table = $this->query->get_table_info($this->table);
-    if (preg_match('/aggregator/', $table['join']->definition['handler'])) {
-      $this->aggregated = TRUE;
-    }
-    else {
-      $this->aggregated = FALSE;
-    }
-
-    // filter the aggregates
-    if ($this->options['agg']['aggregates_with']) {
-      $this->query_restrict_curr_table_records();
-    }
-
-    // filter the base table
-    if ($this->options['agg']['records_with']) {
-      $this->query_restrict_base_records();
-    }
-
-
-
-
-  }
-
-  /**
-   * This function alters the query by adding the appropriate WHERE
-   * to filter the base table to only those with the value in the aggregate array.
-   *
-   * Note: this function is called only from query()
-   */
-  function query_restrict_base_records() {
-    if (!$this->aggregated) {
-      // Not Aggregated ---------------
-
-      $this->ensure_my_table();
-      $field = "$this->table_alias.$this->real_field";
-      $upper = $this->case_transform();
-
-      if ($this->options['multiple'] AND is_array($this->value)) {
-        // Remove any if it's there
+    if (is_array($this->value)) {
+      if (isset($this->value['All'])) {
         unset($this->value['All']);
-
-        if (sizeof($this->value)) {
-          $holders = array();
-          foreach ($this->value as $v) {
-            if (preg_match('/^[\d\.]+$/', $v)) {
-              $holders[] = '%f';
-            }
-            else {
-              $holders[] = "'%s'";
-            }
-          }
-          $where = "$field IN (" . implode(", ", $holders) . ")";
-          $this->query->add_where($this->options['group'], $where, $this->value);
-        }
       }
-      else {
-
-        // Deal with All/Any as value
-        if (preg_match('/All/', $this->value)) {
-          // Don't do anything
-        }
-        else {
-          $info = $this->operators();
-          if (!empty($info[$this->operator]['method'])) {
-            $this->{$info[$this->operator]['method']}($field, $upper);
-          }
-        }
-      }
-
-    }
-    else {
-      // Is Aggregated ----------------
-
-      $this->ensure_my_table();
-      $field = "$this->table_alias.$this->real_field";
-      $upper = $this->case_transform();
-
-      if ($this->options['multiple'] AND is_array($this->value)) {
-        // Remove any if it's there
-        unset($this->value['All']);
 
-        if (sizeof($this->value) > 1) {
-          $holders = array();
-          foreach ($this->value as $v) {
-            $holders[] = "'%s'";
-          }
-          $where = $field .' && ARRAY[' . implode(", ", $holders) . ']';
-          $this->query->add_where($this->options['group'], $where, $this->value);
-
-        }
-        elseif (sizeof($this->value) == 1) {
-          $where = "'%s' = ANY($field)";
-          $this->query->add_where($this->options['group'], $where, array_pop($this->value));
-        }
+      if ($this->operator == '!=') {
+        $this->operator = 'NOT IN';
       }
       else {
-
-        // Deal with All/Any as value
-        if (preg_match('/All/', $this->value)) {
-          // Don't do anything
-        }
-        else {
-          $where = "'%s' = ANY($field)";
-          $this->query->add_where($this->options['group'], $where, $this->value);
-        }
+        $this->operator = 'IN';
       }
-
     }
-  }
 
-  /**
-   * This function alters the query by adding the appropriate WHERE
-   * to filter the aggregates shown based on the value. Doesn't affect
-   * the number of base table records.
-   *
-   * Note: this function is called only from query()
-   */
-  function query_restrict_curr_table_records() {
+    $this->ensure_my_table();
+    $field = $this->table_alias . "." . $this->real_field;
+    $table = $this->query->get_table_info($this->table);
 
-    if (!$this->aggregated) {
-      // Not Aggregated ---------------
-      // Warn the admin/user that they have selected that the aggregates should be filtered
-      // on a field that isn't aggregated...
-      watchdog(
-        'tripal_views',
-        'You have chosen to filter the aggregates shown for %table %field
-          in %view; however, that field is not aggregated (ie: it is part of the base table
-          or is a 1:1 relationship to the base table)',
-        array(
-          '%field' => $this->field,
-          '%table' => $this->table,
-          '%view' => $this->view->name
-        ),
-        WATCHDOG_WARNING
-      );
-      // Do nothing!
+    if ($this->value) {
+      $this->query->add_where($this->options['group'], $field, $this->value, $this->operator);
     }
-    else {
-      // Is Aggregated ----------------
-
-      $this->ensure_my_table();
-      $field = "$this->table_alias.$this->real_field";
-      $upper = $this->case_transform();
-
-      if ($this->options['multiple'] AND is_array($this->value)) {
-        // Remove any if it's there
-        unset($this->value['All']);
-
-        if (sizeof($this->value) > 1) {
-          $holders = array();
-          foreach ($this->value as $v) {
-            $holders[] = "'%s'";
-          }
-          $where = $field .' IN (' . implode(", ", $holders) . ')';
-          $where = vsprintf($where, $this->value);
-
-          // Add the where to the chado aggregated join object for this table
-          // then the views_handler_join_chado_aggregator will add this to the WHERE
-          // clause of the sub-query generating the aggregated listing
-          $this->query->table_queue[ $this->table ]['join']->filter[] = $where;
 
-        }
-        elseif (sizeof($this->value) == 1) {
-          $where = "$field = '%s'";
-          $where = vsprintf($where, $this->value);
-
-          // Add the where to the chado aggregated join object for this table
-          // then the views_handler_join_chado_aggregator will add this to the WHERE
-          // clause of the sub-query generating the aggregated listing
-          $this->query->table_queue[ $this->table ]['join']->filter[] = $where;
-        }
-      }
-      else {
-
-        // Deal with All/Any as value
-        if (preg_match('/All/', $this->value)) {
-          // Don't do anything
-        }
-        else {
-          $where = "'%s' = ANY($field)";
-          $this->query->add_where($this->options['group'], $where, $this->value);
-        }
-      }
-
-    }
   }
 }