Drupal → Необязательное значение одной из дат в раскрытом фильтре с оператором BETWEEN

15.02.2021

По умолчанию, если в раскрытом фильтре по дате с оператором between оставить одно из значений пустым, то фильтр будет просто игнорироваться. Виноват в таком поведении метод \Drupal\views\Plugin\views\filter\Date::acceptExposedInput(), который возвращает FALSE если хоть одно значение пустое.

Один из способов решить эту проблему:

// src/Plugin/views/filter/DateOptionalFilter.php

namespace Drupal\MODULENAME\Plugin\views\filter;

use Drupal\views\Plugin\views\filter\Date;

class DateOptionalFilter extends Date {

  /**
   * {@inheritDoc}
   */
  public function acceptExposedInput($input): bool {
    $result = parent::acceptExposedInput($input);

    if (!$result && ($this->operator == 'between' || $this->operator == 'not between')) {
      if ($this->value['min'] && !$this->value['max']) {
        $result = TRUE;
        $this->value['max'] = '3000-01-01';
      }
      if (!$this->value['min'] && $this->value['max']) {
        $result = TRUE;
        $this->value['min'] = '1000-01-01';
      }
    }

    return $result;
  }

}
// MODULENAME.module

use Drupal\MODULENAME\Plugin\views\filter\DateOptionalFilter;

/**
 * Implements hook_views_plugins_filter_alter().
 */
function MODULENAME_views_plugins_filter_alter(array &$plugins): void {
  $plugins['date']['class'] = DateOptionalFilter::class;
}
Написанное актуально для
Drupal 9
Похожие записи

Добавить комментарий