You are here

class CoreViewsUrlProcessor in Core Views Facets 8

A url processor for views exposed filters.

The core_views_facets url processor builds urls as the views exposed filters expect them. We have to adhere to the urls that views uses to be able to use the processing trough views.

Plugin annotation


@FacetsUrlProcessor(
  id = "core_views_url_processor",
  label = @Translation("Core views url processor"),
  description = @Translation("Formats the query URL so views can process it."),
)

Hierarchy

Expanded class hierarchy of CoreViewsUrlProcessor

File

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

Namespace

Drupal\core_views_facets\Plugin\facets\url_processor
View source
class CoreViewsUrlProcessor extends UrlProcessorPluginBase {

  /**
   * The current view.
   *
   * @var \Drupal\views\ViewExecutable
   */
  protected $currentView;

  /**
   * The factory to load a view executable with.
   *
   * @var \Drupal\views\ViewExecutableFactory
   */
  protected $executableFactory;

  /**
   * The view storage.
   *
   * @var \Drupal\Core\Entity\EntityStorageInterface
   */
  protected $storage;

  /**
   * Constructs a new instance of the class.
   *
   * @param array $configuration
   *   A configuration array containing information about the plugin instance.
   * @param string $plugin_id
   *   The plugin_id for the plugin instance.
   * @param mixed $plugin_definition
   *   The plugin implementation definition.
   * @param \Symfony\Component\HttpFoundation\Request $request
   *   A request object for the current request.
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
   *   The Entity Type Manager.
   * @param \Drupal\views\ViewExecutableFactory $executable_factory
   *   The view executable factory.
   *
   * @throws \Drupal\facets\Exception\InvalidProcessorException
   * @throws \Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException
   * @throws \Drupal\Component\Plugin\Exception\PluginNotFoundException
   */
  public function __construct(array $configuration, $plugin_id, $plugin_definition, Request $request, EntityTypeManagerInterface $entity_type_manager, ViewExecutableFactory $executable_factory) {
    parent::__construct($configuration, $plugin_id, $plugin_definition, $request, $entity_type_manager);
    $this->executableFactory = $executable_factory;
    $this->storage = $entity_type_manager
      ->getStorage('view');
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static($configuration, $plugin_id, $plugin_definition, $container
      ->get('request_stack')
      ->getMasterRequest(), $container
      ->get('entity_type.manager'), $container
      ->get('views.executable'));
  }

  /**
   * {@inheritdoc}
   */
  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 [];
  }

  /**
   * {@inheritdoc}
   */
  public function setActiveItems(FacetInterface $facet) {
    $source = $facet
      ->getFacetSource();
    switch (TRUE) {
      case $source instanceof CoreViewsExposedFilter:
        $views_filter = $source
          ->getViewsFilterDefinition($facet
          ->getFieldIdentifier());
        $views_filter_parameter = empty($views_filter['expose']) ? $facet
          ->getFieldIdentifier() : $views_filter['expose']['identifier'];
        if ($this->request->query
          ->has($views_filter_parameter)) {
          if ($views_filter['expose']['multiple']) {
            foreach ($this->request->query
              ->get($views_filter_parameter, []) as $value) {
              $facet
                ->setActiveItem(trim($value, '"'));
            }
          }
          else {
            $value = $this->request->query
              ->get($views_filter_parameter, NULL);
            if (isset($value) && $value !== '') {
              $facet
                ->setActiveItem($value);
            }
          }
        }
        break;
      case $source instanceof CoreViewsContextualFilter:
        $map = $source
          ->getViewsArgumentsMap();
        if (isset($map[$facet
          ->getFieldIdentifier()])) {
          $current_argument = $map[$facet
            ->getFieldIdentifier()];
          if ($current_argument['value'] != $current_argument['neutral_value']) {
            $facet
              ->setActiveItem($current_argument['value']);
          }
        }
        break;
      default:
        return;
    }
  }

}

Members

Namesort descending Modifiers Type Description Overrides
CoreViewsUrlProcessor::$currentView protected property The current view.
CoreViewsUrlProcessor::$executableFactory protected property The factory to load a view executable with.
CoreViewsUrlProcessor::$storage protected property The view storage.
CoreViewsUrlProcessor::buildUrls public function Adds urls to the results. Overrides UrlProcessorInterface::buildUrls
CoreViewsUrlProcessor::create public static function Creates an instance of the plugin. Overrides UrlProcessorPluginBase::create
CoreViewsUrlProcessor::setActiveItems public function Sets active items. Overrides UrlProcessorPluginBase::setActiveItems
CoreViewsUrlProcessor::__construct public function Constructs a new instance of the class. Overrides UrlProcessorPluginBase::__construct
DependencySerializationTrait::$_entityStorages protected property An array of entity type IDs keyed by the property name of their storages.
DependencySerializationTrait::$_serviceIds protected property An array of service IDs keyed by property name used for serialization.
DependencySerializationTrait::__sleep public function 1
DependencySerializationTrait::__wakeup public function 2
DependencyTrait::$dependencies protected property The object's dependencies.
DependencyTrait::addDependencies protected function Adds multiple dependencies.
DependencyTrait::addDependency protected function Adds a dependency.
MessengerTrait::$messenger protected property The messenger. 29
MessengerTrait::messenger public function Gets the messenger. 29
MessengerTrait::setMessenger public function Sets the messenger.
PluginBase::$configuration protected property Configuration information passed into the plugin. 1
PluginBase::$pluginDefinition protected property The plugin implementation definition. 1
PluginBase::$pluginId protected property The plugin_id.
PluginBase::DERIVATIVE_SEPARATOR constant A string which is used to separate base plugin IDs from the derivative ID.
PluginBase::getBaseId public function Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface::getBaseId
PluginBase::getDerivativeId public function Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface::getDerivativeId
PluginBase::getPluginDefinition public function Gets the definition of the plugin implementation. Overrides PluginInspectionInterface::getPluginDefinition 3
PluginBase::getPluginId public function Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface::getPluginId
PluginBase::isConfigurable public function Determines if the plugin is configurable.
ProcessorInterface::STAGE_BUILD constant Processing stage: build.
ProcessorInterface::STAGE_POST_QUERY constant Processing stage: post_query.
ProcessorInterface::STAGE_PRE_QUERY constant Processing stage: pre_query.
ProcessorInterface::STAGE_SORT constant Processing stage: sort.
ProcessorPluginBase::buildConfigurationForm public function Adds a configuration form for this processor. Overrides ProcessorInterface::buildConfigurationForm 10
ProcessorPluginBase::calculateDependencies public function Calculates dependencies for the configured plugin. Overrides DependentPluginInterface::calculateDependencies
ProcessorPluginBase::defaultConfiguration public function Gets default configuration for this plugin. Overrides ConfigurableInterface::defaultConfiguration 8
ProcessorPluginBase::getConfiguration public function Gets this plugin's configuration. Overrides ConfigurableInterface::getConfiguration
ProcessorPluginBase::getDefaultWeight public function Returns the default weight for a specific processing stage. Overrides ProcessorInterface::getDefaultWeight
ProcessorPluginBase::getDescription public function Retrieves the processor description. Overrides ProcessorInterface::getDescription
ProcessorPluginBase::getQueryType public function Picks the preferred query type for this widget. Overrides ProcessorInterface::getQueryType 4
ProcessorPluginBase::isHidden public function Determines whether this processor should be hidden from the user. Overrides ProcessorInterface::isHidden
ProcessorPluginBase::isLocked public function Determines whether this processor should always be enabled. Overrides ProcessorInterface::isLocked
ProcessorPluginBase::setConfiguration public function Sets the configuration for this plugin instance. Overrides ConfigurableInterface::setConfiguration
ProcessorPluginBase::submitConfigurationForm public function
ProcessorPluginBase::supportsFacet public function Checks if the facet is supported by this widget. Overrides ProcessorInterface::supportsFacet 6
ProcessorPluginBase::supportsStage public function Checks whether this processor implements a particular stage. Overrides ProcessorInterface::supportsStage
ProcessorPluginBase::validateConfigurationForm public function Validates a configuration form for this processor. Overrides ProcessorInterface::validateConfigurationForm 2
StringTranslationTrait::$stringTranslation protected property The string translation service. 1
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.
UrlProcessorPluginBase::$activeFilters protected property An array of active filters.
UrlProcessorPluginBase::$entityTypeManager protected property The entity type manager.
UrlProcessorPluginBase::$filterKey protected property The query string variable.
UrlProcessorPluginBase::$request protected property The clone of the current request object.
UrlProcessorPluginBase::$separator protected property The url separator variable. 1
UrlProcessorPluginBase::getActiveFilters public function Returns the active filters. Overrides UrlProcessorInterface::getActiveFilters
UrlProcessorPluginBase::getFilterKey public function Returns the filter key. Overrides UrlProcessorInterface::getFilterKey
UrlProcessorPluginBase::getSeparator public function Returns the url separator. Overrides UrlProcessorInterface::getSeparator
UrlProcessorPluginBase::setActiveFilters public function Set active filters. Overrides UrlProcessorInterface::setActiveFilters