class tripal_views_handler_filter_select_string

  1. 2.x tripal_views/views/handlers/tripal_views_handler_filter_select_string.inc tripal_views_handler_filter_select_string
  2. 3.x tripal_chado_views/views/handlers/tripal_views_handler_filter_select_string.inc tripal_views_handler_filter_select_string
  3. 1.x tripal_views/views/handlers/tripal_views_handler_filter_select_string.inc tripal_views_handler_filter_select_string

@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.

Hierarchy

Expanded class hierarchy of tripal_views_handler_filter_select_string

Related topics

1 string reference to 'tripal_views_handler_filter_select_string'

File

tripal_views/views/handlers/tripal_views_handler_filter_select_string.inc, line 11
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.

View source
class tripal_views_handler_filter_select_string extends chado_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['note'] = 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--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--';
      }
      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']);
    }

  }

  /**
   * Adds this filter to the where clause of the views query
   */
  function query() {

    // make optional
    // if it is not set or empty then don't restrict the query
    if (!$this->value) {
      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
        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));
        }
      }
      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 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() {

    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!
    }
    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);
        }
      }

    }
  }
}

Members

Contains filters are case sensitive
Namesort descending Modifiers Type Description
chado_views_handler_filter_string::operators function 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. Overrides views_handler_filter_string::operators
tripal_views_handler_filter_select_string::exposed_form function Ensures the select list gets rendered when the filter is exposed Overrides views_handler_filter::exposed_form
tripal_views_handler_filter_select_string::options_form function Defines the options form (form available to admin when they add a field to a view) Overrides chado_views_handler_filter_string::options_form
tripal_views_handler_filter_select_string::query function Adds this filter to the where clause of the views query Overrides chado_views_handler_filter_string::query
tripal_views_handler_filter_select_string::query_restrict_base_records function 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.
tripal_views_handler_filter_select_string::query_restrict_curr_table_records function 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.
tripal_views_handler_filter_select_string::value_form function Defines the value field in both the views filter options form and the exposed form Overrides views_handler_filter_string::value_form
views_handler::access function Check whether current user has access to this handler.
views_handler::broken function Determine if the handler is considered 'broken', meaning it's a a placeholder used when a handler can't be found.
views_handler::ensure_my_table function Ensure the main table for this handler is in the query. This is used a lot.
views_handler::exposed_submit function Submit the exposed filter form
views_handler::exposed_validate function Validate the exposed filter form
views_handler::extra_options function Provide defaults for the handler.
views_handler::extra_options_form function Provide a form for setting options.
views_handler::extra_options_submit function Perform any necessary changes to the form values prior to storage. There is no need for this function to actually store the data.
views_handler::extra_options_validate function Validate the options form.
views_handler::get_join function Get the join object that should be used for this handler.
views_handler::has_extra_options function If a handler has 'extra options' it will get a little settings widget and another form called extra_options.
views_handler::is_exposed function Determine if this item is 'exposed', meaning it provides form elements to let users modify the view.
views_handler::needs_style_plugin function Determine if the argument needs a style plugin.
views_handler::pre_query function Run before the view is built.
views_handler::set_relationship function Called just prior to query(), this lets a handler set up any relationship it needs.
views_handler::ui_name function Return a string representing this handler's name in the UI.
views_handler::validate function Validates the handler against the complete View.
views_handler_filter::accept_exposed_input function Check to see if input from the exposed filters should change the behavior of this filter. Overrides views_handler::accept_exposed_input
views_handler_filter::can_expose function Determine if a filter can be exposed. Overrides views_handler::can_expose
views_handler_filter::exposed_info function Tell the renderer about our exposed form. This only needs to be overridden for particularly complex forms. And maybe not even then. Overrides views_handler::exposed_info
views_handler_filter::exposed_translate function Make some translations to a form item to make it more suitable to exposing.
views_handler_filter::expose_form function Overridable form for exposed filter options.
views_handler_filter::expose_form_left function Handle the 'left' side fo the exposed options form.
views_handler_filter::expose_form_right function Handle the 'right' side fo the exposed options form.
views_handler_filter::expose_options function Provide default options for exposed filters. Overrides views_handler::expose_options
views_handler_filter::expose_submit function Perform any necessary changes to the form exposes prior to storage. There is no need for this function to actually store the data.
views_handler_filter::expose_validate function Validate the options form.
views_handler_filter::init function Provide some extra help to get the operator/value easier to use. Overrides views_handler::init
views_handler_filter::operator_form function Provide a form for setting the operator.
views_handler_filter::operator_submit function Perform any necessary changes to the form values prior to storage. There is no need for this function to actually store the data.
views_handler_filter::operator_validate function Validate the operator form.
views_handler_filter::options_submit function Simple submit handler Overrides views_handler::options_submit
views_handler_filter::options_validate function Simple validate handler Overrides views_handler::options_validate
views_handler_filter::show_expose_button function Shortcut to display the expose/hide button.
views_handler_filter::show_expose_form function Shortcut to display the exposed options form.
views_handler_filter::show_operator_form function Shortcut to display the operator form.
views_handler_filter::show_value_form function Shortcut to display the value form.
views_handler_filter::store_exposed_input function If set to remember exposed input in the session, store it there. Overrides views_handler::store_exposed_input
views_handler_filter::value_submit function Perform any necessary changes to the form values prior to storage. There is no need for this function to actually store the data.
views_handler_filter::value_validate function Validate the options form.
views_handler_filter_string::admin_summary function Display the filter on the administrative summary Overrides views_handler_filter::admin_summary
views_handler_filter_string::case_transform function
views_handler_filter_string::operator_options function Build strings from the operators() for 'select' options Overrides views_handler_filter::operator_options
views_handler_filter_string::operator_values function
views_handler_filter_string::option_definition function Information about options for all kinds of purposes will be held here. Overrides views_handler_filter::option_definition
views_handler_filter_string::op_contains function
views_handler_filter_string::op_empty function
views_handler_filter_string::op_ends function
views_handler_filter_string::op_equal function
views_handler_filter_string::op_not function
views_handler_filter_string::op_not_ends function
views_handler_filter_string::op_not_starts function
views_handler_filter_string::op_starts function
views_handler_filter_string::op_word function
views_object::construct function Views handlers use a special construct function so that we can more easily construct them with variable arguments.
views_object::destroy function
views_object::options function Set default options on this object. Called by the constructor in a complex chain to deal with backward compatibility.
views_object::set_default_options function Set default options. For backward compatibility, it sends the options array; this is a feature that will likely disappear at some point.
views_object::set_definition function Let the handler know what its full definition is.
views_object::unpack_options function Unpack options over our existing defaults, drilling down into arrays so that defaults don't get totally blown away.
views_object::_set_option_defaults function