|
@@ -10,7 +10,7 @@
|
|
|
* @ingroup views_filter_handlers
|
|
|
* @ingroup tripal_core
|
|
|
*/
|
|
|
-class tripal_views_handler_filter_select_cvterm extends views_handler_filter_chado_select_cvterm_name {
|
|
|
+class tripal_views_handler_filter_select_cvterm extends views_handler_filter_string {
|
|
|
|
|
|
/**
|
|
|
* Executed when the field is added
|
|
@@ -19,8 +19,64 @@ class tripal_views_handler_filter_select_cvterm extends views_handler_filter_cha
|
|
|
function init(&$view, $options) {
|
|
|
|
|
|
include_once('chado_wrapper_functions.inc');
|
|
|
+
|
|
|
parent::init($view, $options);
|
|
|
|
|
|
+ if ($this->options['show_all']) {
|
|
|
+ $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));
|
|
|
+ if (empty($results)) {
|
|
|
+ $results = array();
|
|
|
+ }
|
|
|
+ foreach ($results as $c) {
|
|
|
+ $cvterms[$c->cvterm_id] = $c->name;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ //get a list of cvs currently used
|
|
|
+ if ($this->view->base_table == 'cvterm') {
|
|
|
+ $sql = 'SELECT distinct(cv.cv_id) FROM ' . $this->view->base_table
|
|
|
+ .' LEFT JOIN cv cv ON cv.cv_id=cvterm.cv_id';
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ $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));
|
|
|
+ if (empty($results)) {
|
|
|
+ $results = array();
|
|
|
+ }
|
|
|
+ foreach ($results as $c) {
|
|
|
+ $cvterms[$c->cvterm_id] = $c->name;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }// end of if variable not defined
|
|
|
+
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ // @coder-ignore: non-drupal schema therefore table prefixing does not apply
|
|
|
+ $sql = "SELECT cvterm_id, name FROM cvterm WHERE cvterm_id IN (SELECT distinct(type_id) FROM %s)";
|
|
|
+ $previous_db = tripal_db_set_active('chado');
|
|
|
+ $resource = db_query($sql, $this->table);
|
|
|
+ tripal_db_set_active($previous_db);
|
|
|
+ $cvterms = array();
|
|
|
+ while ( $r = db_fetch_object($resource) ) {
|
|
|
+ $cvterms[$r->cvterm_id] = $r->name;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //sort cvterms by name (case insensitive)
|
|
|
+ natcasesort($cvterms);
|
|
|
+
|
|
|
+ //add to this handler
|
|
|
+ $this->cvterm_options = $cvterms;
|
|
|
+
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -34,6 +90,36 @@ class tripal_views_handler_filter_select_cvterm extends views_handler_filter_cha
|
|
|
|
|
|
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['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,
|
|
|
+ );
|
|
|
+
|
|
|
+ $form['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'
|
|
|
+ );
|
|
|
+
|
|
|
$form['agg'] = array(
|
|
|
'#type' => 'fieldset',
|
|
|
'#title' => 'Apply to fields that are aggregated'
|
|
@@ -78,7 +164,36 @@ class tripal_views_handler_filter_select_cvterm extends views_handler_filter_cha
|
|
|
}
|
|
|
|
|
|
if (!$this->aggregated) {
|
|
|
- parent::query();
|
|
|
+
|
|
|
+ if ($this->options['multiple']) {
|
|
|
+ // Remove any if it's there
|
|
|
+ unset($this->value['All']);
|
|
|
+
|
|
|
+ if (sizeof($this->value)) {
|
|
|
+ $holders = array();
|
|
|
+ foreach ($this->value as $v) {
|
|
|
+ if (preg_match('/^[\d\.]+$/', $v)) {
|
|
|
+ $holders[] = '%d';
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ $holders[] = "'%s'";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ $where = "cvterm.cvterm_id IN (" . implode(", ", $holders) . ")";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ elseif ($this->value != 'All') {
|
|
|
+ if (preg_match('/^\d+$/', $this->value)) {
|
|
|
+ $where = 'cvterm.cvterm_id=%d';
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ $where = "cvterm.name" . $this->operator . "'%s'";
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if ($where) {
|
|
|
+ $this->query->add_where($this->options['group'], $where, $this->value);
|
|
|
+ }
|
|
|
}
|
|
|
else {
|
|
|
|
|
@@ -102,4 +217,115 @@ class tripal_views_handler_filter_select_cvterm extends views_handler_filter_cha
|
|
|
}
|
|
|
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 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 (preg_match('/select/', $this->options['values_form_type'])) {
|
|
|
+ // Get Options
|
|
|
+ if ($this->options['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['label'])),
|
|
|
+ '#options' => $options,
|
|
|
+ '#default_value' => $this->value,
|
|
|
+ );
|
|
|
+
|
|
|
+ if ($this->options['multiple']) {
|
|
|
+ $form['value']['#multiple'] = TRUE;
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ $form['value'] = array(
|
|
|
+ '#type' => 'textfield',
|
|
|
+ '#title' => t('%label', array('%label' => $this->options['label'])),
|
|
|
+ '#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']);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 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;
|
|
|
+ }
|
|
|
}
|