elasticsearch_search_api-1.0.x-dev/src/Search/FacetedSearchActiveFiltersBuilder.php

src/Search/FacetedSearchActiveFiltersBuilder.php
<?php

namespace Drupal\elasticsearch_search_api\Search;

use Drupal\Core\Url;
use Drupal\elasticsearch_search_api\Search\Facet\FacetValueMetaDataStorageInterface;
use Drupal\elasticsearch_search_api\Search\Facet\HierarchicalFacetValueInterface;

/**
 * Builds a render array for displaying the active search filters.
 */
class FacetedSearchActiveFiltersBuilder {

  /**
   * The route name.
   *
   * @var string
   */
  private $route;

  /**
   * The facet metadata storage.
   *
   * @var \Drupal\elasticsearch_search_api\Search\Facet\FacetValueMetaDataStorageInterface
   */
  private $metaDataStorage;

  /**
   * The url query builder.
   *
   * @var \Drupal\elasticsearch_search_api\Search\SearchQueryBuilder
   */
  private $queryBuilder;

  /**
   * ActiveFiltersBuilder constructor.
   *
   * @param string $route
   *   The route name.
   * @param \Drupal\elasticsearch_search_api\Search\Facet\FacetValueMetaDataStorageInterface $metaDataStorage
   *   The facet value meta data storage.
   * @param \Drupal\elasticsearch_search_api\Search\SearchQueryBuilderInterface $queryBuilder
   *   The url query builder.
   */
  public function __construct(
    string $route,
    FacetValueMetaDataStorageInterface $metaDataStorage,
    SearchQueryBuilderInterface $queryBuilder
  ) {
    $this->route = $route;
    $this->metaDataStorage = $metaDataStorage;
    $this->queryBuilder = $queryBuilder;
  }

  /**
   * Builds a render array for displaying the active search filters.
   *
   * @param \Drupal\elasticsearch_search_api\Search\FacetedSearchAction|\Drupal\elasticsearch_search_api\Search\SearchActionInterface $searchAction
   *   The current search action.
   *
   * @return array|null
   *   Either a render array or NULL if there are no active filters.
   */
  public function build(FacetedSearchAction $searchAction): ?array {
    $activeFilters = [];

    foreach ($searchAction->getChosenFacetValues() as $facet => $facet_values) {
      $items = [];
      foreach ($facet_values as $facet_value) {
        if ($facet_value instanceof HierarchicalFacetValueInterface) {
          $ancestors = $facet_value->ancestors();
          $items = array_merge($items, $ancestors);
        }

        $items[] = $facet_value;
      }

      $uniqueItems = [];
      while ($item = array_shift($items)) {
        foreach ($items as $key => $otherItem) {
          if ($item == $otherItem) {
            unset($items[$key]);
          }
        }

        $uniqueItems[] = $item;
      }

      foreach ($uniqueItems as $item) {
        $facet_id = $item->value();

        $facetMetaData = $this->metaDataStorage->load($facet_id);

        if (!$facetMetaData) {
          continue;
        }

        $searchActionWithoutThisValue = $searchAction->withoutFacetValue(
          $facet,
          $item
        );

        // If the facet has a parent, activate it for the new search action.
        if ($item instanceof HierarchicalFacetValueInterface) {
          $parent = $item->parent();
          if ($parent && !$searchActionWithoutThisValue->getChosenFacetValues()->values($facet)->contains($parent)) {
            $searchActionWithoutThisValue = $searchActionWithoutThisValue->withFacetValue($facet,
              $parent);
          }
        }

        $url_options = [
          'query' => $this->queryBuilder->buildFacetedQuery(
            $searchActionWithoutThisValue
          ),
        ];

        $activeFilters[] = [
          '#type' => 'link',
          '#url' => Url::fromRoute($this->route, [], $url_options),
          '#title' => $facetMetaData->label(),
          '#attributes' => [
            'class' => [
              'u-hidden-mobile',
              'active-filters-filter',
            ],
            'title' => "Filter {$facetMetaData->label()} verwijderen",
            'aria-label' => $facetMetaData->label(),
            'data-drupal-facet-item-facet' => $facet,
            'data-drupal-facet-item-value' => $item->value(),
          ],
        ];
      }
    }

    if (!empty($activeFilters)) {
      $activeFilters = [
        '#type' => 'container',
        'title' => [
          '#type' => 'html_tag',
          '#tag' => 'h2',
          '#value' => 'Gekozen filters:',
          '#attributes' => [
            'class' => 'u-hidden-mobile',
          ],
        ],
        'items' => $activeFilters,
        '#attributes' => [
          'class' => [
            'active-filters',
          ],
        ],
      ];

      $url_options = ['query' => $this->queryBuilder->buildFacetedQuery($searchAction->withoutFacets())];
      $activeFilters['remove-all'] = [
        '#type' => 'link',
        '#url' => Url::fromRoute($this->route, [], $url_options),
        '#attributes' => [
          'class' => [
            'active-filters-remove-all',
          ],
          'aria-label' => 'Alle filters verwijderen',
        ],
        '#title' => 'Alle filters verwijderen',
      ];

      return $activeFilters;
    }
    else {
      return NULL;
    }
  }

}

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

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