Sistem Informasi Perpustakaan CodeIgniter 4: CRUD Kategori Buku

By | Oktober 17, 2026
CRUD kategori buku CodeIgniter 4
This entry is part 3 of 3 in the series Sistem Informasi Perpustakaan CodeIgniter 4

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.

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

  • uncheckedBuka /kategori dan lihat data hasil seeder.
  • uncheckedTambah kategori baru.
  • uncheckedEdit nama atau deskripsi kategori.
  • uncheckedCoba simpan nama kategori yang kosong.
  • uncheckedCoba simpan nama kategori yang sudah ada.
  • uncheckedCoba hapus kategori yang ada.
  • uncheckedPastikan 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)

Sistem Informasi Perpustakaan CodeIgniter 4

Sistem Informasi Perpustakaan CodeIgniter 4: Setup dan Konfigurasi Database

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *

Situs ini menggunakan Akismet untuk mengurangi spam. Pelajari bagaimana data komentar Anda diproses