You are here

public function CoreViewsUrlProcessor::buildUrls in Core Views Facets 8

Adds urls to the results.

Parameters

\Drupal\facets\FacetInterface $facet: The facet.

\Drupal\facets\Result\ResultInterface[] $results: An array of results.

Return value

\Drupal\facets\Result\ResultInterface[] An array of results with added urls.

Overrides UrlProcessorInterface::buildUrls

File

src/Plugin/facets/url_processor/CoreViewsUrlProcessor.php, line 94

Class

CoreViewsUrlProcessor
A url processor for views exposed filters.

Namespace

Drupal\core_views_facets\Plugin\facets\url_processor

Code

public function buildUrls(FacetInterface $facet, array $results) {

  // No results are found for this facet, so don't try to create urls.
  if (empty($results)) {
    return [];
  }
  $source = $facet
    ->getFacetSource();
  if ($source instanceof CoreViewsExposedFilter || $source instanceof CoreViewsContextualFilter) {
    $map = $source
      ->getViewsArgumentsMap();

    // Load the view.

    /** @var \Drupal\views\ViewEntityInterface $view */
    $view = $this->storage
      ->load($source->pluginDefinition['view_id']);
    $this->currentView = $this->executableFactory
      ->get($view);
    $this->currentView
      ->setDisplay($source->pluginDefinition['view_display']);
    switch (TRUE) {
      case $source instanceof CoreViewsExposedFilter:

        // First get the current list of get parameters.
        $get_params = $this->request->query;
        $views_filter = $source
          ->getViewsFilterDefinition($facet
          ->getFieldIdentifier());
        $views_filter_parameter = empty($views_filter['expose']) ? $facet
          ->getFieldIdentifier() : $views_filter['expose']['identifier'];

        /** @var \Drupal\facets\Result\ResultInterface $result */
        foreach ($results as &$result) {
          $result_get_params = clone $get_params;
          $active_values = $result_get_params
            ->get($views_filter_parameter, $views_filter['expose']['multiple'] ? [] : '');

          // If the value is active, remove the filter string from parameters.
          if ($result
            ->isActive()) {
            if ($views_filter['expose']['multiple']) {
              if (($key = array_search($result
                ->getRawValue(), $active_values)) !== FALSE) {
                unset($active_values[$key]);
              }
            }
            else {
              if ($active_values == $result
                ->getRawValue()) {
                $active_values = '';
              }
            }
          }
          else {
            if ($views_filter['expose']['multiple']) {
              $active_values = [
                $result
                  ->getRawValue(),
              ];
            }
            else {
              $active_values = $result
                ->getRawValue();
            }
          }
          if ($active_values || $active_values == '0') {
            $result_get_params
              ->set($views_filter_parameter, $active_values);
          }
          else {
            $result_get_params
              ->remove($views_filter_parameter);
          }
          $request_arguments = [];
          foreach ($map as $views_argument_id => $current_argument) {
            $request_arguments[] = $current_argument['value'];
          }
          $url = $this->currentView
            ->getUrl($request_arguments);

          // Add existing additional parameters, except pager.
          $additional_parameters = $result_get_params
            ->all();
          unset($additional_parameters['page'], $additional_parameters['ajax_page_state'], $additional_parameters['_wrapper_format']);
          $url
            ->setOption('query', $additional_parameters);
          $result
            ->setUrl($url);
        }
        return $results;
      case $source instanceof CoreViewsContextualFilter:

        /** @var \Drupal\facets\Result\ResultInterface $result */
        foreach ($results as &$result) {
          $request_arguments = [];
          foreach ($map as $views_argument_id => $current_argument) {
            if ($views_argument_id == $facet
              ->getFieldIdentifier()) {
              $request_arguments[] = $result
                ->isActive() ? $current_argument['neutral_value'] : $result
                ->getRawValue();
            }
            else {
              $request_arguments[] = $current_argument['value'];
            }
          }
          $url = $this->currentView
            ->getUrl($request_arguments);

          // Add existing additional parameters, except pager.
          $additional_parameters = $this->request->query
            ->all();
          unset($additional_parameters['page'], $additional_parameters['ajax_page_state'], $additional_parameters['_wrapper_format']);
          $url
            ->setOption('query', $additional_parameters);
          $result
            ->setUrl($url);
        }
        return $results;
      default:
        return [];
    }
  }
  return [];
}