сделал так:
- в приложение добавляем два текстовых элемента МИН, МАКС, поля для хранения диапазона в материалах
- в модуль поиска добавляем элемент МИН, выбираем шаблон "Диапазон по числам"
элемент МАКС в модуль поиска не добавляем, т.к. значения ОТ - ДО мы получим из "Диапазона по числам"
файл:
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) по двум полям МИН и МАКС
Работает? Остальному работать не мешает?