PasswordController.php 5.49 KB
<?php

namespace frontend\modules\user\controllers;

use Yii;
use yii\db\Exception;
use yii\filters\AccessControl;
use yii\web\BadRequestHttpException;
//
use frontend\components\BaseUserSigInController;
use frontend\modules\user\models\form\{
    PasswordResetRequestForm, ResetPasswordForm, ChangePassword
};
use frontend\modules\user\models\{
    Profile, User
};

/**
 * Class PasswordController
 *
 * @package frontend\modules\user\controllers
 * @author FilamentV <vortex.filament@gmail.com>
 * @copyright (c), Thread
 */
class PasswordController extends BaseUserSigInController
{

    protected $model = Profile::class;
    public $title = "Profile";
    public $defaultAction = 'index';
    public $layout = "@app/layouts/user-profile";

    /**
     *
     */
    public function init()
    {
        parent::init();

        $this->breadcrumbs = [
            [
                'label' => Yii::t('user', 'Private Office'),
            ],
            [
                'label' => Yii::t('user', 'Profile'),
            ],
            [
                'label' => Yii::t('user', 'Password'),
            ]
        ];
    }

    /**
     * @return array
     */
    public function behaviors()
    {
        return [
            'AccessControl' => [
                'class' => AccessControl::class,
                'rules' => [
                    [
                        'allow' => true,
                        'actions' => ['change'],
                        'roles' => ['@'],
                    ],
                    [
                        'allow' => true,
                        'actions' => ['request-reset', 'reset'],
                        'roles' => ['?']
                    ],
                    [
                        'allow' => false,
                    ],
                ],
            ],
        ];
    }

    /**
     * @return string
     */
    public function actionChange()
    {

        //
        $this->breadcrumbs[] = [
            'label' => Yii::t('app', 'Update'),
        ];
        //

        $model = new ChangePassword();
        $model->setScenario('passwordChange');

        if ($model->load(Yii::$app->getRequest()->post()) && $model->validate()) {
            $user = User::findIdentity(Yii::$app->getUser()->id);
            if ($user !== null) {
                $user->setScenario('passwordChange');
                $user->setPassword($model->password);
                $transaction = $user::getDb()->beginTransaction();
                try {
                    $save = $user->save();
                    if ($save) {
                        $transaction->commit();
                        $model->addFlash(Yii::t('user', 'Password changed'));
                    } else {
                        $transaction->rollBack();
                    }
                } catch (Exception $e) {
                    $transaction->rollBack();
                }
            }
        }
        return $this->render('change', [
            'model' => $model,
        ]);
    }

    /**
     * Requests password reset.
     *
     * @return mixed
     */
    public function actionRequestReset()
    {
        $this->layout = "@app/layouts/user-register";
        $view = 'requestPasswordResetToken';

        $model = new PasswordResetRequestForm();
        $model->setScenario('remind');
        if ($model->load(Yii::$app->request->post()) && $model->validate()) {
            if ($model->sendEmail()) {
                Yii::$app->getSession()->addFlash('info-popup', [
                    'title' => Yii::t('user', 'Reset password'),
                    'text' => Yii::t('user', 'Check your email for further instructions.')
                ]);
                return $this->redirect(['/']);

            } else {
                Yii::$app->getSession()->addFlash('info-popup', [
                    'title' => Yii::t('user', 'Reset password'),
                    'text' => Yii::t('user', 'Sorry, we are unable to reset password for email provided.')
                ]);
                return $this->redirect(['/']);
            }
            $view = 'requestPasswordResetTokenSuccess';
        }
        return $this->render($view, [
            'model' => $model,
        ]);
    }

    /**
     * Resets password.
     *
     * @param string $token
     * @return mixed
     * @throws BadRequestHttpException
     */
    public function actionReset($token)
    {
        $this->layout = "@app/layouts/base";
        $view = 'resetPassword';
        $model = new ResetPasswordForm();
        /**
         * @var $module \frontend\modules\user\User
         */
        $module = $this->module;

        if ($model->initUserByToken($token) == null) {
            Yii::$app->session->setFlash('error', Yii::t('user', 'Wrong password reset token.'));
            $view = 'resetPasswordWrong';
        } else {
            $model->setScenario('setPassword');
            if ($model->load(Yii::$app->request->post()) && $model->validate() && $model->setPassword()) {
                //Yii::$app->session->setFlash('success', Yii::t('user', 'New password was saved.'));
                Yii::$app->getSession()->addFlash('info-popup', [
                    'title' => Yii::t('user', 'Reset password'),
                    'text' => Yii::t('user', 'New password was saved.')
                ]);
                return $this->redirect(['/']);
                //$view = 'resetPasswordSuccess';
            }
        }

        return $this->render($view, [
            'model' => $model,
            'token' => $token,
            'module' => $module
        ]);
    }
}