...Человеческий поиск в разработке...
- Модуль: crm
- Путь к файлу: ~/bitrix/modules/crm/classes/general/crm_field_multi.php
- Класс: \CCrmFieldMulti
- Вызов: CCrmFieldMulti::PrepareSearchQuery
static function PrepareSearchQuery(&$arFilter, &$arSqlSearch) { global $DB; $filter_keys = array_keys($arFilter); for ($i=0, $ic=count($filter_keys); $i < $ic; $i++) { $val = $arFilter[$filter_keys[$i]]; if (!is_array($val) && ((string)$val == '' || (string)$val == "NOT_REF")) { continue; } $key = strtoupper($filter_keys[$i]); $operationInfo = CSqlUtil::GetFilterOperation($key); $operation = $operationInfo['OPERATION']; // Process only like operation $isLikeOperation = $operation === 'LIKE' ? 'Y' : 'N'; $fieldName = $operationInfo['FIELD']; switch($fieldName) { case 'ID': $arSqlSearch[] = GetFilterQuery('CFM.ID', $val, 'N'); break; case 'ENTITY_ID': if ($operation !== '=' || is_array($val)) { $arSqlSearch[] = GetFilterQuery('CFM.ENTITY_ID', $val, $isLikeOperation); } else { $arSqlSearch[] = 'CFM.ENTITY_ID = \'' . $DB->ForSql((string)$val) . '\''; } break; case 'ELEMENT_ID': if (is_array($val)) { $ar = array(); foreach($val as $v) $ar[] = intval($v); if (!empty($ar)) $arSqlSearch[] = 'CFM.ELEMENT_ID IN ('.implode(',', $ar).')'; } else $arSqlSearch[] = 'CFM.ELEMENT_ID = '.intval($val); break; case 'TYPE_ID': $arSqlSearch[] = GetFilterQuery('CFM.TYPE_ID', $val, $isLikeOperation); break; case 'VALUE_TYPE': if (is_array($val)) { $valueTypeFilter = ''; foreach($val as $v) { $v = $DB->ForSql(trim(strval($v))); if($v === '') { continue; } if($valueTypeFilter !== '') { $valueTypeFilter .= ', '; } $valueTypeFilter .= "'{$v}'"; } if ($valueTypeFilter !== '') { $arSqlSearch[] = "CFM.VALUE_TYPE IN ({$valueTypeFilter})"; } } else $arSqlSearch[] = GetFilterQuery('CFM.VALUE_TYPE', $val, $isLikeOperation); break; case 'COMPLEX_ID': $arSqlSearch[] = GetFilterQuery('CFM.COMPLEX_ID', $val, $isLikeOperation); break; case 'VALUE': $arSqlSearch[] = GetFilterQuery('CFM.VALUE', $val, $isLikeOperation); break; case 'RAW_VALUE': $arSqlSearch[] = "CFM.VALUE = '".$DB->ForSql($val)."'"; break; case 'FILTER': { $arSqlFilterSearch = array(); if(is_array($val)) { // Processing of filter parts foreach($val as $v) { // Prepering filter part - items are joined by 'AND' $arSqlInnerSearch = array(); self::PrepareSearchQuery($v, $arSqlInnerSearch); if(!empty($arSqlInnerSearch)) { $arSqlFilterSearch[] = '('.implode(' AND ', $arSqlInnerSearch).')'; } } } if (!empty($arSqlFilterSearch)) { //$logic = isset($arFilter['LOGIC']) && is_string($arFilter['LOGIC']) ? strtoupper($arFilter['LOGIC']) : ''; //$logic = ''; //if($logic === '') //{ // $logic = 'OR'; //} // Prepering filter - parts are joined by 'OR' //$arSqlSearch[] = '('.implode(" {$logic} ", $arSqlFilterSearch).')'; $arSqlSearch[] = '('.implode(" OR ", $arSqlFilterSearch).')'; } } break; } } }