413 lines
15 KiB
PHP
413 lines
15 KiB
PHP
|
<?php
|
|||
|
|
|||
|
namespace frontend\modules\user\models;
|
|||
|
|
|||
|
use common\components\AttachmentManager;
|
|||
|
use common\components\attachmentSaveHandler\QuestionaryAttachmentSaveHandler;
|
|||
|
use common\components\changeHistoryHandler\QuestionaryActiveRecordChangeHistoryHandler;
|
|||
|
use common\components\PageRelationManager;
|
|||
|
use common\components\RegularExpressionPasswordManager\RegularExpressionPasswordManager;
|
|||
|
use common\components\RegulationManager;
|
|||
|
use common\components\RegulationRelationManager;
|
|||
|
use common\components\UserEmailConfirmTokenManager;
|
|||
|
use common\models\Attachment;
|
|||
|
use common\models\attachment\attachmentCollection\ActiveFormAttachmentCollection;
|
|||
|
use common\models\AttachmentType;
|
|||
|
use common\models\Recaptcha;
|
|||
|
use common\models\settings\AuthSetting;
|
|||
|
use common\models\User;
|
|||
|
use common\models\UserRegulation;
|
|||
|
use common\modules\abiturient\models\PassportData;
|
|||
|
use common\modules\abiturient\models\PersonalData;
|
|||
|
use common\modules\abiturient\models\repositories\FileRepository;
|
|||
|
use common\modules\abiturient\models\repositories\RegulationRepository;
|
|||
|
use Throwable;
|
|||
|
use Yii;
|
|||
|
use yii\base\Model;
|
|||
|
use yii\base\UserException;
|
|||
|
use yii\db\ActiveQuery;
|
|||
|
use yii\db\Exception;
|
|||
|
use yii\helpers\ArrayHelper;
|
|||
|
use yii\helpers\Url;
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
class AbiturientSignupForm extends Model
|
|||
|
{
|
|||
|
public $email;
|
|||
|
public $password;
|
|||
|
public $username;
|
|||
|
public $confirm_email;
|
|||
|
public $confirm_password;
|
|||
|
public $contragent;
|
|||
|
|
|||
|
public $reCaptcha;
|
|||
|
|
|||
|
|
|||
|
public $passportData;
|
|||
|
public $country_id;
|
|||
|
public $lastname;
|
|||
|
public $firstname;
|
|||
|
public $middlename;
|
|||
|
public $birthday;
|
|||
|
|
|||
|
|
|||
|
public $attachments;
|
|||
|
|
|||
|
|
|||
|
public $regulations;
|
|||
|
|
|||
|
|
|||
|
private $user;
|
|||
|
|
|||
|
public function __construct($config = [])
|
|||
|
{
|
|||
|
parent::__construct($config);
|
|||
|
|
|||
|
$this->initializeUser();
|
|||
|
|
|||
|
$attachments = $this->getAttachmentsToSave();
|
|||
|
|
|||
|
FileRepository::SortCollection($attachments);
|
|||
|
|
|||
|
$regulations_to_add = RegulationRepository::GetNotExistingRegulationsForEntity(RegulationRelationManager::RELATED_ENTITY_REGISTRATION, []);
|
|||
|
$regulations = [];
|
|||
|
foreach ($regulations_to_add as $regulation) {
|
|||
|
$userRegulation = new UserRegulation();
|
|||
|
$userRegulation->regulation_id = $regulation->id;
|
|||
|
$userRegulation->setRawOwner($this->user);
|
|||
|
$regulations[] = $userRegulation;
|
|||
|
if ($userRegulation->regulation->attachment_type !== null && !$userRegulation->getAttachments()->exists()) {
|
|||
|
$regulationAttachment = new Attachment();
|
|||
|
$regulationAttachment->attachment_type_id = $regulation->attachment_type;
|
|||
|
$userRegulation->setRawAttachment($regulationAttachment);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
ArrayHelper::multisort($regulations, 'regulation_id', SORT_ASC, SORT_NUMERIC);
|
|||
|
$regulations = ArrayHelper::index($regulations, 'regulation_id');
|
|||
|
$this->regulations = $regulations;
|
|||
|
$this->attachments = $attachments;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
public function rules()
|
|||
|
{
|
|||
|
$minimalPasswordLength = Yii::$app->configurationManager->getMinimalPasswordLength();
|
|||
|
|
|||
|
$passwordMustContainNumbers = Yii::$app->configurationManager->getPasswordMustContainNumbers();
|
|||
|
$passwordMustContainCapitalLetters = Yii::$app->configurationManager->getPasswordMustContainCapitalLetters();
|
|||
|
$passwordMustContainSpecialCharacters = Yii::$app->configurationManager->getPasswordMustContainSpecialCharacters();
|
|||
|
|
|||
|
$signupPasswordConfirm = Yii::$app->configurationManager->getSignupPasswordConfirm();
|
|||
|
|
|||
|
$rules = [
|
|||
|
[
|
|||
|
'username',
|
|||
|
'filter',
|
|||
|
'filter' => 'trim'
|
|||
|
],
|
|||
|
[
|
|||
|
'username',
|
|||
|
'unique',
|
|||
|
'targetClass' => User::class,
|
|||
|
'message' => Yii::t(
|
|||
|
'sign-in/abiturient-signup/form',
|
|||
|
'Подсказка с ошибкой для поля "username" на форме регистрации: `Это имя пользователя уже занято`'
|
|||
|
)
|
|||
|
],
|
|||
|
[
|
|||
|
'username',
|
|||
|
'string',
|
|||
|
'min' => 2,
|
|||
|
'max' => 255
|
|||
|
],
|
|||
|
|
|||
|
[
|
|||
|
'email',
|
|||
|
'filter',
|
|||
|
'filter' => 'trim'
|
|||
|
],
|
|||
|
[
|
|||
|
'email',
|
|||
|
'email'
|
|||
|
],
|
|||
|
[
|
|||
|
'email',
|
|||
|
'unique',
|
|||
|
'targetClass' => User::class,
|
|||
|
'message' => Yii::t(
|
|||
|
'sign-in/abiturient-signup/form',
|
|||
|
'Подсказка с ошибкой для поля "email" на форме регистрации: `Этот адрес электронной почты уже занят. <a href="{url}">Восстановить пароль.</a>`',
|
|||
|
['url' => Url::to('/user/sign-in/request-password-reset')]
|
|||
|
)
|
|||
|
],
|
|||
|
[
|
|||
|
'password',
|
|||
|
'required'
|
|||
|
],
|
|||
|
[
|
|||
|
'password',
|
|||
|
'string',
|
|||
|
'min' => $minimalPasswordLength
|
|||
|
],
|
|||
|
[
|
|||
|
[
|
|||
|
'firstname',
|
|||
|
'lastname',
|
|||
|
'birthday',
|
|||
|
'country_id',
|
|||
|
'username',
|
|||
|
'email',
|
|||
|
'firstname'
|
|||
|
],
|
|||
|
'required',
|
|||
|
'whenClient' => 'function(){return true}'
|
|||
|
],
|
|||
|
[
|
|||
|
[
|
|||
|
'firstname',
|
|||
|
'lastname',
|
|||
|
'middlename',
|
|||
|
'birthday'
|
|||
|
],
|
|||
|
'string',
|
|||
|
'max' => 255
|
|||
|
],
|
|||
|
[
|
|||
|
'birthday',
|
|||
|
'date',
|
|||
|
'max' => PersonalData::getMaxBirthdateForValidator(),
|
|||
|
'tooBig' => Yii::t(
|
|||
|
'sign-in/abiturient-signup/form',
|
|||
|
'Подсказка с ошибкой для поля "birthday" на форме регистрации: `Минимальный возраст поступающего при регистрации: {max}`'
|
|||
|
),
|
|||
|
'maxString' => \Yii::$app->configurationManager->getCode('min_age'),
|
|||
|
'format' => 'd.m.Y'
|
|||
|
]
|
|||
|
];
|
|||
|
|
|||
|
if (Yii::$app->configurationManager->getCode('confirm-email') === '1') {
|
|||
|
$rules[] = [
|
|||
|
'confirm_email',
|
|||
|
'email',
|
|||
|
];
|
|||
|
$rules[] = [
|
|||
|
'confirm_email',
|
|||
|
'compare',
|
|||
|
'compareAttribute' => 'email',
|
|||
|
'message' => Yii::t(
|
|||
|
'sign-in/abiturient-signup/form',
|
|||
|
'Подсказка с ошибкой для поля "confirm_email" на форме регистрации: `Электронные адреса не совпадают`'
|
|||
|
),
|
|||
|
];
|
|||
|
$rules[] = [
|
|||
|
'confirm_email',
|
|||
|
'required',
|
|||
|
];
|
|||
|
}
|
|||
|
|
|||
|
if ($signupPasswordConfirm) {
|
|||
|
$rules[] = [
|
|||
|
'confirm_password',
|
|||
|
'string',
|
|||
|
'min' => $minimalPasswordLength
|
|||
|
];
|
|||
|
$rules[] = [
|
|||
|
'confirm_password',
|
|||
|
'compare',
|
|||
|
'compareAttribute' => 'password',
|
|||
|
'message' => Yii::t(
|
|||
|
'sign-in/abiturient-signup/form',
|
|||
|
'Подсказка с ошибкой для поля "confirm_password" на форме регистрации: `Пароли не совпадают`'
|
|||
|
),
|
|||
|
];
|
|||
|
$rules[] = [
|
|||
|
'confirm_password',
|
|||
|
'required'
|
|||
|
];
|
|||
|
}
|
|||
|
|
|||
|
if (
|
|||
|
$passwordMustContainNumbers ||
|
|||
|
$passwordMustContainCapitalLetters ||
|
|||
|
$passwordMustContainSpecialCharacters
|
|||
|
) {
|
|||
|
[
|
|||
|
|
|||
|
'charList' => $charList,
|
|||
|
|
|||
|
'matchPattern' => $matchPattern,
|
|||
|
] = RegularExpressionPasswordManager::buildRegex(
|
|||
|
$passwordMustContainNumbers,
|
|||
|
$passwordMustContainCapitalLetters,
|
|||
|
$passwordMustContainSpecialCharacters
|
|||
|
);
|
|||
|
|
|||
|
$message = Yii::t(
|
|||
|
'sign-in/abiturient-signup/form',
|
|||
|
'Подсказка с ошибкой поле "password" не удовлетворяет минимальным требованием символов на форме регистрации: `Пароль должен содержать: {charList}`',
|
|||
|
['charList' => implode(', ', $charList)]
|
|||
|
);
|
|||
|
$rules[] = [
|
|||
|
'password', 'match', 'pattern' => $matchPattern,
|
|||
|
'message' => $message,
|
|||
|
];
|
|||
|
if ($signupPasswordConfirm) {
|
|||
|
$rules[] = [
|
|||
|
'confirm_password', 'match', 'pattern' => $matchPattern,
|
|||
|
'message' => $message,
|
|||
|
];
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
$canNotInputLatinFio = AuthSetting::findOne(['name' => 'can_not_input_latin_fio']);
|
|||
|
if ($canNotInputLatinFio && !empty($canNotInputLatinFio->value)) {
|
|||
|
$rules[] = [['firstname', 'lastname', 'middlename'], 'match', 'pattern' => '/^[^a-zA-Z]+$/i'];
|
|||
|
}
|
|||
|
|
|||
|
$validator = Recaptcha::getValidationArrayByName('signup');
|
|||
|
if (!empty($validator)) {
|
|||
|
$rules[] = $validator;
|
|||
|
}
|
|||
|
|
|||
|
return $rules;
|
|||
|
}
|
|||
|
|
|||
|
public function attributeLabels()
|
|||
|
{
|
|||
|
return [
|
|||
|
'email' => Yii::t('sign-in/abiturient-signup/form', 'Подпись поля "email" на форме регистрации: `E-mail`'),
|
|||
|
'birthday' => Yii::t('sign-in/abiturient-signup/form', 'Подпись поля "birthday" на форме регистрации: `Дата рождения`'),
|
|||
|
'lastname' => Yii::t('sign-in/abiturient-signup/form', 'Подпись поля "lastname" на форме регистрации: `Фамилия`'),
|
|||
|
'password' => Yii::t('sign-in/abiturient-signup/form', 'Подпись поля "password" на форме регистрации: `Пароль`'),
|
|||
|
'username' => Yii::t('sign-in/abiturient-signup/form', 'Подпись поля "username" на форме регистрации: `Имя пользователя`'),
|
|||
|
'firstname' => Yii::t('sign-in/abiturient-signup/form', 'Подпись поля "firstname" на форме регистрации: `Имя`'),
|
|||
|
'middlename' => Yii::t('sign-in/abiturient-signup/form', 'Подпись поля "middlename" на форме регистрации: `Отчество`'),
|
|||
|
'country_id' => Yii::t('sign-in/abiturient-signup/form', 'Подпись поля "country_id" на форме регистрации: `Гражданство`'),
|
|||
|
'confirm_email' => Yii::t('sign-in/abiturient-signup/form', 'Подпись поля "confirm_email" на форме регистрации: `Повторите E-mail`'),
|
|||
|
'confirm_password' => Yii::t('sign-in/abiturient-signup/form', 'Подпись поля "confirm_password" на форме регистрации: `Повторите пароль`'),
|
|||
|
];
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
public function signup()
|
|||
|
{
|
|||
|
$this->username = $this->email;
|
|||
|
|
|||
|
if ($this->validate() && $this->passportData->validate()) {
|
|||
|
$transaction = Yii::$app->db->beginTransaction();
|
|||
|
if (!isset($transaction)) {
|
|||
|
throw new UserException(
|
|||
|
Yii::t(
|
|||
|
'sign-in/abiturient-signup/form',
|
|||
|
'Сообщение об ошибке на форме авторизации: `Ошибка создания транзакции`'
|
|||
|
)
|
|||
|
);
|
|||
|
}
|
|||
|
try {
|
|||
|
$user = $this->user;
|
|||
|
$user->username = $this->username;
|
|||
|
$user->email = $this->email;
|
|||
|
$user->setPassword($this->password);
|
|||
|
if ($user->save()) {
|
|||
|
|
|||
|
if (Yii::$app->configurationManager->getSignupEmailConfirm()) {
|
|||
|
$token = UserEmailConfirmTokenManager::createUserEmailConfirmToken($user);
|
|||
|
Yii::$app->notifier->notifyAboutEmailConfirmation($user, $token);
|
|||
|
} else {
|
|||
|
|
|||
|
$user->addUserRegistrationConfirm();
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
$user->afterAbitSignup([
|
|||
|
'passportData' => $this->passportData,
|
|||
|
'lastname' => $this->lastname,
|
|||
|
'firstname' => $this->firstname,
|
|||
|
'middlename' => $this->middlename,
|
|||
|
'birthday' => $this->birthday,
|
|||
|
'password' => $this->password,
|
|||
|
'country_id' => $this->country_id,
|
|||
|
'contragent' => $this->contragent
|
|||
|
]);
|
|||
|
|
|||
|
foreach ($this->regulations as $regulation) {
|
|||
|
$regulation->owner_id = $user->id;
|
|||
|
$regulation->setChangeHistoryHandler(new QuestionaryActiveRecordChangeHistoryHandler($regulation));
|
|||
|
$regulation->getChangeHistoryHandler()->setInitiator($user);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
foreach ($this->attachments as $attachment) {
|
|||
|
$attachment->setAttachmentSaveHandler(new QuestionaryAttachmentSaveHandler($attachment, $user->abiturientQuestionary));
|
|||
|
$attachment->getAttachmentSaveHandler()->setHistoryInitiator($user);
|
|||
|
}
|
|||
|
|
|||
|
RegulationManager::handleRegulations($this->regulations, Yii::$app->request);
|
|||
|
AttachmentManager::handleAttachmentUpload($this->attachments, $this->regulations);
|
|||
|
|
|||
|
$transaction->commit();
|
|||
|
|
|||
|
return $user;
|
|||
|
}
|
|||
|
$transaction->rollBack();
|
|||
|
|
|||
|
} catch (Throwable $e) {
|
|||
|
$transaction->rollBack();
|
|||
|
Yii::error("Ошибка при регистрации поступающего: {$e->getMessage()}");
|
|||
|
throw $e;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
return null;
|
|||
|
}
|
|||
|
|
|||
|
public function checkUnique()
|
|||
|
{
|
|||
|
return Yii::$app->authentication1CManager->checkAbiturientRegistration(
|
|||
|
$this->passportData->number,
|
|||
|
$this->passportData->series,
|
|||
|
$this->lastname,
|
|||
|
$this->firstname,
|
|||
|
$this->middlename,
|
|||
|
$this->email,
|
|||
|
$this->birthday
|
|||
|
);
|
|||
|
}
|
|||
|
|
|||
|
public function getAttachmentTypes(): ActiveQuery
|
|||
|
{
|
|||
|
return AttachmentType::GetCommonAttachmentTypesQuery(PageRelationManager::RELATED_ENTITY_REGISTRATION);
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
public function getAttachmentsToSave()
|
|||
|
{
|
|||
|
$res = [];
|
|||
|
foreach ($this->getAttachmentTypes()->all() as $attachmentType) {
|
|||
|
$res[$attachmentType->id] = new ActiveFormAttachmentCollection($attachmentType, $this->user);
|
|||
|
}
|
|||
|
return $res;
|
|||
|
}
|
|||
|
|
|||
|
private function initializeUser()
|
|||
|
{
|
|||
|
$this->user = new User();
|
|||
|
}
|
|||
|
}
|