You are here

public function BetterExposedFilters::submitOptionsForm 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::submitOptionsForm()

Handle any special handling on the validate form.

Overrides InputRequired::submitOptionsForm

File

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

Class

BetterExposedFilters
Exposed form plugin that provides a basic exposed form.

Namespace

Drupal\better_exposed_filters\Plugin\views\exposed_form

Code

public function submitOptionsForm(&$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'];

  // Reorder options based on config - some keys may have shifted because of
  // form alterations (@see \Drupal\better_exposed_filters\Plugin\views\exposed_form\BetterExposedFilters::buildOptionsForm).
  $options =& $form_state
    ->getValue('exposed_form_options');
  $options = array_replace_recursive($this->options, $options);

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

  // Shorthand for all filter handlers in this view.

  /** @var \Drupal\views\Plugin\views\HandlerBase[] $filters */
  $filters = $this->view->display_handler->handlers['filter'];
  parent::submitOptionsForm($form, $form_state);

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

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

        /** @var \Drupal\better_exposed_filters\Plugin\BetterExposedFiltersWidgetInterface $plugin */
        if (!$plugin_id) {
          unset($bef_options['filter'][$filter_id]);
          continue;
        }
        $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
          ->submitConfigurationForm($subform, $subform_state);
        $plugin_configuration = $plugin
          ->getConfiguration();
        $bef_options[$type][$filter_id] = $plugin_configuration;
      }
    }
    elseif (in_array($type, [
      'pager',
      'sort',
    ])) {
      $plugin_id = $config['configuration']['plugin_id'] ?? NULL;
      if (!$plugin_id) {
        unset($bef_options[$type]);
        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
        ->submitConfigurationForm($subform, $subform_state);
      $plugin_configuration = $plugin
        ->getConfiguration();
      $bef_options[$type] = $plugin_configuration;
    }
  }
}