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

Drupal → Как расширить функционал фильтр-плагина Views? (добавляем возможность фильтровать числовые поля по нескольким значениям)

Опубликовано в

Пример добавления возможности фильтровать числовые поля по нескольким значениями (добавления оператора "in").

1. В папке своего модуля src/Plugin/views/filter создаём класс и наследуем его от класса, который нужно расширить. В этом классе переопределяем нужные методы и по необходимости добавляем свои. Аннотацию плагина добавлять не нужно.

class ExtendedNumericFilter extends NumericFilter {
 
  /**
   * {@inheritDoc}
   */
  public function operators() {
    $operators = parent::operators();
 
    $operators['in'] = [
      'title' => $this->t('Is one of'),
      'short' => $this->t('in'),
      'short_single' => $this->t('='),
      'method' => 'opIn',
      'values' => 1,
    ];
 
    return $operators;
  }
 
  /**
   * "in" operator.
   */
  protected function opIn($field) {
    $values = explode(',', $this->value['value']);
    $this->query->addWhere($this->options['group'], $field, $values, $this->operator);
  }
 
}

2. Подменяем класс оригинального плагина в хуке hook_views_plugins_filter_alter():

/**
 * Implements hook_views_plugins_filter_alter().
 */
function MODULENAME_views_plugins_filter_alter(array &$plugins) {
  $plugins['numeric']['class'] = ExtendedNumericFilter::class;
}

3. Сбрасываем кэш.

Теперь у числовых полей в фильтре появится оператор "Is one of", которому можно прописать значения в формате 1,2,3.

По аналогии можно подменить любой плагин в друпале, но злоупотреблять этим не стоит.

Написанное актуально для Drupal 8
Похожие записи

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

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

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