xandeadx.ru Блог музицирующего веб-девелопера

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

По умолчанию, если в раскрытом фильтре по дате с оператором 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
 
/**
 * Implements hook_views_plugins_filter_alter().
 */
function MODULENAME_views_plugins_filter_alter(array &$plugins): void {
  $plugins['date']['class'] = DateOptionalFilter::class;
}
Написанное актуально для Drupal 9
Похожие записи

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании