Делаем личный кабинет пользователю на Yii2

Рассмотрим способ, как создать личный кабинет пользователя с 3 функциями - смена e-mail, смена пароля, удаление аккаунта1. Для смены пароля нам понадобится - модель представления активной формы с валидацией данных, шаблон действия над активной формой смены пароля, дополнительный метод в модели пользователя, 2 метода в контроллере пользователя на get и post запросы. 2. Аналогично по смене e-mail 3. Действия для удаления аккаунта пользователя потребуют активную форму с флажком и модель представления этой формы, нужен будет и метод в контроллере. 4. Поскольку в личный кабинет пользователя не должны заходить гости, в контроллере пользователя понадобятся 2 метода - действие по перенаправлению на заглушку ограниченный доступ, и функция, которая перенаправляет гостей на заглушку. Эту функцию следует вызывать внутри контроллера пользователя, если требуется авторизация. Рассмотрим пример с изменением пароля. В файл yii2/models/MySetPasswordForm.php добавим модель представления (MV) формы

<?php

namespace app\models;

use Yii;
use yii\base\Model;

/**
* LoginForm is the model behind the login form.
*
* @property-read User|null $user
*
*/
class MySetPasswordForm extends Model
{

public $password;
public $password2;

/**
* @return array the validation rules.
*/
public function rules()
{
return [
['password', 'required'],
['password2', 'required'],
['password2', 'compare', 'compareAttribute'=>'password', 'message'=>'Не совпадают пароли']

];
}

}
  2. В файл yii2/views/user/setpassword.php добавим представление активной формы
<h1>Смена пароля</h1>
<div class="panel panel-info">
<div class='panel-heading'></div><!-- comment -->
<div class='panel-body'>

<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;

$form = ActiveForm::begin([
'id' => 'my-set-password-form',
'options' => ['class' => 'form-horizontal'],
]) ?>

<?= $form->field($model, 'password')->passwordInput() ?>
<?= $form->field($model, 'password2')->passwordInput() ?>
<div class="form-group">
<div class="col-lg-offset-1 col-lg-11">
<?= Html::submitButton('Смена пароля', ['class' => 'btn btn-primary']) ?>
</div>
</div>
<?php ActiveForm::end() ?>

</div>
</div>
  3. В файл yii2/models/UserRecord.php добавим метод модели для смены пароля
public function changePassword(string $password){
$this->passhash = sha1($password); // назначаем хеш по паролю, sha1 для примера
$this->save();
}
  4. В файл yii2/controllers/UserController.php добавим обработчики действия по смене пароля
public function actionSetpassword(){

$this->redirectToRestriced();

if (yii::$app->request->isPost)
return $this->actionSetpasswordPost();

$mv = new MySetPasswordForm();

return $this->render('/user/setpassword', ['model'=>$mv]);
}

public function actionSetpasswordPost(){

$this->redirectToRestriced();

$mv = new MySetPasswordForm();
$mv->load(yii::$app->request->post());

$user = Yii::$app->user->identity;

$user->changePassword($mv->password);

return $this->redirect('/user/lk');
}
  5. Поскольку нам необходимо ограничить доступ в личный кабинет, то добавляем соответствующее представление yii2/views/user/restricted.php с сообщением Ограниченный доступ 6. Сделаем шаблон представления личного кабинета /yii2/views/user/lk.php
<h1>Личный кабинет</h1>
Имя пользователя: <!--?php echo $lk['username']; ?-->

<a href="/user/setemail/">Сменить почту</a>
<a href="/user/setpassword/">Сменить пароль</a>
<!-- comment -->

<hr />

<a href="/user/forget/">Удалить аккаунт</a>
  7. Теперь сделаем модель представления для диалога Удаление пользователя yii2/models/MyForgetForm.php
use yii\base\Model;

 
class MyForgetForm extends Model
{

public $confirmdelete;

/**
* @return array the validation rules.
*/
public function rules()
{
return [
['confirmdelete', 'required']
];
}

}
  8. В модели данных пользователя добавим методы для смены пароля, email, удаления аккаунта в yii2/models/UserRecord.php
public function changeEmail(string $email){

$this->email = $email; // заменяем e-mail
$this->save();

}

public function changePassword(string $password){
$this->passhash = sha1($password); // назначаем хеш по паролю
$this->save();
}

public function forgetUser(){
$this->delete(); // удаляем текущего
}
    9. Переходим к контроллеру пользователя. Добавим действия по смене пароля yii2/controllers/UserController.php
public function actionSetpassword(){

$this->redirectToRestriced();

if (yii::$app->request->isPost)
return $this->actionSetpasswordPost();

$mv = new MySetPasswordForm();

return $this->render('/user/setpassword', ['model'=>$mv]);
}

public function actionSetpasswordPost(){

$this->redirectToRestriced();

$mv = new MySetPasswordForm();
$mv->load(yii::$app->request->post());

$user = Yii::$app->user->identity;

$user->changePassword($mv->password);

return $this->redirect('/user/lk');
}
    10. Теперь добавим действия по удалению пользователя
public function actionForget(){
$this->redirectToRestriced();
if (yii::$app->request->isPost)
return $this->actionForgetPost();
$mv = new MyForgetForm();
return $this->render('forget', ['model'=>$mv]);
}

public function actionForgetPost(){
$this->redirectToRestriced();
$mv = new MyForgetForm();
$mv->load(yii::$app->request->post());
if ($mv->confirmdelete)
{

Yii::$app->user->identity->forgetUser();
Yii::$app->user->logout();

}

return $this->redirect('/');
}
  11. Добавляем действия для показа личного кабинета и показа страницы-заглушки доступ ограничения
public function actionLk(){
$this->redirectToRestriced();
$lk = ['username'=>'test'];
$lk['username'] = Yii::$app->user->identity->username;
return $this->render('/user/lk', ['lk'=>$lk]);
}

public function actionRestricted(){

return $this->render('/user/restricted');
}
  12. Добавляем метод, который будет переадресовывать гостей на заглушку
public function redirectToRestriced(){
// гостям это запрещено
if (Yii::$app->user->isGuest) {
$this->redirect('/user/restricted');
}

}
 

Теги документа