getRequest(); // 1. Обработка AJAX регистрации if ($request->isPost() && $request->get('ajax_reg') == 'y') { $this->handleRegister($request); return; } // 2. Подготовка данных для формы через InternalDataTrait $geo = Api::getGeoForComponent(); $this->arResult['COUNTRIES'] = $geo['countries']; $this->arResult['CITIES'] = $geo['cities']; $this->arResult['SPECIALTIES'] = Api::getSpecialtiesForComponent(); $this->includeComponentTemplate(); } private function handleRegister($req) { $GLOBALS['APPLICATION']->RestartBuffer(); header('Content-Type: application/json'); if (!check_bitrix_sessid()) { echo json_encode(['status' => 'error', 'message' => 'Сессия истекла']); die(); } $email = trim($req->getPost("email")); if(!check_email($email)) die(json_encode(['status'=>'error','message'=>'Некорректный Email'])); $by = "ID"; $order = "ASC"; if(\CUser::GetList($by, $order, ["=EMAIL" => $email])->Fetch()) { die(json_encode(['status'=>'error','message'=>'Email уже занят'])); } $pass = $req->getPost("password"); // Теперь этот вызов сработает, так как метод PUBLIC $v = Api::validatePassword($pass); if($v !== true) die(json_encode(['status'=>'error','message'=>$v])); $arGroups = [2, 3, 4]; $specCode = $req->getPost("specialty"); if (!empty($specCode)) { $rsGroup = \Bitrix\Main\GroupTable::getList(['filter' => ['=STRING_ID' => $specCode, '=ACTIVE' => 'Y'], 'select' => ['ID']])->fetch(); if ($rsGroup) $arGroups[] = $rsGroup['ID']; } $user = new \CUser; $uid = $user->Add([ "LOGIN" => $email, "EMAIL" => $email, "NAME" => $req->getPost("name"), "LAST_NAME" => $req->getPost("last_name"), "SECOND_NAME" => $req->getPost("second_name"), "PERSONAL_PHONE" => $req->getPost("phone"), "PERSONAL_CITY" => $req->getPost("city"), "PERSONAL_COUNTRY" => $req->getPost("country"), "PASSWORD" => $pass, "CONFIRM_PASSWORD" => $pass, "ACTIVE" => "Y", "GROUP_ID" => $arGroups ]); if($uid) { $needConfirm = Option::get("main", "new_user_registration_email_confirmation", "N"); if ($needConfirm !== "Y") { global $USER; $USER->Authorize($uid); } $code = bin2hex(random_bytes(16)); // Теперь этот вызов сработает, так как метод PUBLIC $dcCodes = Api::getHlEntity('sso_codes'); $dcCodes::add([ 'UF_CODE' => $code, 'UF_CLIENT_ID' => 'app_id_site', // Используем ID основного сайта по умолчанию 'UF_USER_ID' => $uid, 'UF_EXPIRES' => DateTime::createFromTimestamp(time() + 60) ]); Api::audit("USER_REGISTERED", "app_id_site", $uid, "Email: ".$email); echo json_encode(['status' => 'success', 'code' => $code]); } else { echo json_encode(['status' => 'error', 'message' => strip_tags($user->LAST_ERROR)]); } die(); } }