Commit 29f429f8 authored by Stephen Mustgrave's avatar Stephen Mustgrave
Browse files

Issue #3064797: Form filters removed by pagination

parent 589e6401
Loading
Loading
Loading
Loading
+1 −2
Original line number Diff line number Diff line
@@ -54,8 +54,7 @@ class EventLogStorage {
      $query->condition('description', '%' . $db->escapeLike($getData['keyword']) . '%', 'LIKE');
    }
    if (!empty($getData['user'])) {
      $getUid = substr($getData['user'], strrpos($getData['user'], '(') + 1, -1);
      $query->condition('uid', $getUid);
      $query->condition('uid', $getData['user']);
    }
    $result = $pager->execute();

+66 −12
Original line number Diff line number Diff line
@@ -10,12 +10,20 @@ use Drupal\Core\Ajax\AjaxResponse;
use Drupal\Core\Ajax\HtmlCommand;
use Drupal\Core\Link;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\user\Entity\User;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Configure user settings for this site.
 */
class OverviewForm extends FormBase {

  /**
   * @var array
   *  The form filters
   */
  private $filters = [];

  /**
   * The user storage.
   *
@@ -149,15 +157,6 @@ class OverviewForm extends FormBase {
      '#value' => $this->t('Filter'),
    ];

    if (!empty($form_state->getUserInput())) {
      $form['filters']['reset'] = [
        '#type' => 'submit',
        '#value' => $this->t('Reset'),
        '#limit_validation_errors' => [],
        '#submit' => ['::resetForm'],
      ];
    }

    $header = [
        [
          'data' => $this->t('Updated'),
@@ -174,9 +173,17 @@ class OverviewForm extends FormBase {
        ['data' => $this->t('Name'), 'field' => 'ref_char'],
    ];

    $formData = (!empty($form_state->getUserInput())) ? $form_state->getUserInput() : [];
    $limit = 20;
    $result = EventLogStorage::getSearchData($formData, $header, $limit);
    $this->getFiltersFromUrl($form);
    $result = EventLogStorage::getSearchData($this->filters, $header, 20);

    if (!empty($this->filters)) {
      $form['filters']['reset'] = [
        '#type' => 'submit',
        '#value' => $this->t('Reset'),
        '#limit_validation_errors' => [],
        '#submit' => ['::resetForm'],
      ];
    }

    $rows = [];
    foreach ($result as $record) {
@@ -205,7 +212,9 @@ class OverviewForm extends FormBase {
    // Finally add the pager.
    $build['pager'] = [
      '#type' => 'pager',
      '#parameters' => $this->filters
    ];

    $form['results'] = $build;

    return $form;
@@ -217,6 +226,7 @@ class OverviewForm extends FormBase {
  public function submitForm(array &$form, FormStateInterface $form_state) {
    $form_state->disableRedirect();
    $form_state->setRebuild();
    $this->setFilters($form_state);
  }

  /**
@@ -233,6 +243,50 @@ class OverviewForm extends FormBase {
  public function resetForm(array &$form, FormStateInterface $form_state) {
    $form_state->setRedirect('<current>');
    $form_state->setValues([]);
    $this->filters = [];
  }

  /**
   * Retrieves form filters from the URL.
   *
   * @param array $form
   *   An associative array containing the structure of the form.
   */
  public function getFiltersFromUrl(&$form) {
    $url_params = \Drupal::request()->query->all();
    if (!empty($url_params)) {
      unset($url_params['page']);
      $this->filters = $url_params;
      foreach ($this->filters as $field => $value) {
        if ($field === "user") {
          $user = User::load($value);
          $form['filters'][$field]['#default_value'] = $user;
        }
        else {
          $form['filters'][$field]['#default_value'] = $value;
        }
      }
    }
  }

  /**
   * Stores form filters in the URL.
   *
   * @param \Drupal\Core\Form\FormStateInterface $form_state
   *   The current state of the form.
   */
  public function setFilters(FormStateInterface $form_state) {
    $this->filters = [];
    $values = $form_state->getValues();
    foreach($values as $field => $value) {
      if ($field === 'submit') {
        break;
      }
      elseif (isset($value) && $value !== "") {
        $this->filters[$field] = $value;
      }
    }
    \Drupal::request()->query->replace($this->filters);
  }

  /**