You are here

public function TaxonomyIndexTidDepth::query in Views (for Drupal 7) 8.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 InOperator::query

File

lib/Views/taxonomy/Plugin/views/filter/TaxonomyIndexTidDepth.php, line 52
Definition of Views\taxonomy\Plugin\views\filter\TaxonomyIndexTidDepth.

Class

TaxonomyIndexTidDepth
Filter handler for taxonomy terms with depth.

Namespace

Views\taxonomy\Plugin\views\filter

Code

public 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 ensureMyTable() 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->tableAlias = $this->relationship;
  }
  elseif (isset($this->query->table_queue[$this->query->base_table]['alias'])) {
    $this->tableAlias = $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($this->options['group'], "{$this->tableAlias}.{$this->realField}", $subquery, 'IN');
}