You are here

public function SortWidgetBase::exposedFormAlter in Better Exposed Filters 8.5

Same name and namespace in other branches
  1. 8.4 src/Plugin/better_exposed_filters/sort/SortWidgetBase.php \Drupal\better_exposed_filters\Plugin\better_exposed_filters\sort\SortWidgetBase::exposedFormAlter()

Manipulate views exposed from element.

Parameters

array $form: The views configuration form.

\Drupal\Core\Form\FormStateInterface $form_state: Form state.

Overrides BetterExposedFiltersWidgetInterface::exposedFormAlter

3 calls to SortWidgetBase::exposedFormAlter()
DefaultWidget::exposedFormAlter in src/Plugin/better_exposed_filters/sort/DefaultWidget.php
Manipulate views exposed from element.
Links::exposedFormAlter in src/Plugin/better_exposed_filters/sort/Links.php
Manipulate views exposed from element.
RadioButtons::exposedFormAlter in src/Plugin/better_exposed_filters/sort/RadioButtons.php
Manipulate views exposed from element.
3 methods override SortWidgetBase::exposedFormAlter()
DefaultWidget::exposedFormAlter in src/Plugin/better_exposed_filters/sort/DefaultWidget.php
Manipulate views exposed from element.
Links::exposedFormAlter in src/Plugin/better_exposed_filters/sort/Links.php
Manipulate views exposed from element.
RadioButtons::exposedFormAlter in src/Plugin/better_exposed_filters/sort/RadioButtons.php
Manipulate views exposed from element.

File

src/Plugin/better_exposed_filters/sort/SortWidgetBase.php, line 157

Class

SortWidgetBase
Base class for Better exposed pager widget plugins.

Namespace

Drupal\better_exposed_filters\Plugin\better_exposed_filters\sort

Code

public function exposedFormAlter(array &$form, FormStateInterface $form_state) {
  $is_collapsible = $this->configuration['advanced']['collapsible'] && !empty($this->configuration['advanced']['collapsible_label']);
  $is_secondary = !empty($form['secondary']) && $this->configuration['advanced']['is_secondary'];

  // Check for combined sort_by and sort_order.
  if ($this->configuration['advanced']['combine'] && !empty($form['sort_order'])) {
    $options = [];
    $selected = '';
    foreach ($form['sort_by']['#options'] as $by_key => $by_val) {
      foreach ($form['sort_order']['#options'] as $order_key => $order_val) {

        // Use a space to separate the two keys, we'll unpack them in our
        // submit handler.
        $options[$by_key . '_' . $order_key] = "{$by_val} {$order_val}";
        if ($form['sort_order']['#default_value'] === $order_key && empty($selected)) {

          // Respect default sort order set in Views. The default sort field
          // will be the first one if there are multiple sort criteria.
          $selected = $by_key . '_' . $order_key;
        }
      }
    }

    // Rewrite the option values if any were specified.
    if (!empty($this->configuration['advanced']['combine_rewrite'])) {
      $options = BetterExposedFiltersHelper::rewriteOptions($options, $this->configuration['advanced']['combine_rewrite'], TRUE);
      if (!isset($options[$selected])) {

        // Avoid "illegal choice" errors if the selected option is
        // eliminated by the rewrite.
        $selected = NULL;
      }
    }

    // Add reset sort option at the top of the list.
    if ($this->configuration['advanced']['reset']) {
      $options = [
        ' ' => $this->configuration['advanced']['reset_label'],
      ] + $options;
    }
    $form['sort_bef_combine'] = [
      '#type' => 'select',
      '#options' => $options,
      '#default_value' => $selected,
      // Already sanitized by Views.
      '#title' => $form['sort_by']['#title'],
    ];

    // Add our submit routine to process.
    $form['#submit'][] = [
      $this,
      'sortCombineSubmitForm',
    ];

    // Pretend we're another exposed form widget.
    $form['#info']['sort-sort_bef_combine'] = [
      'value' => 'sort_bef_combine',
    ];

    // Remove the existing sort_by and sort_order elements.
    unset($form['sort_by']);
    unset($form['sort_order']);
  }
  else {

    // Add reset sort option if selected.
    if ($this->configuration['advanced']['reset']) {
      array_unshift($form['sort_by']['#options'], $this->configuration['advanced']['reset_label']);
    }
  }

  // If selected, collect all sort-related form elements and put them in a
  // details element.
  if ($is_collapsible) {
    $form['bef_sort_options'] = [
      '#type' => 'details',
      '#title' => $this->configuration['advanced']['collapsible_label'],
    ];
    if ($is_secondary) {

      // Move secondary elements.
      $form['bef_sort_options']['#group'] = 'secondary';
    }
  }

  // Iterate over all exposed sort elements.
  foreach ($this->sortElements as $element) {

    // Sanity check to make sure the element exists.
    if (empty($form[$element])) {
      continue;
    }

    // Move collapsible elements.
    if ($is_collapsible) {
      $this
        ->addElementToGroup($form, $form_state, $element, 'bef_sort_options');
    }
    elseif ($is_secondary) {
      $this
        ->addElementToGroup($form, $form_state, $element, 'secondary');
    }

    // Finally, add some metadata to the form element.
    $this
      ->addContext($form[$element]);
  }
}