- Sistem Informasi Perpustakaan CodeIgniter 4: Rancangan Aplikasi SIPUS
- Sistem Informasi Perpustakaan CodeIgniter 4: Setup dan Konfigurasi Database
- Sistem Informasi Perpustakaan CodeIgniter 4: CRUD Kategori Buku
MWI – Halo sobat pembelajar web MuSa. CRUD kategori buku CodeIgniter 4 merupakan pola dasar penting sebelum Anda membangun modul master data yang lebih kompleks seperti buku dan anggota. Melalui panduan ini, Anda akan belajar membuat pengelolaan data kategori secara utuh memakai arsitektur Model-View-Controller (MVC) bawaan framework CodeIgniter 4.
Daftar Isi
Persiapan Lingkungan Kerja dan Server Lokal
Sebelum menulis kode program, Anda perlu memastikan bahwa server lokal CodeIgniter 4 sudah berjalan dengan baik. Jalankan perintah php spark serve pada terminal di dalam folder proyek SIPUS, lalu buka alamat lokal yang ada pada browser Kita.
php spark serve
Di samping itu, Anda dapat membaca panduan setup awal dan database pada artikel sebelumnya untuk memastikan konfigurasi migration serta seeder Anda sudah sesuai[cite: 1, 2]. Untuk memperdalam dokumentasi pemrosesan data, Anda juga dapat mengunjungi halaman resmi panduan Model CodeIgniter 4.
Membuat Model Kategori Buku (CategoryModel.php)
Langkah pertama, buatlah berkas CategoryModel.php di dalam direktori app/Models/ untuk mengelola interaksi dengan tabel categories. Isikan struktur kode berikut:
php spark make:model CategoryModel
Akan terbentuk sebuah file app/Models/CategoryModel.php lalu isi dengan kode berikut:
<?php
namespace App\Models;
use CodeIgniter\Model;
class CategoryModel extends Model
{
protected $table = 'categories';
protected $primaryKey = 'id';
protected $useAutoIncrement = true;
protected $returnType = 'array';
protected $allowedFields = [
'name',
'description',
];
protected $useTimestamps = true;
}
Penjelasan:
- $table menentukan tabel yang ada.
- $primaryKey menentukan kolom identitas utama.
- $allowedFields membatasi kolom yang boleh ada isinya melalui Model.
- $useTimestamps membuat CodeIgniter mengelola created_at dan updated_at.
Buat Controller Kategori
Buat file dengan perintah:
<strong>php spark make:controller Categories</strong>
Akan terbentuk file pada app/Controllers/Categories.php lalu isi dengan file berikut ini
<?php
namespace App\Controllers;
use App\Models\CategoryModel;
use App\Models\BookModel;
class Categories extends BaseController
{
public function index()
{
$model = new CategoryModel();
return view('categories/index', [
'categories' => $model->orderBy('id', 'DESC')
->findAll(),
]);
}
public function new()
{
return view('categories/form', [
'category' => null,
'errors' => session()->getFlashdata('errors') ?? [],
]);
}
public function create()
{
$rules = [
'name' => 'required|min_length[3]|max_length[100]|is_unique[categories.name]',
'description' => 'permit_empty|max_length[500]',
];
if (! this->validate(rules)) {
return redirect()->back()
->withInput()
->with('errors', $this->validator->getErrors());
}
$model = new CategoryModel();
model->insert(['name'=>trim(this->request->getPost('name')),
'description' => $this->request->getPost('description'),
]);
return redirect()->to('/kategori')
->with('success', 'Kategori berhasil ditambahkan.');
}
public function edit($id)
{
$model = new CategoryModel();
$category = model->find(id);
if (! $category) {
return redirect()->to('/kategori')
->with('error', 'Kategori tidak ditemukan.');
}
return view('categories/form', [
'category' => $category,
'errors' => session()->getFlashdata('errors') ?? [],
]);
}
public function update($id)
{
$model = new CategoryModel();
$category = model->find(id);
if (! $category) {
return redirect()->to('/kategori')
->with('error', 'Kategori tidak ditemukan.');
}
$rules = [
'name' => "required|min_length[3]|max_length[100]|is_unique[categories.name,id,{$id}]",
'description' => 'permit_empty|max_length[500]',
];
if (! this->validate(rules)) {
return redirect()->back()
->withInput()
->with('errors', $this->validator->getErrors());
}
model->update(id, [
'name' => trim($this->request->getPost('name')),
'description' => $this->request->getPost('description'),
]);
return redirect()->to('/kategori')
->with('success', 'Kategori berhasil diperbarui.');
}
public function delete($id)
{
$categoryModel = new CategoryModel();
$category = categoryModel->find(id);
if (! $category) {
return redirect()->to('/kategori')
->with('error', 'Kategori tidak ditemukan.');
}
$bookModel = new BookModel();
$used = $bookModel->where('category_id', id)->countAllResults();if(used > 0) {
return redirect()->to('/kategori')
->with('error', 'Kategori masih digunakan oleh buku.');
}
categoryModel->delete(id);
return redirect()->to('/kategori')
->with('success', 'Kategori berhasil dihapus.');
}
}
Controller ini mengasumsikan BookModel memiliki tabel books dan field category_id. Jika BookModel belum ada, kita akan membuatnya pada tahap CRUD Buku. Penghapusan kategori sengaja tertolak jika masih terpakai oleh buku.
Daftarkan Routes
Buka app/Config/Routes.php, lalu tambahkan baris berikut setelah route bawaan:
$routes->get('kategori', 'Categories::index');
$routes->get('kategori/tambah', 'Categories::new');
$routes->post('kategori/simpan', 'Categories::create');
$routes->get('kategori/edit/(:num)','Categories::edit/1');
$routes->post('kategori/update/(:num)','Categories::update/1');
$routes->post('kategori/hapus/(:num)','Categories::delete/1');
Route menghubungkan URL dengan method pada Controller. Contohnya, /kategori menjalankan Categories::index().
Buat halaman daftar kategori
Buat folder categories pada views hingga terbentuk seperti ini app/Views/categories/, lalu buat file index.php. isi seperti ini
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Data Kategori - SIPUS</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css"
rel="stylesheet">
</head>
<body>
<div class="container py-4">
<h1 class="h3 mb-3">Data Kategori Buku</h1>
<?php if (message=session()->getFlashdata('success')):?><divclass="alertalert-success"><?=esc(message) ?></div>
<?php endif ?>
<?php if (message=session()->getFlashdata('error')):?><divclass="alertalert-danger"><?=esc(message) ?></div>
<?php endif ?>
<a href="<?= site_url('kategori/tambah') ?>"
class="btn btn-primary mb-3">Tambah Kategori</a>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>No.</th>
<th>Nama Kategori</th>
<th>Deskripsi</th>
<th>Aksi</th>
</tr>
</thead>
<tbody>
<?php if (empty(categories)):?><tr><tdcolspan="4"class="text-center">Belumadadatakategori.</td></tr><?phpelse:?><?phpforeach(categories as $i => $category): ?>
<tr>
<td><?= i+1?></td><td><?=esc(category['name']) ?></td>
<td><?= esc($category['description'] ?? '') ?></td>
<td>
<a class="btn btn-sm btn-warning"
href="<?= site_url('kategori/edit/' . $category['id']) ?>">
Edit
</a>
<form class="d-inline"
method="post"
action="<?= site_url('kategori/hapus/' . $category['id']) ?>"
onsubmit="return confirm('Hapus kategori ini?')">
<?= csrf_field() ?>
<button class="btn btn-sm btn-danger" type="submit">
Hapus
</button>
</form>
</td>
</tr>
<?php endforeach ?>
<?php endif ?>
</tbody>
</table>
</div>
</body>
</html>
Membuat Form Tambah dan Edit (categories/form.php)
Langkah kelima, buat berkas form.php di direktori app/Views/categories/ yang berfungsi ganda untuk membuat data baru maupun mengedit data lama – file ada di app/Views/categories/form.php isi datanya dengan
<!DOCTYPE html>
<html lang="id">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Form Kategori - SIPUS</title>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css"
rel="stylesheet">
</head>
<body>
<div class="container py-4">
<h1 class="h3 mb-3">
<?= category?'EditKategori':'TambahKategori'?></h1><?phpif(!empty(errors)): ?>
<div class="alert alert-danger">
<ul class="mb-0">
<?php foreach ($errors as error):?><li><?=esc(error) ?></li>
<?php endforeach ?>
</ul>
</div>
<?php endif ?>
<?php
$isEdit = $category !== null;
$action = $isEdit
? site_url('kategori/update/' . $category['id'])
: site_url('kategori/simpan');
?>
<form action="<?= $action ?>" method="post">
<?= csrf_field() ?>
<div class="mb-3">
<label for="name" class="form-label">Nama Kategori</label>
<input type="text" id="name" name="name"
class="form-control"
value="<?= esc(old('name', $category['name'] ?? '')) ?>"
required maxlength="100">
</div>
<div class="mb-3">
<label for="description" class="form-label">Deskripsi</label>
<textarea id="description" name="description"
class="form-control" rows="3"
maxlength="500"><?= esc(old('description', $category['description'] ?? '')) ?></textarea>
</div>
<button type="submit" class="btn btn-primary">Simpan</button>
<a href="<?= site_url('kategori') ?>"
class="btn btn-secondary">Kembali</a>
</form>
</div>
</body>
</html>
Uji fitur CRUD
Sebelum melanjutkan ke Buku, uji seluruh operasi berikut:
Checklist pengujian
Buka /kategori dan lihat data hasil seeder.
Tambah kategori baru.
Edit nama atau deskripsi kategori.
Coba simpan nama kategori yang kosong.
Coba simpan nama kategori yang sudah ada.
Coba hapus kategori yang ada.
Pastikan kategori yang masih data buku-nya tidak bisa terhapus.
Akhirnya, modul CRUD kategori buku CodeIgniter 4 telah dapat terselesaikan dan siap Kita uji coba secara langsung pada server lokal. (ms)