Тоже заморочился с реализацией логики "ИЛИ" на мультивыборе. Второй день ковыряю.
Вот решение, вроде работает.
В
\system\core\model.php
public function filterOrBitMask($field, $value){
if (strpos($field, '.') === false){ $field = 'i.' . $field; } $this->filter("$field & '$value' > 0");
return $this;
}
Эту функцию логично вставить после
filterLike.
Далее идем в БД и находим системное имя вашего поля с мультивыбором — меняем его тип со строки на
int(<число бит>
) unsigned zerofill
Далее идем в
\system\fields\listbitmask.php и находим функцию
applyFilter
И чтобы ничего не ломать стандартного, просто ставим условия.
public function applyFilter($model, $values) {
if (!is_array($values)) { return parent
::applyFilter($model, $values); }
$filter = $this->parseValue($values);
if (!$filter) { return parent::applyFilter($model, $values); }
if($this->name == 'MY_FIELD1' || $this->name == 'MY_FIELD2' || $this->name == 'MY_FIELD3'){ // начало условия
return $model->filterOrBitMask($this->name, $filter);
} // конец условия
return $model->filterLike($this->name, $filter);
}
В целом, здесь выборка должна работать быстрее, чем через LIKE с шаблоном, как изначально предусмотрел разработчик.