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


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

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


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

#11 mmth

mmth

Отправлено 26 March 2019 - 18:02

al2401 сказал(а) 26 Мар 2019 - 16:06:

сделал так:

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

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

 

файл:

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

в функции _getSearchSelect

массив $where

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

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

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

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

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

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

  1. // ID элементов полей МИН и МАКС (замените на свои ID)
  2. $range2element_id_min = 'bceec6af-227c-46aa-acf8-92264569fb10';
  3. $range2element_id_max = 'fce21b0a-cac5-4ae2-b579-1b393cfa9eb1';
  4. // если элемент МИН есть в массиве $where
  5. if ($this->array_search2(str_replace('-', '', $range2element_id_min), $where)!= -1) {
  6. // получаем значения ОТ - ДО
  7. $range2_filter_ot = $elements[$range2element_id_min]['range'][0];
  8. $range2_filter_do = $elements[$range2element_id_min]['range'][1];
  9.  
  10. if ($range2_filter_ot == NULL) {$range2_filter_ot = '0';}
  11. if ($range2_filter_do == NULL) {$range2_filter_do = '100000000';}
  12.  
  13. // получаем ID элемента МИН без дефиса '-'
  14. $range2element_id_min = str_replace('-', '', $range2element_id_min);
  15. $range2element_id_max = str_replace('-', '', $range2element_id_max);
  16. //получаем индекс в массиве $where
  17. $range2array_index_filter_min = $this->array_search2("{$range2element_id_min}_n >=", $where);
  18. $range2array_index_filter_max = $this->array_search2("{$range2element_id_min}_n <=", $where);
  19.  
  20. //формируем SQL условие
  21. $range2select = "(greatest(tIndex.e_{$range2element_id_min}_n, {$range2_filter_ot}) <= least(tIndex.e_{$range2element_id_max}_n, {$range2_filter_do}))";
  22.  
  23. //заменяем условие в массиве $where
  24. $where[$range2array_index_filter_min] = $range2select;
  25. $where[$range2array_index_filter_max] = ' 1 ';
  26. }

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

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

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

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

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

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

Работает? Остальному работать не мешает?


  • 0

#12 al2401

al2401

Отправлено 26 March 2019 - 18:09

Поиск не до конца настроен, корректно работает еще с одним условием, завтра буду дальше тестировать


  • 0

#13 al2401

al2401

Отправлено 28 March 2019 - 08:22

Работает ок.


  • 0




Click to return to top of page in style!