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

26.12.2019

Пример добавления возможности фильтровать числовые поля по нескольким значениями (оператор "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
Похожие записи

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