Пример добавления возможности фильтровать числовые поля по нескольким значениями (оператор "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
Похожие записи
- Views сортировка по выражению/условию/формуле
- Необязательное значение одной из дат в раскрытом фильтре с оператором BETWEEN
- Как для определённой роли спрятать колонку или поле в представлении Views
- Как работает опция "Aggregation type" в настройках полей Views при включённой агрегации
- AJAX в форме корзины Commerce 2
Добавить комментарий