Рассмотрим способ, как создать личный кабинет пользователя с 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'); } }Теги документа