RegisterForm.php 6.47 KB
<?php

namespace frontend\modules\user\models\form;

use Yii;
use yii\log\Logger;
use yii\helpers\ArrayHelper;
//
use frontend\modules\user\models\{
    User, Group, Profile
};

/**
 * Class RegisterForm
 *
 * @package frontend\modules\user\models\form
 * @author FilamentV <vortex.filament@gmail.com>
 * @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;
    }
}