Фокус в том, что пресет задаётся до вызова этих компонентов, и выбранный "по умолчанию" должен примениться к выборке main.ui.grid.
Что бы это реализовать в компоненте в месте где получаем и проверяем значения фильтра делаем так:
$arResult['GRID']['FILTER_ID'] = (str)$arParams['FILTER_ID]; $arResult['GRID']['FILTER_FIELDS'] = $arParams['FILTER_FIELDS] // массив полей фильтра $arResult['GRID']['FILTER_OBJ'] = new Bitrix\Main\UI\Filter\Options($arResult['GRID']['FILTER_ID'], $arParams['FILTER_PRESETS']); // либо запилить пресет прямо в компонент. $filterData = $arResult['GRID']['FILTER_OBJ']->getFilter($arResult['GRID']['FILTER_FIELDS']); // получили массив для фильтрации Фильтруем! :) |
.... $filterData = $arResult['GRID']['FILTER_OBJ']->getFilter($arResult['GRID']['FILTER_FIELDS']); // получили массив для фильтрации $arResult['GRID']['GET_LIST']['filter'] = []; // массив условий для последующей фильтрации в ::getList(...) if ($filterData["FILTER_APPLIED"] == true) { foreach ($filterData as $k => $v) { $v = htmlspecialchars($v); if (is_numeric(str_replace(",",".",$v))) $v = floatval(str_replace(",",".",$v)); // преобразование числа if (preg_match('#(_from|_to)#', $k, $logics)){ $logics = $logics[1]; $k = preg_replace('#(_from|_to)#', '', $k); if ($logics=="_from"){ $logics = ">"; }elseif($logics=="_to"){ $logics = "<"; } }elseif (preg_match('#^(<|>|!=|>=|<=|%)#', $v, $logics) && $logics[1]){ $logics = $logics[1]; $v = preg_replace('#^'.$logics.'#', '', $v); } else { $logics = '%'; } if ($k == 'CONTRAGENT') { $arResult['GRID']['GET_LIST']['filter'][$logics.'CONTRAGENT_NAME'] = $v; }elseif ($k == 'ADDRESS') { $arResult['GRID']['GET_LIST']['filter'][$logics.'ADDRESS_NAME'] = $v; }elseif ($k == 'ACCOUNT_NUMBER') { $arResult['GRID']['GET_LIST']['filter'][$logics.'ACCOUNT_NUMBER'] = $v; }elseif (isset($arResult['GRID']['FILTER_TABLE_CODE'][$k])) { $col_name = $arResult['GRID']['FILTER_TABLE_CODE'][$k]?:$k; $arResult['GRID']['GET_LIST']['filter'][$logics.$col_name] = $v; }elseif ($k == 'FIND' && !empty($v)) { $find = []; foreach($arResult['GRID']['FILTER_TABLE_CODE'] as $code => $col_name){ if ($col_name) $find[$logics.$col_name] = trim($v); } $arResult['GRID']['GET_LIST']['filter'][] = array_merge(["LOGIC" => "OR"],$find); } } unset($col_name, $find); }Комментируйте, буду рад!
вместо
if (empty($v)) continue;
\Bitrix\Main\UI\Filter\Type::getLogicFilter($filterFields, $sourceFields);
где $sourceFields - массив описания полей фильтра:
$sourceFields = [
['id' => 'ID', 'name' => 'ID', 'type' => 'number', 'default' => true],
['id' => 'DATE_UPDATE', 'name' => 'Дата обновления', 'type' => 'date', 'default' => true]
];