Перейти к содержимому


Фотография
- - - - -

Настройка Поиска В Диапазоне


Сообщений в теме: 12

#1 spro1

spro1

Отправлено 17 March 2019 - 15:48

Доброго дня!

 

У элемента есть поле с указанием возраста. Например Возраст: 6-17 лет

 

Скажите пожалуйста, можно ли сделать так, чтобы в модуле фильтра JBZoo можно было искать по числу в диапазоне

 

и если, например, в поиске в простое поле пользователь указывает число 8(или другое число в диапазоне от 6 до 17), то элемент, у которого указан возраст 6-17 лет выводился

 

Заранее спасибо!



#2 LeMax

LeMax

Отправлено 18 March 2019 - 08:37

Если это поле тип "Текст" и в него внесено одно значение "6-17" - то ваша задумка не сработает.

Если решать задачу в такой же концепции, то Вам нужно:

 - сделать поле типа "текст" повторяемым

 - в каждой карточке создавать отдельные записи (дублируя это поле) по принципу: 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17

 - тогда поиск будет работать так, как вы хотите.

 

Если кратко, то поиск ищет исключительно по тем значениям - что указаны в поле (он не может искать и "додумывать" по промежуткам)


  • 0

#3 mmth

mmth

Отправлено 18 March 2019 - 10:40

Если это поле тип "Текст" и в него внесено одно значение "6-17" - то ваша задумка не сработает.

Если решать задачу в такой же концепции, то Вам нужно:

 - сделать поле типа "текст" повторяемым

 - в каждой карточке создавать отдельные записи (дублируя это поле) по принципу: 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17

 - тогда поиск будет работать так, как вы хотите.

 

Если кратко, то поиск ищет исключительно по тем значениям - что указаны в поле (он не может искать и "додумывать" по промежуткам)

ваш способ ну очень в лоб

по факту можно сделать свой элемент и написать правильно функцию getSearchData(), но принцип верный релайтид и помещение всего диапазона значений

 

ещё пообщались с fictionlabs и можно посмотреть в сторону своей модели для элемента папка jbmodel, нужно добавить свою модель для своего элемента и подключить её 


Сообщение отредактировал mmth: 18 March 2019 - 19:51

  • 0

#4 LeMax

LeMax

Отправлено 18 March 2019 - 10:43

ваш способ ну очень в лоб

Да, все верно :)

Это единственный и самый "топорный" способ "из коробки".

Ведь если бы автору топика было понятна логика работы существующего элемента и он знал\умел создавать свои элементы и адаптировать под поиск и свои потребности, то он, скорее всего, не создавал бы эту тему с таким вопросом.

Поэтому решения (как всегда два):

 - делать не удобно, но зато "из коробки" и тогда будет "как-то работать"

 - писать элементы\модули под себя и настраивать :)


  • 0

#5 spro1

spro1

Отправлено 18 March 2019 - 14:23

LeMax, mmth, спасибо за понятные и подробные ответы! Буду думать.

 

Вообще если честно, то на каждое сообщение люди тут отвечают действительно сознанием дела. Очень приятно, что пишут "не абы что" лишь бы ответить, а по делу.

 

Еще раз повторюсь, в наше время это действительно редко!

 

Это очень дорогого стоит!



#6 CB9TOIIIA

CB9TOIIIA

Отправлено 21 March 2019 - 09:52

Ребят, помогите советом или кодом ТС   :) (взяться за работу)

 

Я не представляю как это сделать, единственное, что логично:

 

брать 1 и 2 число - далее foreach проходить по всему это диапазону циклом - и сохранять в элементе textarea в search (item).

 

Но если товаров будет 20 тыс, все норм будет?  если по примеру моему Выше - там особо кода не так много выйдет. Но производительное ли решение?


  • 0

#7 al2401

al2401

Отправлено 21 March 2019 - 09:57

Добрый день, тоже требуется поиск диапазона,

например в материале поля мин.(1 000 000) и макс. (5 000 000),

или одно поле в котором задан диапазон 1 000 000 - 5 000 000,

 

нужен элемент фильтра где выполняется поиск "диапазона по диапазону". Если есть пересечение, то материал можно найти,
т.е в материале указываем "от 1 000 000 до 5 000 000", в фильтре
от 500 000 до 2 000 000, или 
от 2 000 000 до 4 000 000,или 
от 2 000 000 до 6 000 000, или 
от 500 000 до 6 000 000
в любом из этих случаев материал должен попасть в результаты поиска

Сообщение отредактировал al2401: 21 March 2019 - 10:13

  • 0

#8 LeMax

LeMax

Отправлено 21 March 2019 - 10:12

Как идея\совет: в JBZoo периоды\диапазоны уже реализованы в поиске по цене (там где как раз задается диапазон), может быть начать капать с той стороны и дублировать логику работы?


  • 0

#9 al2401

al2401

Отправлено 21 March 2019 - 13:41

Сам реализовать не смогу, опубликовал задачу в разделе за вознаграждение:

http://forum.jbzoo.c...na-po-diapazon/


  • 0

#10 al2401

al2401

Отправлено 26 March 2019 - 17:06

сделал так:

  • в приложение добавляем два текстовых элемента МИН, МАКС, поля для хранения диапазона в материалах
  • в модуль поиска добавляем элемент МИН, выбираем шаблон "Диапазон по числам"

элемент МАКС в модуль поиска не добавляем, т.к. значения ОТ - ДО мы получим из "Диапазона по числам"

 

файл:

media\zoo\applications\jbuniversal\framework\models\jbmodel.filter.php

в функции _getSearchSelect

массив $where

содержит условия примерно в таком виде 

    [0] => tIndex.e_bceec6af227c46aaacf892264569fb10_s IS NOT NULL
    [1] => tIndex.e_bceec6af227c46aaacf892264569fb10_n IS NOT NULL
    [2] => tIndex.e_bceec6af227c46aaacf892264569fb10_n >= 45 // условие для поля МИН - ОТ
    [3] => tIndex.e_bceec6af227c46aaacf892264569fb10_n <= 55 // условие для поля МИН - ДО
    ...

в примере индексы [2] и [3] содержат значения для стандартного, поиска по диапазону по полю МИН (фильтр от 45 до 55)

код ниже убирает условие в индексе [3] и вставляем в индекск [2] SQL условие для выборки "диапазона по диапазону"

добавить код в функцию _getSearchSelect,

после строки $where = array_filter($where);

            // ID элементов полей МИН и МАКС (замените на свои ID)
            $range2element_id_min = 'bceec6af-227c-46aa-acf8-92264569fb10';
            $range2element_id_max = 'fce21b0a-cac5-4ae2-b579-1b393cfa9eb1';
            // если элемент МИН есть в массиве $where
            if ($this->array_search2(str_replace('-', '', $range2element_id_min), $where)!= -1) { 
                // получаем значения ОТ - ДО
                $range2_filter_ot = $elements[$range2element_id_min]['range'][0]; 
                $range2_filter_do = $elements[$range2element_id_min]['range'][1]; 

                if ($range2_filter_ot == NULL) {$range2_filter_ot = '0';}
                if ($range2_filter_do == NULL) {$range2_filter_do = '100000000';}

                // получаем ID элемента МИН без дефиса '-' 
                $range2element_id_min = str_replace('-', '', $range2element_id_min); 
                $range2element_id_max = str_replace('-', '', $range2element_id_max); 
                //получаем индекс в массиве $where 
                $range2array_index_filter_min = $this->array_search2("{$range2element_id_min}_n >=", $where); 
                $range2array_index_filter_max = $this->array_search2("{$range2element_id_min}_n <=", $where); 

                //формируем SQL условие 
                $range2select = "(greatest(tIndex.e_{$range2element_id_min}_n, {$range2_filter_ot}) <= least(tIndex.e_{$range2element_id_max}_n, {$range2_filter_do}))"; 

                //заменяем условие в массиве $where 
                $where[$range2array_index_filter_min] = $range2select; 
                $where[$range2array_index_filter_max] = ' 1 '; 
            }

добавляем пользовательскую функцию для поиска номера индекса в массиве по неполному соответствию

в конце файла перед закрывающей скобкой }

    private function array_search2($search, $arr)
    {
        $result = -1;
        foreach ($arr as  $key=>$val){
            if (strpos($val, $search)!==false){
                $result = $key;
            }
        }
        return $result; // возвращает индекс
    }

В результате массив условий $where будет иметь вид:

    [0] => tIndex.e_bceec6af227c46aaacf892264569fb10_s IS NOT NULL
    [1] => tIndex.e_bceec6af227c46aaacf892264569fb10_n IS NOT NULL
    [2] => (greatest(tIndex.e_bceec6af227c46aaacf892264569fb10_n, 45) <= least(tIndex.e_fce21b0acac54ae2b5791b393cfa9eb1_n, 55))
    [3] => 1
    ...

в строке [2] условие для поиска диапазона по числам (от 45 до 55) по двум полям МИН и МАКС


Сообщение отредактировал al2401: 26 March 2019 - 17:47

  • 0




Click to return to top of page in style!