Задача: Вывести в форму авторизации поля в собственном порядке, убрать поле Логин, вместо него сделать Email. Добавить пользовательское поле.
Работем с компонентом main.register. В нём есть несколько проблем.
- Обязательно выводится поле Логин
- Сначала выводятся обязательные поля: Логин, Пароль, Подтверждение пароля и Email, потом все остальные
- Пользовательские поля выводятся, но не сохраняются
Для решения этих проблем будем кастомизировать компонент.
- Копируем его в /local/components/bitrix/main.register
- В параметры вызова компонента добавим новый параметр, который будет содержать нужный нам порядок полей
-
"FIELDS_ORDER" => Array( "NAME", "LAST_NAME", "PERSONAL_PHONE", "EMAIL", "PASSWORD", "CONFIRM_PASSWORD", "PERSONAL_CITY", "PERSONAL_STREET" ),
-
В компоненте заменяем обязательный логин на обязательный email
$arDefaultFields = array( //"LOGIN", "EMAIL" ); /*if($arResult["EMAIL_REQUIRED"]) { $arDefaultFields[] = "EMAIL"; }*/
-
Меняем порядок полей, исходя из нового параметра. Кастомный порядок будет храниться в отдельной переменной массива $arResult. Также, если в FIELDS_ORDER указаны не все выводимые поля, то их мы тоже добавляем в самый конец.
$arResult["SHOW_FIELDS_REPACK"] = []; if(!empty($arParams["FIELDS_ORDER"])){ foreach ($arResult["SHOW_FIELDS"] as $value) { if(!in_array($value, $arParams["FIELDS_ORDER"])){ $arParams["FIELDS_ORDER"][] = $value; } } $arResult["SHOW_FIELDS_REPACK"] = $arParams["FIELDS_ORDER"]; }
-
Добавляем обработку пользовательских полей в этот блок кода
if ($key != "PERSONAL_PHOTO" && $key != "WORK_LOGO") { $arResult["VALUES"][$key] = $_REQUEST["REGISTER"][$key]; //userfields не передаются по умолчанию foreach($arParams["USER_PROPERTY"] as $ufProp){ $arResult["VALUES"][$ufProp] = $_REQUEST[$ufProp]; } if (in_array($key, $arResult["REQUIRED_FIELDS"]) && trim($arResult["VALUES"][$key]) == '') $arResult["ERRORS"][$key] = GetMessage("REGISTER_FIELD_REQUIRED"); }
После этого регистрация работает, как надо, останется только добавить новый параметр в параметры компонента, если вдруг кому-то захочется менять его настройки из публичной части.