بِسْمِ اللَّهِ Mudah-mudahan tutorial Myth:Auth Bagian 3 Update Group ini bermanfaat
Pada tutorial Codeigniter 4 – Myth:Auth Bagian 1 groups dan permissions sudah dibahas pembuatan grup user juga membuat grup default untuk user yang baru register. Meskipun untuk pembuatan grup masih manual input dari phpmyadmin, tapi untuk CRUD grup bisa dilakukan nanti. Sekarang saya akan berbagi tentang bagaimana mengupdate grup dari user. Disini masih memanfaatkan komponen buatan Myth:Auth yang berhubungan dengan Grup yaitu \vendor\myth\auth\src\Authorization\GroupModel.php.
Seperti biasa ini yang harus dilakukan sebelumnya
Persiapan Myth:Auth Bagian 3 Update Group
Untuk bisa melanjutkan pastikan sudah ada ini:
Editor yang digunakan adalah Visual Studio Code
Project Codeigniter dengan library Myth:Auth didalamnya, tutorialnya bisa dilihat Codeigniter 4 Login multiuser dengan library Myth:Auth
Bagi yang sudah Codeigniter 4 – Merubah tampilan Myth:Auth
Mengerjakan tutorial tentang Grup yaitu Codeigniter 4 – Myth:Auth Bagian 1 groups dan permissions
Juga tutorial tentang Manajemen User
Pertama
Update \app\Controllers\Users.php dengan menambahkan GroupModel
use \Myth\Auth\Authorization\GroupModel;
Selanjutnya update fungsi index, fungsi ini akan mengirimkan beberapa tambahan variabel. Yaitu daftar/list grup, dan perubahan tampilan daftar/list user dengan ada tambahan kolom Grup. Berikut scriptnya
...
public function index()
{
$userModel = new UserModel();
$data['users'] = $userModel->findAll();
$groupModel = new GroupModel();
foreach ($data['users'] as $row) {
$dataRow['group'] = $groupModel->getGroupsForUser($row->id);
$dataRow['row'] = $row;
$data['row'.$row->id] = view('users/row', $dataRow);
}
$data['groups'] = $groupModel->findAll();
$data['title'] = 'Users';
return view('users/index', $data);
}
...
Code yang diatas tentunya sudah tidak asing lagi, karena disana fungsi-fungsi standar yang sudah biasa digunakan. Mungkin yang agak asing adalah
$data['row'.$row->id] = view('users/row', $dataRow);
Atau mungkin malah sudah sering digunakan. Disini saya mengingatkan saja, fungsi ini adalah untuk men-generate view yang nama row di folder users. View row (\app\Views\users\row.php) ini akan dibuat berikutnya dibagian Kedua setelah ini.
Hal ini dilakukan karena saya akan menampilkan kolom baru yaitu Grup, dimana kolom ini tidak ada dalam tabel User. Maka caranya adalah lakukan iterasi semua data User yang ada, kemudian cari grup dari User tersebut dan generate view dengan mengirim data User beserta Grup-nya.
Tambahkan fungsi changeGroup, scriptnya sebagai berikut
...
public function changeGroup()
{
$userId = $this->request->getVar('id');
$groupId = $this->request->getVar('group');
$groupModel = new GroupModel();
$groupModel->removeUserFromAllGroups(intval($userId));
$groupModel->addUserToGroup(intval($userId), intval($groupId));
return redirect()->to(base_url('/users/index'));
}
...
Kedua
Update \app\Views\users\index.php, tambahkan kolom Grup pada daftar/list User. Scriptnya sebagai berikut
...
<div class="table-responsive">
<table class="table table-bordered" id="dataTable" width="100%" cellspacing="0">
<thead>
<tr>
<th>ID</th>
<th>Username</th>
<th>Grup</th>
<th>Email</th>
<th style="width: 60px;">Aktif</th>
<th style="width: 90px;"></th>
</tr>
</thead>
<tfoot>
<tr>
<th>ID</th>
<th>Username</th>
<th>Grup</th>
<th>Email</th>
<th>Aktif</th>
<th></th>
</tr>
</tfoot>
<tbody>
<?php
foreach ($users as $rw) {
$row = "row".$rw->id;
echo $$row;
}
?>
</tbody>
</table>
</div>
...
Masih di view \app\Views\users\index.php, tambahkan modal untuk pilihan grup pada waktu update grup
...
<?= $this->section('div-modal') ?>
...
<form action="<?= base_url(); ?>/users/changeGroup" method="post">
<div class="modal fade" id="changeGroupModal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel"
aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">Ubah Grup</h5>
<button class="close" type="button" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
<div class="modal-body">
<div class="list-group-item p-3">
<div class="row align-items-start">
<div class="col-md-4 mb-8pt mb-md-0">
<div class="media align-items-left">
<div class="d-flex flex-column media-body media-middle">
<span
class="card-title">Grup</span>
</div>
</div>
</div>
<div class="col mb-8pt mb-md-0">
<select name="group" class="form-control" data-toggle="select" >
<?php
foreach($groups as $key => $row){
?>
<option value="<?= $row->id; ?>"><?= $row->name; ?></option>
<?php
}
?>
</select>
</div>
</div>
</div>
</div>
<div class="modal-footer">
<input type="hidden" name="id" class="id">
<button class="btn btn-secondary" type="button" data-dismiss="modal">Batal</button>
<button type="submit" class="btn btn-primary">Ubah</button>
</div>
</div>
</div>
</div>
</form>
<?= $this->endSection() ?>
...
Tambahkan juga pada script-js
...
$('.btn-change-group').on('click',function(){
const id = $(this).data('id');
$('.id').val(id);
$('#changeGroupModal').modal('show');
});
...
Buat file baru di folder \app\Views\users dengan nama row.php. Scriptnya sebagai berikut
<tr>
<td><?= $row->id; ?></td>
<td><?= $row->username; ?></td>
<td><?= empty($group) ? '' : $group[0]['name']; ?></td>
<td><?= $row->email; ?></td>
<td align="center">
<a href="#" class="btn btn-sm btn-circle btn-active-users" data-id="<?= $row->id;?>" data-active="<?= $row->active == 1 ? 1 : 0 ;?>" title="Klik untuk Mengaktifkan atau Menonaktifkan">
<?= $row->active == 1 ? '<i class="fas fa-check-circle"></i>' : '<i class="fas fa-times-circle"></i>' ; ?>
</a>
</td>
<td align="center">
<a href="<?= base_url(); ?>/users/changePassword/<?= $row->id;?>" class="btn btn-warning btn-circle btn-sm" title="Ubah Password" >
<i class="fas fa-key"></i>
</a>
<a href="#" class="btn btn-success btn-circle btn-sm btn-change-group" data-id="<?= $row->id;?>" title="Ubah Grup">
<i class="fas fa-tasks"></i>
</a>
</td>
</tr>
Terakhir
Silakan dicoba. Dan hasilnya akan seperti ini
Mudah-mudahan bermanfaat