Существует необходимость регулярного обновления данных о пользователях на сайте. Все бы ничего, есть нам CSV импорт и даже работает ( ну только группы не понимает ), а проблема вот в чем.
При повторной загрузке файла, логичным было бы по логину, xml_id юзера или накрайняк e-mail обновить данные у существующих, но не тут то было.
Битрикс создает клонов в виде Логин+1, т.е был Вася Пупкин, а стал Вася Пупкин1
Кто сталкивался, где и как ткнуть его в перезапись данных а не добавление новых?
Столкнулся с подобной задачей, а именно появилась необходимость обновить значения пользовательского поля для набора пользователей. Для этого использовал стандартный функционал "Импорта пользователей" (из CSV-файла) и событие OnBeforeUserAdd, в котором проверяется наличие некоторого набора полей файла и выполняется Update пользовательской записи.
AddEventHandler('main', 'OnBeforeUserAdd', 'OnBeforeUserAddHandler');
function OnBeforeUserAddHandler(&$arFields) {
global $APPLICATION;
if (isset($arFields['UF_CLIENT_CODE']) && isset($arFields['ID']) && isset($arFields['LOGIN']) && isset($arFields['EMAIL'])) {
$rsUser = CUser::GetList(($by = 'ID'), ($order = 'desc'), array('ID' => $arFields['ID'], 'EMAIL' => $arFields['EMAIL'], 'LOGIN' => $arFields['LOGIN']), array('ID'));
if ($rsUser->SelectedRowsCount() == 1) {
if ($arUser = $rsUser->GetNext()) {
$oUser = new CUser;
if (!$oUser->Update($arUser['ID'], array('UF_CLIENT_CODE' => $arFields['UF_CLIENT_CODE']))) {
AddMessage2Log("\n" . $oUser->LAST_ERROR, 'main');
$APPLICATION->throwException("Не удалось обновить параметры пользователя.");
}
}
}
AddMessage2Log("\n" . var_export($arFields, true), 'main');
$APPLICATION->throwException("Отмена создания пользователя.<br />");
return false;
}
}
Для того, чтобы не создавались "дубли" пользователей достаточно:
Цитата
Для отмены добавления и прекращении выполнения метода CUser::Add необходимо в функции-обработчике создать исключение методом $APPLICATION->ThrowException() и вернуть false.
По завершению импорта пользователей получаем множество сообщений об ошибках:
Код
- -: Пользователь с логином "login-a" уже существует.
Отмена создания пользователя.
- -: Пользователь с логином "login-b" уже существует.
Отмена создания пользователя.
- -: Пользователь с логином "login-c" уже существует.
Отмена создания пользователя.
Импорт окончен
Импортировано пользователей: 0
Несмотря на это, значения требуемого пользовательского поля загружены.
Буду рад, если укажите на какие-либо ошибки или другие варианты решения поставленной задачи.
Дмитрий, попробовал модифицировать ваш пример, чтобы пользователи изменялись или же добавлялись, если их в базе нет. Но почему-то финальный return false; срабатывает только с одного места в коде, вконце верхнего if'а (как у вас в примере).
вот мой код не работает (дублирует юзеров)
Код
AddEventHandler('main', 'OnBeforeUserAdd', 'OnBeforeUserAddHandler');
function OnBeforeUserAddHandler(&$arFields) {
global $APPLICATION;
if (isset($arFields['LOGIN'])) {
$rsUser = CUser::GetList(($by = 'LOGIN'), ($order = 'desc'), array('LOGIN' => $arFields['LOGIN']), array('ID'));
if ($rsUser->SelectedRowsCount() == 1) {
if ($arUser = $rsUser->GetNext()) {
$oUser = new CUser;
$oUser->Update($arUser['ID'], array('UF_SCORE' => $arFields['UF_SCORE']));
$APPLICATION->throwException("skip=".$skip);
return false;
}
}
}
}
Евгений Чернышёв пишет: Дмитрий, попробовал модифицировать ваш пример, чтобы пользователи изменялись или же добавлялись, если их в базе нет. Но почему-то финальный return false; срабатывает только с одного места в коде, вконце верхнего if'а
На первый взгляд в коде ошибок не видно. Попробуйте пройти по шагам обработчика и выполнить логирование с помощью AddMessage2Log().