1 handlers.inc views_many_to_one_helper::add_filter()

File

core/modules/views/includes/handlers.inc, line 868
Defines the various handler objects to help build and display views.

Class

views_many_to_one_helper
This many to one helper object is used on both arguments and filters.

Code

function add_filter() {
  if (empty($this->handler->value)) {
    return;
  }
  $this->handler->ensure_my_table();

  // Shorten some variables:
  $field = $this->get_field();
  $options = $this->handler->options;
  $operator = $this->handler->operator;
  $formula = !empty($this->formula);
  $value = $this->handler->value;
  if (empty($options['group'])) {
    $options['group'] = 0;
  }

  // add_condition determines whether a single expression is enough(FALSE) or the
  // conditions should be added via an db_or()/db_and() (TRUE).
  $add_condition = TRUE;
  if ($operator == 'or' && empty($options['reduce_duplicates'])) {
    if (count($value) > 1) {
      $operator = 'IN';
    }
    else {
      $value = is_array($value) ? array_pop($value) : $value;
      if (is_array($value) && count($value) > 1) {
        $operator = 'IN';
      }
      else {
        $operator = '=';
      }
    }
    $add_condition = FALSE;
  }
  elseif ($operator == 'not') {
    $value = NULL;
    $operator = 'IS NULL';
    $add_condition = FALSE;
  }

  if (!$add_condition) {
    if ($formula) {
      $placeholder = $this->placeholder();
      if ($operator == 'IN') {
        $operator = "$operator IN($placeholder)";
      }
      else {
        $operator = "$operator $placeholder";
      }
      $placeholders = array(
        $placeholder => $value,
      ) + $this->placeholders;
      $this->handler->query->add_where_expression($options['group'], "$field $operator", $placeholders);
    }
    else {
      $this->handler->query->add_where($options['group'], $field, $value, $operator);
    }
  }

  if ($add_condition) {
    $field = $this->handler->real_field;
    $clause = $operator == 'or' ? db_or() : db_and();
    foreach ($this->handler->table_aliases as $value => $alias) {
      if ($operator == 'not') {
        $value = NULL;
      }
      $clause->condition("$alias.$field", $value);
    }

    // implode on either AND or OR.
    $this->handler->query->add_where($options['group'], $clause);
  }
}