Изменить принцип работы фильтра в ТК

#1 14 июня 2019 в 11:50
Здравствуйте, уважаемые!
Подскажите, пожалуйста, как бы изменить работу фильтра, чтобы в текстовых полях искались только целые слова.
Пример: при вводе в поле фильтра слова "хлеб" в результат фильтрации не попадали слова типа "хлебопекарня" или "хлеборезка".
Заранее благодарен!
#2 14 июня 2019 в 13:19
Интереснее выбор Все слова и Точное совпадение как в Расширенном поиске.
#3 14 июня 2019 в 13:21
Олег Васильевич я,
Давайте рассуждать логически. Если мы хотим, чтобы в выборку попадал хлеб, но не попадала хлеборезка, значит следующим символом после искомой подстроки должен быть либо пробел, либо знак препинания.
Допустим мы ищем в поле content.
Тогда нам нужно зайти в файл \system\fields\html.php, найти там функцию
  1. public function applyFilter($model, $value) {
  2. return $model->filterLike($this->name, "%{$value}%");
  3. }
и привести её к какому-то такому виду:
  1. public function applyFilter($model, $value) {
  2. return $model->filterLike($this->name, "%{$value} %")->filterOr()->filterLike($this->name, "%{$value}.%")->filterOr()->filterLike($this->name, "%{$value},%")->filterOr()->filterLike($this->name, "%{$value}?%");
  3. }
Возможно есть способ проще, но это уже думать надо… laugh
#4 14 июня 2019 в 18:42

Интереснее выбор Все слова и Точное совпадение как в Расширенном поиске .

@noname
@noname, там тьма интересностей))

Давайте рассуждать логически.

Ris
Это когда есть чем рассуждать (в моём случае проблема — отсутствует рассуждалка) cry

Тогда нам нужно…

Ris
Ещё пару-тройку вариантов придётся дописать, но решение вполне пригодно. Спасибо!
#5 14 июня 2019 в 22:31
Ris, к сожалению, так не получается (часть слова таки ищется).
Возможно, я привёл не удачный пример. Попробую ещё раз описать суть.
Есть 3 записи. Одно из полей у каждой из них заполнено так:
1
11
111
Сейчас, если ввести в поле фильтра 11, получим результат, в виде второй и третьей записей.
Вопрос, как заставить фильтр отдать на выходе только вторую запись?
#6 14 июня 2019 в 23:04
Олег Васильевич я,
Видимо придется как-то фильтровать по длине строки..
Завтра подумаю, сейчас жена зовёт.
#7 15 июня 2019 в 00:07
Олег Васильевич я,
Вот так:
  1. public function applyFilter($model, $value) {
  2. $value_len = strlen($value);
  3. return $model->filterLike($this->name, "%{$value}%")->filterAnd()->filter("CHAR_LENGTH(i.{$this->name}) =". $value_len) ;
  4. }
#8 15 июня 2019 в 00:26

Олег Васильевич я,
Вот так:

Ris
А так образуется шампанское жене и мороженное детям!
Спасибо!

Здесь:
www.php.net/manual/ru/function.preg-match.php
во втором примере накопал на, первый взгяд, нужное.
Но так и не смог добиться чтобы работало как надо. cry
#9 15 июня 2019 в 00:52

во втором примере накопал на, первый взгяд, нужное.
Но так и не смог добиться чтобы работало как надо.

Олег Васильевич я
Надо было вот тут копать:
www.mysql.ru/docs/man/Regexp.html
Там чернозём толще...
___________________________

Вот так тогда уж:
  1. public function applyFilter($model, $value) {
  2. return $model->filter('i.'.$this->name. " REGEXP '^$value$'") ;
  3. }
#10 15 июня 2019 в 07:56
А не проще ли в строке "%{$value}%" убрать проценты?
  1. public function applyFilter($model, $value) {
  2. return $model->filterLike($this->name, "{$value}");
  3. }
#11 15 июня 2019 в 11:15

А не проще ли в строке "%{$value}%" убрать проценты?

Loadырь
Тогда уж не лайк, а жОсткий эквал!
  1. public function applyFilter($model, $value) {
  2. return $model->filterEqual($this->name, "{$value}");
  3. }
Вы не можете отвечать в этой теме.
Войдите или зарегистрируйтесь, чтобы писать на форуме.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.