|
@@ -0,0 +1,206 @@
|
|
|
+<?php
|
|
|
+
|
|
|
+/**
|
|
|
+ * @file
|
|
|
+ * Purpose: This Handler provides a generic select list for any chado field that is a string
|
|
|
+ * The select list includes all distinct values for that field.
|
|
|
+ *
|
|
|
+ * @ingroup views_filter_handlers
|
|
|
+ * @ingroup tripal_core
|
|
|
+ */
|
|
|
+class tripal_views_handler_filter_string_selectbox extends views_handler_filter_string {
|
|
|
+
|
|
|
+ function options_form(&$form, &$form_state) {
|
|
|
+ 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['max_length'] = array(
|
|
|
+ '#type' => 'textfield',
|
|
|
+ '#title' => t('Max Width'),
|
|
|
+ '#description' => t('Specify the maximum width of the select box'),
|
|
|
+ '#default_value' => (isset($this->options['max_length'])) ? $this->options['max_length'] : 40,
|
|
|
+
|
|
|
+ );
|
|
|
+ $form['max_length'] = array(
|
|
|
+ '#type' => 'markup',
|
|
|
+ '#value' => t('<strong><font color="red">Note:</font></strong> If another filter exists for the same table then '.
|
|
|
+ 'the values shown in the drop box will only include those from rows that are not filtered.'),
|
|
|
+
|
|
|
+ );
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 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('/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--their fixed.
|
|
|
+ $where = '';
|
|
|
+ $filters = $this->view->filter;
|
|
|
+ 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";
|
|
|
+ $previous_db = tripal_db_set_active('chado'); // use chado database
|
|
|
+ $results = db_query($sql);
|
|
|
+ tripal_db_set_active($previous_db); // now use drupal database
|
|
|
+
|
|
|
+ // Build the select box options
|
|
|
+ $max_length = $this->options['max_length'];
|
|
|
+ if (!$max_length) {
|
|
|
+ $max_length = 40;
|
|
|
+ }
|
|
|
+ if ($this->options['optional']) {
|
|
|
+ //$options['<select '.$this->table.'>'] = '--None--';
|
|
|
+ $options['All'] = '--Any--';
|
|
|
+ }
|
|
|
+ while ($r = db_fetch_object($results)) {
|
|
|
+ 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};
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //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;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 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']);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ */
|
|
|
+ function query() {
|
|
|
+
|
|
|
+ $this->ensure_my_table();
|
|
|
+ $field = "$this->table_alias.$this->real_field";
|
|
|
+ $upper = $this->case_transform();
|
|
|
+
|
|
|
+ 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 = "$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);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|