SignInForm.php 3.64 KB
<?php

namespace frontend\modules\user\models\form;

use Yii;
//
use frontend\modules\user\models\{
    Group, User
};

/**
 * Class SignInForm
 *
 * @package frontend\modules\user\models\form
 * @author FilamentV <vortex.filament@gmail.com>
 * @copyright (c), Thread
 */
class SignInForm extends \yii\base\Model
{
    public $rememberMe = true;
    public $username, $email, $password;
    //
    const FLASH_KEY = 'SignInForm';
    public $ONLY_ADMIN = false;
    /**
     * @var User
     */
    private $_user = null;
    protected $_username_attribute, $_time_remember_user_sign_in;

    /**
     *
     */
    public function init()
    {
        parent::init();
        /**
         * @var $module \frontend\modules\user\User
         */
        $module = Yii::$app->getModule('user');

        $this->_time_remember_user_sign_in = $module->time_remember_user_sign_in;
        $this->_username_attribute = $module->username_attribute;
    }

    /**
     * @return boolean
     */
    public function login()
    {
        if ($this->validate()) {
            $user = $this->getUser();
            if ($user !== null && $this->ONLY_ADMIN === true) {
                if ($user['group_id'] != Group::ADMIN) {
                    $this->addError($this->password, Yii::t('user', 'User access is prohibited'));
                }
            }
            if ($this->validatePassword()) {
                return Yii::$app->getUser()->login($user, $this->rememberMe ? $this->_time_remember_user_sign_in : 0);
            } else {
                $this->addError($this->password, Yii::t('user', 'Incorrect username or password'));
            }
        }
        return false;
    }

    /**
     * @return array
     */
    public function scenarios()
    {
        return ['signIn' => ['username', 'email', 'password', 'rememberMe']];
    }

    /**
     * @return array
     */
    public function rules()
    {
        $rules = [
            [['password'], 'required'],
            [['rememberMe'], 'boolean'],
            [['password'], 'validatePassword'],
            ['email', 'trim'],
            ['email', 'email'],

        ];
        //
        if ($this->_username_attribute === 'email') {
            $rules[] = [['email'], 'required'];
        } elseif ($this->_username_attribute === 'username') {
            $rules[] = [['username'], 'required'];
        }
        //
        return $rules;
    }

    /**
     * @return array
     */
    public function attributeLabels()
    {
        return [
            'username' => Yii::t('user', 'Username'),
            'password' => Yii::t('user', 'Password'),
            'email' => Yii::t('app', 'Email'),
            'rememberMe' => Yii::t('user', 'Remember me'),
        ];
    }

    /**
     * @return bool
     */
    public function validatePassword()
    {
        if (!$this->hasErrors()) {
            $user = $this->getUser();
            if ($user['published'] == Group::STATUS_KEY_OFF) {
                $this->addError('published', Yii::t('app', 'your account is blocked'));
                return false;
            }
            if (!$user || !$user->validatePassword($this->password)) {
                $this->addError('password', Yii::t('user', 'Incorrect username or password'));
                return false;
            } else {
                return true;
            }
        }
    }

    /**
     * @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;
    }
}