Добрый день!
Есть небольшая задача. Имеется у нас некий сайт, на котором авторизация и регистрация происходит при помощи логина и пароля, а нам вдруг захотелось отказаться от логина и регистрировать/авторизовывать человека по емайлу. Предложеные решения на форумах и блогах, с кастомизацией компонентов и скрытием поля при помощи js меня не привлекло и я написал небольшой код, который решает данную проблему.
При переходе на авторизацию по email возникает вопрос, а как быть с теми кто уже зарегистрирован? можно конечно сделать рассылку всем пользователям, что теперь надо авторизовываться по email. Но не все читают почту. Делаем так, добавляем в init.php:
и все! осталось только в шаблонах регистрации и редактирования профиля сделать поле логина hidden.
Старые пользователи смогут заходить как по логинам так и по емайл до следующего редактирования профиля.
Строчку:
можно заменить на любое формирование Логина, например часть емайла до @.
Напрашивается вопрос почему не сделать наоборот, в шаблоне напротив поля логин написать e-mail и пусть вбивают туда свой email, а мы его будем копировать пользователю, но не факт, что пользователь вобьет туда именно емайл, а зачем еще раз писать проверку когда она уже есть в стандартном функционале для поля EMAIL.
P.S.
Закоментированная строчка:
запретит авторизацию по старым логинам.
Минусы - авторизация по емайл будет работать везде, даже при входе в админку. Но это можно обойти если поставить проверку на группу администраторов, например, в обработчиках.
Есть небольшая задача. Имеется у нас некий сайт, на котором авторизация и регистрация происходит при помощи логина и пароля, а нам вдруг захотелось отказаться от логина и регистрировать/авторизовывать человека по емайлу. Предложеные решения на форумах и блогах, с кастомизацией компонентов и скрытием поля при помощи js меня не привлекло и я написал небольшой код, который решает данную проблему.
При переходе на авторизацию по email возникает вопрос, а как быть с теми кто уже зарегистрирован? можно конечно сделать рассылку всем пользователям, что теперь надо авторизовываться по email. Но не все читают почту. Делаем так, добавляем в init.php:
AddEventHandler("main", "OnBeforeUserLogin", Array("CUserEx", "OnBeforeUserLogin")); AddEventHandler("main", "OnBeforeUserRegister", Array("CUserEx", "OnBeforeUserRegister")); AddEventHandler("main", "OnBeforeUserRegister", Array("CUserEx", "OnBeforeUserUpdate")); class CUserEx { function OnBeforeUserLogin($arFields) { $filter = Array("EMAIL" => $arFields["LOGIN"]); $rsUsers = CUser::GetList(($by="LAST_NAME"), ($order="asc"), $filter); if($user = $rsUsers->GetNext()) $arFields["LOGIN"] = $user["LOGIN"]; /*else $arFields["LOGIN"] = "";*/ } function OnBeforeUserRegister($arFields) { $arFields["LOGIN"] = $arFields["EMAIL"]; } } |
и все! осталось только в шаблонах регистрации и редактирования профиля сделать поле логина hidden.
Старые пользователи смогут заходить как по логинам так и по емайл до следующего редактирования профиля.
Строчку:
$arFields["LOGIN"] = $arFields["EMAIL"]; |
можно заменить на любое формирование Логина, например часть емайла до @.
$arr = explode("@",$arFields["EMAIL"]); $arFields["LOGIN"] = $arr[0]; |
Напрашивается вопрос почему не сделать наоборот, в шаблоне напротив поля логин написать e-mail и пусть вбивают туда свой email, а мы его будем копировать пользователю, но не факт, что пользователь вобьет туда именно емайл, а зачем еще раз писать проверку когда она уже есть в стандартном функционале для поля EMAIL.
P.S.
Закоментированная строчка:
/*else $arFields["LOGIN"] = "";*/ |
запретит авторизацию по старым логинам.
Минусы - авторизация по емайл будет работать везде, даже при входе в админку. Но это можно обойти если поставить проверку на группу администраторов, например, в обработчиках.