Преглед изворни кода

Tripal Views Integration: Fixes for general select handler and added cvterm specific select handler which filters the list using the cv

laceysanderson пре 14 година
родитељ
комит
f0b7b81526

+ 3 - 0
tripal_core/tripal_core.views.inc

@@ -29,6 +29,9 @@ function tripal_core_views_handlers() {
      'views_handler_filter_chado_select_string' => array(
       'parent' => 'views_handler_filter_string',
      ),
+     'views_handler_filter_chado_select_cvterm_name' => array(
+      'parent' => 'views_handler_filter_string',
+     ),
      'views_handler_filter_chado_boolean' => array(
       'parent' => 'views_handler_filter_boolean_operator',
      ),

+ 120 - 0
tripal_core/views/handlers/views_handler_filter_chado_select_cvterm_name.inc

@@ -0,0 +1,120 @@
+<?php
+
+/* @file
+ * Purpose: This Handler provides a select list for the type field
+ *  NOTE: This handler only works when applied to the type_id field in the base_table of
+ *  this view.
+ */
+class views_handler_filter_chado_select_cvterm_name extends views_handler_filter_string {
+
+ /**
+	* Executed when the field is added
+	* Determine which cv to limit the cvterms to
+	*/
+  function init(&$view, $options) {
+    parent::init($view, $options);
+  	
+  	$cv_id = variable_get('chado_'.$this->view->base_table.'_cv', null);
+    if ($cv_id) {
+			$results = tripal_core_chado_select('cvterm',array('cvterm_id','name'), array('cv_id'=>$cv_id));				
+			foreach ($results as $c) {
+				$cvterms[$c->cvterm_id] = $c->name;
+			}    	
+    } else {
+    	//get a list of cvs currently used
+    	$sql = 'select distinct(cv.cv_id) FROM '.$this->view->base_table
+    		.' LEFT JOIN cvterm cvterm ON cvterm.cvterm_id='.$this->view->base_table.'.type_id '
+    		.'LEFT JOIN cv cv ON cv.cv_id=cvterm.cv_id';
+    	$previous_db = tripal_db_set_active('chado');
+    	$resource = db_query($sql);
+    	tripal_db_set_active($previous_db);
+    	$cvterms = array();
+			while ( $r = db_fetch_object($resource) ) {
+				$results = tripal_core_chado_select('cvterm',array('cvterm_id','name'), array('cv_id'=>$r->cv_id));				
+				foreach ($results as $c) {
+					$cvterms[$c->cvterm_id] = $c->name;
+				}
+			}
+    }// end of if variable not defined
+    
+    //sort cvterms by name (case insensitive)
+    natcasesort($cvterms);
+    
+    //add to this handler
+    $this->cvterm_options = $cvterms;
+  }
+
+
+ /**
+  * Alters the query so that WHERE cvterm.cvterm_id=212 is used
+  */
+  function query() {
+    $this->ensure_table;
+    
+    $where = 'cvterm.cvterm_id=%d';
+    $this->query->add_where($this->options['group'], $where, $this->value);
+  }
+  
+ /**
+  * 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);
+    
+    // Get Options
+    if ($this->options['exposed']) {    
+      $options['All'] = '<Any>';
+    }
+    $options['<select '.$this->table.'>'] = '<None>';
+    $max_length = 40;
+    foreach ($this->cvterm_options as $cvterm_id => $cvterm_name) {
+      if (strlen($cvterm_name) > $max_length) {
+        $options[$cvterm_id] = substr($cvterm_name,0,$max_length) . '...';
+      } else {
+        $options[$cvterm_id] = $cvterm_name;    
+      }
+    }
+    
+    //Select List
+    $form['value'] = array(
+        '#type' => 'select',
+        '#title' => $this->options['label'],
+        '#options' => $options,
+        '#default_value' => $this->value,
+    );
+  }
+
+ /**
+  * 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']);
+    }
+
+    $this->exposed_translate($form[$value], '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';
+    }
+
+    if ($value != 'value') {
+      unset($form['value']);
+    }
+
+  }
+
+}

+ 0 - 12
tripal_core/views/handlers/views_handler_filter_chado_select_string.inc

@@ -73,16 +73,4 @@ class views_handler_filter_chado_select_string extends views_handler_filter_stri
 
   }
 
-
-  /**
-   * Handle the 'right' side fo the exposed options form.
-   * Removing the option to make this field Optional. Instead it is always optional.
-   * This was done because the optional field didn't allow you to select <Any> as the default
-   *   which was a needed feature.
-   */
-  function expose_form_right(&$form, &$form_state) {
-    parent::expose_form_right($form, $form_state);
-    
-    unset($form['expose']['optional']);
-  }
 }

+ 1 - 1
tripal_cv/views/cvterm.views.inc

@@ -86,7 +86,7 @@ function retrieve_cvterm_views_data() {
        'handler' => 'views_handler_sort',
      ),
      'filter' => array(
-       'handler' => 'views_handler_filter_chado_select_string',
+       'handler' => 'views_handler_filter_chado_select_cvterm_name',
      ),
      'argument' => array(
        'handler' => 'views_handler_argument_string',