* @copyright (c), Thread */ class RegisterForm extends \yii\base\Model { public $rememberMe = true; public $first_name, $last_name; public $username, $email, $password, $password_confirmation; public $phone, $company, $website; // protected $_password_min_length, $_username_attribute, $_auto_login_after_register, $_time_remember_user_sign_in; /** * */ public function init() { parent::init(); /** * @var $module \frontend\modules\user\User */ $module = Yii::$app->getModule('user'); $this->_password_min_length = $module->password_min_length; $this->_username_attribute = $module->username_attribute; $this->_auto_login_after_register = $module->auto_login_after_register; $this->_time_remember_user_sign_in = $module->time_remember_user_sign_in; } /** * @return array */ public function rules() { $rules = [ [['first_name', 'last_name', 'company'], 'required'], [['password', 'password_confirmation'], 'required'], [['password', 'password_confirmation'], 'string', 'min' => $this->_password_min_length], [['captcha'], 'captcha'], [['first_name', 'last_name', 'company', 'website'], 'string', 'min' => 1, 'max' => 100], [ ['password_confirmation'], 'compare', 'compareAttribute' => 'password', 'when' => function ($model) { return trim($model->password) !== ''; }, 'whenClient' => "function (attribute, value) { return ($('input[name=\"RegisterForm[password]\"]').val() !== \"\"); }" ], ['email', 'trim'], ['email', 'email'], ['email', 'unique', 'targetClass' => '\frontend\modules\user\models\User', 'on' => ['register'] ], ]; // if ($this->_username_attribute === 'email') { $rules[] = [['email'], 'required']; } elseif ($this->_username_attribute === 'username') { $rules[] = [['username'], 'required']; } // return $rules; } /** * @return array */ public function scenarios() { return [ 'register' => ['first_name', 'last_name', 'username', 'email', 'password', 'password_confirmation', 'company', 'website'], 'signIn' => ['username', 'email', 'password', 'rememberMe'], ]; } /** * @return array */ public function attributeLabels() { return [ 'first_name' => Yii::t('user', 'First name'), 'last_name' => Yii::t('user', 'Last name'), // 'username' => Yii::t('user', 'Username'), 'password' => Yii::t('user', 'Password'), 'password_confirmation' => Yii::t('user', 'Password confirmation'), 'email' => Yii::t('app', 'Email'), 'rememberMe' => Yii::t('user', 'Remember me'), 'company' => Yii::t('front', 'Company'), 'website' => Yii::t('front', 'Website'), 'phone' => Yii::t('front', 'Phone'), ]; } /** * @return bool */ public function addUser() { if (empty($this->username)) { $this->username = 'login' . uniqid(); } $model = new User([ 'scenario' => 'userCreate', 'username' => $this->username, 'email' => $this->email, 'published' => User::STATUS_KEY_OFF, 'group_id' => Group::USER, ]); $model->setPassword($this->password)->generateAuthKey(); if ($model->validate()) { /** @var $transaction */ $transaction = User::getDb()->beginTransaction(); try { $save = $model->save(); if ($save) { $transaction->commit(); return $this->addProfile($model->id); } else { $transaction->rollBack(); return false; } } catch (\Exception $e) { Yii::getLogger()->log($e->getMessage(), Logger::LEVEL_ERROR); $transaction->rollBack(); } } else { $this->addErrors($model->getErrors()); return false; } } /** * @param $userId * @return bool * @throws \Exception */ private function addProfile($userId) { $model = new Profile([ 'scenario' => 'basicCreate', 'user_id' => $userId, 'first_name' => $this->first_name??'', 'last_name' => $this->last_name??'', 'company' => $this->company??'', 'website' => $this->website??'', 'phone' => $this->phone??'', ]); if ($model->validate()) { /** @var $transaction */ $transaction = User::getDb()->beginTransaction(); try { $save = $model->save(); ($save) ? $transaction->commit() : $transaction->rollBack(); return $save; } catch (\Exception $e) { $transaction->rollBack(); throw new \Exception($e); } } else { $this->addErrors($model->getErrors()); return false; } } /** * @return bool */ public function login() { if ($this->validate()) { return Yii::$app->getUser()->login($this->getUser(), $this->rememberMe ? $this->_time_remember_user_sign_in : 0); } else { return false; } } /** * @return User|null */ public function getUser() { return ($this->_username_attribute === 'username') ? User::findByUsername($this->username) : User::findByEmail($this->email); } /** * @return string */ public function getUsernameAttribute() { return $this->_username_attribute; } /** * @return bool */ public function getAutoLoginAfterRegister() { return $this->_auto_login_after_register; } }