Задача: Вывести в форму авторизации поля в собственном порядке, убрать поле Логин, вместо него сделать Email. Добавить пользовательское поле.

Работем с компонентом main.register. В нём есть несколько проблем.

  1. Обязательно выводится поле Логин
  2. Сначала выводятся обязательные поля: Логин, Пароль, Подтверждение пароля и Email, потом все остальные
  3. Пользовательские поля выводятся, но не сохраняются

Для решения этих проблем будем кастомизировать компонент.

  1. Копируем его в /local/components/bitrix/main.register
  2. В параметры вызова компонента добавим новый параметр, который будет содержать нужный нам порядок полей
  3. "FIELDS_ORDER" => Array(
    
    "NAME", 
    
    "LAST_NAME", 
    
    "PERSONAL_PHONE", 
    
    "EMAIL", 
    
    "PASSWORD", 
    
    "CONFIRM_PASSWORD", 
    
    "PERSONAL_CITY",
    
    "PERSONAL_STREET"
    
    ),
  4. В компоненте заменяем обязательный логин на обязательный email

    $arDefaultFields = array(
    	//"LOGIN",
    	"EMAIL"
    );
    /*if($arResult["EMAIL_REQUIRED"])
    {
    	$arDefaultFields[] = "EMAIL";
    }*/
    
  5. Меняем порядок полей, исходя из нового параметра. Кастомный порядок будет храниться в отдельной переменной массива $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"];
    }
    
  6. Добавляем обработку пользовательских полей в этот блок кода

    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");
    }
    

После этого регистрация работает, как надо, останется только добавить новый параметр в параметры компонента, если вдруг кому-то захочется менять его настройки из публичной части.