Bagian ini erat kaitannya dengan tutorial RBAC yang pernah kita bahas. Sekarang kita akan memberikan checkboxlist agar mudah untuk ditentukan bagaimana memberikan permission pada user tertentu.
1. Buat model auth_item dan auth_assignment dengan gii.
2. Pindah ke bagian frontend dan tampilkan form Sign Up :
http://localhost/blog/advanced/frontend/web/index.php?r=site%2Fsignup
Kita akan membuat checkboxlist permission di halaman ini.
3. Tambahkan variable public $permissions pada SignupForm.php di bagian frontend.
Modifikasi SiteController pada actionSignup untuk melewatkan variable authItems. Jangan lupa gunakan use backend\models\AuthItem.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public function actionSignup() { $model = new SignupForm(); $authItems = AuthItem::find()->all(); if ($model->load(Yii::$app->request->post())) { if ($user = $model->signup()) { if (Yii::$app->getUser()->login($user)) { return $this->goHome(); } } } return $this->render('signup', [ 'model' => $model, 'authItems'=>$authItems, ]); } |
4. Modifikasi signup.php untuk menambahkan checkboxlist . Namun karena $authItems ini berupa objek, kita harus merubahnya menjadi Array dengan bantuan ArrayHelper sehingga /site/signup.php menjadi seperti ini :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
<?php /* @var $this yii\web\View */ /* @var $form yii\bootstrap\ActiveForm */ /* @var $model \frontend\models\SignupForm */ use yii\helpers\Html; use yii\bootstrap\ActiveForm; use yii\helpers\ArrayHelper; $this->title = 'Signup'; $this->params['breadcrumbs'][] = $this->title; ?> <div class="site-signup"> <h1><?= Html::encode($this->title) ?></h1> <p>Please fill out the following fields to signup:</p> <div class="row"> <div class="col-lg-5"> <?php $form = ActiveForm::begin(['id' => 'form-signup']); ?> <?= $form->field($model, 'first_name') ?> <?= $form->field($model, 'last_name') ?> <?= $form->field($model, 'username') ?> <?= $form->field($model, 'email') ?> <?= $form->field($model, 'password')->passwordInput() ?> <?php $authItems = ArrayHelper::map($authItems,'name','name'); ?> <?= $form->field($model, 'permissions')->checkboxList($authItems); ?> <div class="form-group"> <?= Html::submitButton('Signup', ['class' => 'btn btn-primary', 'name' => 'signup-button']) ?> </div> <?php ActiveForm::end(); ?> </div> </div> </div> |
Akan muncul checkBoxList untuk authItem :
5. Modifikasi SignUpForm.php untuk menambahkan permissions :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 |
<?php namespace frontend\models; use common\models\User; use backend\models\AuthAssignment; use yii\base\Model; use Yii; /** * Signup form */ class SignupForm extends Model { public $username; public $first_name; public $last_name; public $email; public $password; public $permissions; /** * @inheritdoc */ public function rules() { return [ ['username', 'filter', 'filter' => 'trim'], ['username', 'required'], ['first_name', 'required'], ['last_name', 'required'], ['username', 'unique', 'targetClass' => '\common\models\User', 'message' => 'This username has already been taken.'], ['username', 'string', 'min' => 2, 'max' => 255], ['email', 'filter', 'filter' => 'trim'], ['email', 'required'], ['email', 'email'], ['email', 'string', 'max' => 255], ['email', 'unique', 'targetClass' => '\common\models\User', 'message' => 'This email address has already been taken.'], ['password', 'required'], ['password', 'string', 'min' => 6], ]; } /** * Signs user up. * * @return User|null the saved model or null if saving fails */ public function signup() { if ($this->validate()) { $user = new User(); $user->username = $this->username; $user->first_name = $this->first_name; $user->last_name = $this->last_name; $user->email = $this->email; $user->setPassword($this->password); $user->generateAuthKey(); $user->save(); return $user; //Permissions $permissionList = $_POST['SignupForm']['permissions']; foreach ($permissionList as $value) { $newPermission = new AuthAssignment; $newPermission->user_id = $user->id; $newPermission->item_name = $value; $newPermission->save(); } } return null; } } |
6. Rubah dulu user_id pada tabel auth_assignment ke integer dan modelnya juga disesuaikan agar user_id bertipe integer.
Tutorial ini sebagai dokumentasi dan pembelajaran pribadi sekalian belajar terjemahin bahasa Inggris, dan siapa tahu bermanfaat buat orang lain. Sumber lengkapnya diambil dari Youtube DoingITEasy Channel.