You are here

public function BetterExposedFilters::validateOptionsForm in Better Exposed Filters 8.4

Same name and namespace in other branches
  1. 8.5 src/Plugin/views/exposed_form/BetterExposedFilters.php \Drupal\better_exposed_filters\Plugin\views\exposed_form\BetterExposedFilters::validateOptionsForm()
  2. 8.3 src/Plugin/views/exposed_form/BetterExposedFilters.php \Drupal\better_exposed_filters\Plugin\views\exposed_form\BetterExposedFilters::validateOptionsForm()

Validate the options form.

Overrides PluginBase::validateOptionsForm

File

src/Plugin/views/exposed_form/BetterExposedFilters.php, line 560

Class

BetterExposedFilters
Exposed form plugin that provides a basic exposed form.

Namespace

Drupal\better_exposed_filters\Plugin\views\exposed_form

Code

public function validateOptionsForm(&$form, FormStateInterface $form_state) {

  // Drupal only passes in a part of the views form, but we need the complete
  // form array for plugin subforms to work.
  $parent_form = $form_state
    ->getCompleteForm();

  // Save a shorthand to the BEF form.
  $bef_form =& $form['bef'];

  // Save a shorthand to the BEF options.
  $bef_form_options = $form_state
    ->getValue([
    'exposed_form_options',
    'bef',
  ]);
  parent::validateOptionsForm($form, $form_state);

  // Skip plugin validation if we are switching between bef plugins.
  $triggering_element = $form_state
    ->getTriggeringElement();
  if ($triggering_element['#type'] !== 'submit') {
    return;
  }

  // Shorthand for all filter handlers in this view.

  /** @var \Drupal\views\Plugin\views\HandlerBase[] $filters */
  $filters = $this->view->display_handler->handlers['filter'];

  // Iterate over all filter, sort and pager plugins.
  foreach ($bef_form_options as $type => $config) {

    // Validate exposed filter configuration.
    if ($type === 'filter') {
      foreach ($config as $filter_id => $filter_options) {
        $plugin_id = $filter_options['configuration']['plugin_id'] ?? NULL;
        if (!$plugin_id) {
          continue;
        }

        /** @var \Drupal\better_exposed_filters\Plugin\BetterExposedFiltersWidgetInterface $plugin */
        $plugin = $this->filterWidgetManager
          ->createInstance($plugin_id);
        $subform =& $bef_form[$type][$filter_id]['configuration'];
        $subform_state = SubformState::createForSubform($subform, $parent_form, $form_state);
        $plugin
          ->setView($this->view);
        $plugin
          ->setViewsHandler($filters[$filter_id]);
        $plugin
          ->validateConfigurationForm($subform, $subform_state);
      }
    }
    elseif (in_array($type, [
      'pager',
      'sort',
    ])) {
      $plugin_id = $config['configuration']['plugin_id'] ?? NULL;
      if (!$plugin_id) {
        continue;
      }

      // Use the correct widget manager.
      if ($type === 'pager') {

        /** @var \Drupal\better_exposed_filters\Plugin\BetterExposedFiltersWidgetInterface $plugin */
        $plugin = $this->pagerWidgetManager
          ->createInstance($plugin_id);
      }
      else {

        /** @var \Drupal\better_exposed_filters\Plugin\BetterExposedFiltersWidgetInterface $plugin */
        $plugin = $this->sortWidgetManager
          ->createInstance($plugin_id);
      }
      $subform =& $bef_form[$type]['configuration'];
      $subform_state = SubformState::createForSubform($subform, $parent_form, $form_state);
      $plugin
        ->setView($this->view);
      $plugin
        ->validateConfigurationForm($subform, $subform_state);
    }
  }
}