Компонент "intranet.user.selector.new" активно используется в портале, а мы его используем еще и в своих новых компонентах. И вот после обновления портала получили "сюрприз". Если сотрудников много (а у нас их очень много ), то пользователь не может найти сотрудника с популярной подстрокой в ФИО. Например, "михайлов". В нашем случае много "михайлович"-ей, "алексеевичей", "александр"-ов и "александр"-овичей. И ни при каких комбинациях невозможно найти "михайлов александр алексеевич".
Почему?
В новой версии компонента вендор начал использовать ORM. И, соответственно, немного поменялся результирующий запрос:
В компоненте, к тому же, зашито ограничение на выборку первых 10 совпадений. И в итоге мы нужного сотрудника уже никогда не найдем.
Временное решение - модифицировать в стандартном компоненте файл /bitrix/components/bitrix/intranet.user.selector.new/ajax.php :
В данном случае будет важен порядок ввода ФИО: сначала - фамилия, потом - имя, отчество. Но у нас и так все ищут по фамилии
Может кто-то предложит правильное и быстрое решение этой проблемы?
Почему?
В новой версии компонента вендор начал использовать 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 |
Временное решение - модифицировать в стандартном компоненте файл /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 - конец замены кода |
В данном случае будет важен порядок ввода ФИО: сначала - фамилия, потом - имя, отчество. Но у нас и так все ищут по фамилии
Может кто-то предложит правильное и быстрое решение этой проблемы?