Компонент "intranet.user.selector.new" активно используется в портале, а мы его используем еще и в своих новых компонентах. И вот после обновления портала получили "сюрприз". Если сотрудников много (а у нас их очень много

), то пользователь не может найти сотрудника с популярной подстрокой в ФИО. Например, "михайлов". В нашем случае много "михайлович"-ей, "алексеевичей", "александр"-ов и "александр"-овичей.

И ни при каких комбинациях невозможно найти "михайлов александр алексеевич".
Почему?
В новой версии компонента вендор начал использовать ORM. И, соответственно, немного поменялся результирующий запрос:
| Код |
|---|
SEL ECT
`main_user`.`ID`AS`ID`,
`main_user`.`NAME`AS`NAME`,
`main_user`.`LAST_NAME`AS`LAST_NAME`,
`main_user`.`SECOND_NAME`AS`SECOND_NAME`,
`main_user`.`EMAIL`AS`EMAIL`,
`main_user`.`LOGIN`AS`LOGIN`,
`main_user`.`WORK_POSITION`AS`WORK_POSITION`,
`main_user`.`PERSONAL_PROFESSION`AS`PERSONAL_PROFESSION`,
`main_user`.`PERSONAL_PHOTO`AS`PERSONAL_PHOTO`,
`main_user`.`PERSONAL_GENDER`AS`PERSONAL_GENDER`,
`main_user_uts_object`.`UF_DEPARTMENT`AS`UF_DEPARTMENT`
FR OM`b_user``main_user`
LEFTJOIN`b_uts_user``main_user_uts_object`ON`main_user`.`ID`=`main_user_uts_object`.`VALUE_ID`
WHERE(
(UPPER(`main_user`.`LAST_NAME`)like'%МИХАЙЛОВ%'ESCAPE'!')
OR(UPPER(`main_user`.`NAME`)like'%%МИХАЙЛОВ%%'ESCAPE'!')
OR(UPPER(`main_user`.`SECOND_NAME`)like'%%МИХАЙЛОВ%%'ESCAPE'!')
ORUPPER(`main_user`.`EMAIL`)like'%%МИХАЙЛОВ%%'ESCAPE'!'
ORUPPER(`main_user`.`LOGIN`)like'%%МИХАЙЛОВ%%'ESCAPE'!'
)
ANDUPPER(`main_user`.`ACTIVE`)likeupper('Y')
ORDERBY`main_user`.`LAST_NAME`ASC
LIMIT0,10 |
В компоненте, к тому же, зашито ограничение на выборку первых 10 совпадений. И в итоге мы нужного сотрудника уже никогда не найдем.
Временное решение - модифицировать в стандартном компоненте файл /bitrix/components/bitrix/intranet.user.selector.new/ajax.php :
| Код |
|---|
// 20141027 - замена кода
// $arFilter = array(
// array(
// 'LOGIC' => 'OR',
// '%NAME' => preg_split('/\s+/', trim($search)),
// '%LAST_NAME' => preg_split('/\s+/', trim($search)),
// '%SECOND_NAME' => preg_split('/\s+/', trim($search)),
// '%EMAIL' => $search,
// '%LOGIN' => $search
// )
// );
// 20141027 - новый код
$arSearch = preg_split('/\s+/', trim($search));
$countWords = count($arSearch);
$lastSymbol = substr($search, strlen($search)-1, 1);
if ($countWords == 2 || ($countWords == 1 && $lastSymbol == " "))
{
$arFilter = array(
array(
'LOGIC' => 'AND',
'LAST_NAME' => $arSearch[0],
)
);
if ($countWords == 2)
$arFilter['%NAME'] = $arSearch[1];
}
else
{
$arFilter = array(
array(
'LOGIC' => 'OR',
'%NAME' => preg_split('/\s+/', trim($search)),
'%LAST_NAME' => preg_split('/\s+/', trim($search)),
'%SECOND_NAME' => preg_split('/\s+/', trim($search)),
'%EMAIL' => $search,
'%LOGIN' => $search
)
);
}
// 20141027 - конец замены кода
|
В данном случае будет важен порядок ввода ФИО: сначала - фамилия, потом - имя, отчество. Но у нас и так все ищут по фамилии

Может кто-то предложит правильное и быстрое решение этой проблемы?