SignInForm.php 2.21 KB
<?php

namespace thread\modules\user\models\form;

use Yii;
//
use thread\modules\user\models\Group;
use yii\helpers\ArrayHelper;

/**
 * Class SignInForm
 *
 * @package thread\modules\user\models
 * @author FilamentV <vortex.filament@gmail.com>
 * @copyright (c), Thread
 */
class SignInForm extends CommonForm
{

    const FLASH_KEY = 'SignInForm';

    public $ONLY_ADMIN = false;

    /**
     * @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->getTimeRememberUserSignIn() : 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']
        ];

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

        return ArrayHelper::merge($rules, parent::rules());
    }

    /**
     * Validate password on signIn scenario
     */
    public function validatePassword()
    {
        if (!$this->hasErrors()) {
            $user = $this->getUser();
            if (!$user || !$user->validatePassword($this->password)) {
                $this->addError('password', Yii::t('user', 'Incorrect username or password'));
                return false;
            } else {
                return true;
            }
        }
    }


}