PasswordResetRequestForm.php 2.75 KB
<?php

namespace frontend\modules\user\models\form;

use Yii;
//
use frontend\modules\user\models\User;

/**
 * Class PasswordResetRequestForm
 *
 * @package frontend\modules\user\models\form
 * @author FilamentV <vortex.filament@gmail.com>
 * @copyright (c), Thread
 */
class PasswordResetRequestForm extends \yii\base\Model
{
    public $email;
    /**
     * @var User
     */
    private $_user = null;
    protected $_username_attribute;

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

    /**
     * @return array
     */
    public function rules()
    {
        return [
            [['email'], 'required'],
            [['email'], 'trim'],
            [['email'], 'email'],
        ];
    }

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

    /**
     * @return array
     */
    public function attributeLabels()
    {
        return [
            'email' => Yii::t('app', 'Email'),
        ];
    }

    /**
     * Создаем токкен для сброса пароля
     * @return bool
     */
    public function generateResetToken()
    {
        $success = false;
        /**
         * @var $user User
         */
        $user = $this->getUserByEmail();
        if ($user !== null) {
            $user->setScenario('resetPassword');
            $user->generatePasswordResetToken();

            if (!User::isPasswordResetTokenValid($user->password_reset_token)) {
                $user->generatePasswordResetToken();
            }

            $success = $user->save();
        }
        return $success;
    }


    /**
     * @return bool
     */
    public function sendEmail()
    {
        $user = $this->generateResetToken() ? $this->getUser() : null;
        /** @see runtime/fronend/debug/mail directory */
        if ($user) {
            $carrier = \Yii::$app->get('mail-carrier');
            $carrier->setCarrier('passwordChanged')->initCarrier('passwordChanged');
            $carrier->addReceiversTo($this->email);
            $carrier->send([
                'user' => $user,
            ], 'user/passwordResetToken-text');
            return true;
        }
        return false;
    }

    /**
     * @return User|null
     */
    public function getUser()
    {
        return ($this->_username_attribute === 'username') ? User::findByUsername($this->username) : User::findByEmail($this->email);
    }

    /**
     * @return User|null
     */
    public function getUserByEmail()
    {
        return User::findByEmail($this->email);
    }
}