search_api-8.x-1.15/src/Plugin/views/argument/SearchApiAllTerms.php

src/Plugin/views/argument/SearchApiAllTerms.php
<?php

namespace Drupal\search_api\Plugin\views\argument;

use Drupal\taxonomy\Entity\Term;

/**
 * Defines a contextual filter searching through all indexed taxonomy fields.
 *
 * Note: The plugin annotation below is not misspelled. Due to dependency
 * problems, the plugin is not defined here but in
 * search_api_views_plugins_argument_alter().
 *
 * @ingroup views_argument_handlers
 *
 * ViewsArgument("search_api_all_terms")
 *
 * @see search_api_views_plugins_argument_alter()
 */
class SearchApiAllTerms extends SearchApiTerm {

  /**
   * {@inheritdoc}
   */
  public function query($group_by = FALSE) {
    if (empty($this->value)) {
      $this->fillValue();
      if (empty($this->value)) {
        return;
      }
    }

    $not_negated = empty($this->options['not']);
    if ($not_negated) {
      $operator = '=';
      $conjunction = 'OR';
    }
    else {
      $operator = '<>';
      $conjunction = 'AND';
    }

    $terms = Term::loadMultiple($this->value);
    // If values were given, but weren't valid taxonomy term IDs, we abort the
    // query, as this wouldn't have yielded any results. (Unless the filter is
    // negated, in which case this is of course fine.)
    if (empty($terms)) {
      if ($not_negated) {
        $this->query->abort($this->t('No valid taxonomy term IDs given for "All taxonomy term fields" contextual filter.'));
      }
      return;
    }

    $vocabulary_fields = $this->definition['vocabulary_fields'];
    // Add an empty array for the "all vocabularies" fields, so this is always
    // present (to simplify the code below a bit).
    $vocabulary_fields += ['' => []];
    /** @var \Drupal\Core\Entity\EntityInterface $term */
    foreach ($terms as $term) {
      // Set filters for all term reference fields which don't specify a
      // vocabulary, as well as for all fields specifying the term's vocabulary.
      $vocabulary_id = $term->bundle();
      $term_id = $term->id();
      $term_conditions = $this->query->createConditionGroup($conjunction);
      if (!empty($vocabulary_fields[$vocabulary_id])) {
        foreach ($vocabulary_fields[$vocabulary_id] as $field) {
          $term_conditions->addCondition($field, $term_id, $operator);
        }
      }
      foreach ($vocabulary_fields[''] as $field) {
        $term_conditions->addCondition($field, $term_id, $operator);
      }

      // If any conditions were added to the condition group, add it to the
      // query. Otherwise, unless this filter is negated, we abort the query, as
      // the given taxonomy term doesn't belong to a vocabulary contained in any
      // indexed fields.
      if ($term_conditions->getConditions()) {
        $this->query->addConditionGroup($term_conditions);
      }
      elseif ($not_negated) {
        $variables = [
          '@id' => $term_id,
          '%label' => $term->label(),
          '%vocabulary' => $vocabulary_id,
        ];
        $this->query->abort($this->t('"All taxonomy term fields" contextual filter could not be applied as taxonomy term %label (ID: @id) belongs to vocabulary %vocabulary, not contained in any indexed fields.', $variables));
        return;
      }
    }

  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc