You are here

function i18nviews_handler_filter_term_node_tid_depth::query in Internationalization Views 7.3

Add this filter to the query.

Due to the nature of fapi, the value and the operator have an unintended level of indirection. You will find them in $this->operator and $this->value respectively.

Overrides views_handler_filter_in_operator::query

File

includes/i18nviews_handler_filter_term_node_tid_depth.inc, line 33

Class

i18nviews_handler_filter_term_node_tid_depth
@todo: In general it's a problem that you can't extend i18nviews_handler_filter_taxonomy_index_tid and views_handler_filter_term_node_tid_depth.

Code

function query() {

  // If no filter values are present, then do nothing.
  if (count($this->value) == 0) {
    return;
  }
  elseif (count($this->value) == 1) {

    // Somethis $this->value is an array with a single element so convert it.
    if (is_array($this->value)) {
      $this->value = current($this->value);
    }
    $operator = '=';
  }
  else {
    $operator = 'IN';

    # " IN (" . implode(', ', array_fill(0, sizeof($this->value), '%d')) . ")";
  }

  // The normal use of ensure_my_table() here breaks Views.
  // So instead we trick the filter into using the alias of the base table.
  // See http://drupal.org/node/271833
  // If a relationship is set, we must use the alias it provides.
  if (!empty($this->relationship)) {
    $this->table_alias = $this->relationship;
  }
  elseif (isset($this->query->table_queue[$this->query->base_table]['alias'])) {
    $this->table_alias = $this->query->table_queue[$this->query->base_table]['alias'];
  }
  else {
    return;
  }

  // Now build the subqueries.
  $subquery = db_select('taxonomy_index', 'tn');
  $subquery
    ->addField('tn', 'nid');
  $where = db_or()
    ->condition('tn.tid', $this->value, $operator);
  $last = "tn";
  if ($this->options['depth'] > 0) {
    $subquery
      ->leftJoin('taxonomy_term_hierarchy', 'th', "th.tid = tn.tid");
    $last = "th";
    foreach (range(1, abs($this->options['depth'])) as $count) {
      $subquery
        ->leftJoin('taxonomy_term_hierarchy', "th{$count}", "{$last}.parent = th{$count}.tid");
      $where
        ->condition("th{$count}.tid", $this->value, $operator);
      $last = "th{$count}";
    }
  }
  elseif ($this->options['depth'] < 0) {
    foreach (range(1, abs($this->options['depth'])) as $count) {
      $subquery
        ->leftJoin('taxonomy_term_hierarchy', "th{$count}", "{$last}.tid = th{$count}.parent");
      $where
        ->condition("th{$count}.tid", $this->value, $operator);
      $last = "th{$count}";
    }
  }
  $subquery
    ->condition($where);
  $this->query
    ->add_where(0, "{$this->table_alias}.{$this->real_field}", $subquery, 'IN');
}