Подскажите, пожалуйста, как бы изменить работу фильтра, чтобы в текстовых полях искались только целые слова.
Пример: при вводе в поле фильтра слова "хлеб" в результат фильтрации не попадали слова типа "хлебопекарня" или "хлеборезка".
Заранее благодарен!
Давайте рассуждать логически. Если мы хотим, чтобы в выборку попадал хлеб, но не попадала хлеборезка, значит следующим символом после искомой подстроки должен быть либо пробел, либо знак препинания.
Допустим мы ищем в поле content.
Тогда нам нужно зайти в файл \system\fields\html.php, найти там функцию
public function applyFilter($model, $value) { return $model->filterLike($this->name, "%{$value}%"); }
public function applyFilter($model, $value) { return $model->filterLike($this->name, "%{$value} %")->filterOr()->filterLike($this->name, "%{$value}.%")->filterOr()->filterLike($this->name, "%{$value},%")->filterOr()->filterLike($this->name, "%{$value}?%"); }
@noname, там тьма интересностей))Интереснее выбор Все слова и Точное совпадение как в Расширенном поиске .
Это когда есть чем рассуждать (в моём случае проблема — отсутствует рассуждалка)Давайте рассуждать логически.
Ещё пару-тройку вариантов придётся дописать, но решение вполне пригодно. Спасибо!Тогда нам нужно…
Возможно, я привёл не удачный пример. Попробую ещё раз описать суть.
Есть 3 записи. Одно из полей у каждой из них заполнено так:
1
11
111
Сейчас, если ввести в поле фильтра 11, получим результат, в виде второй и третьей записей.
Вопрос, как заставить фильтр отдать на выходе только вторую запись?
Видимо придется как-то фильтровать по длине строки..
Завтра подумаю, сейчас жена зовёт.
А так образуется шампанское жене и мороженное детям!Олег Васильевич я,
Вот так:
Спасибо!
Здесь:
www.php.net/manual/ru/function.preg-match.php
во втором примере накопал на, первый взгяд, нужное.
Но так и не смог добиться чтобы работало как надо.
Надо было вот тут копать:во втором примере накопал на, первый взгяд, нужное.
Но так и не смог добиться чтобы работало как надо.
www.mysql.ru/docs/man/Regexp.html
Там чернозём толще...
___________________________
Вот так тогда уж:
public function applyFilter($model, $value) { return $model->filter('i.'.$this->name. " REGEXP '^$value$'") ; }
public function applyFilter($model, $value) { return $model->filterLike($this->name, "{$value}"); }
Тогда уж не лайк, а жОсткий эквал!А не проще ли в строке "%{$value}%" убрать проценты?
public function applyFilter($model, $value) { return $model->filterEqual($this->name, "{$value}"); }