Cara Membuat CRUD di CodeIgniter 3: Tambah, Edit, Hapus (Part 2)

📦 Seri Tutorial CodeIgniter 3 — Aplikasi Inventaris Barang

  1. Part 1: Setup & Menampilkan Data
  2. Part 2: CRUD (Tambah, Edit, Hapus) (sedang dibaca)
  3. Part 3: Pencarian & Pagination
  4. Part 4: Login & Autentikasi

Pada Part 1, kita sudah membangun fondasi aplikasi inventaris barang dan berhasil menampilkan data. Namun aplikasi itu belum bisa apa-apa selain menampilkan — kita belum bisa menambah, mengubah, atau menghapus barang. Di Part 2 ini kita akan melengkapinya menjadi aplikasi CRUD yang utuh.

Empat Operasi CRUD
Empat Operasi CRUD

Empat Operasi CRUD

CRUD adalah singkatan dari empat operasi dasar data:

  • Create — menambah data (form tambah barang).
  • Read — menampilkan data (sudah dibuat di Part 1).
  • Update — mengubah data (form edit).
  • Delete — menghapus data.

Melengkapi Model Barang

Pertama, tambahkan metode CRUD ke application/models/Barang_model.php:

<?php
defined('BASEPATH') OR exit('No direct script access allowed');

class Barang_model extends CI_Model
{
    public function getAll()
    {
        return $this->db->get('barang')->result_array();
    }

    public function getById($id)
    {
        return $this->db->get_where('barang', ['id' => $id])->row_array();
    }

    public function tambah($data)
    {
        return $this->db->insert('barang', $data);
    }

    public function ubah($id, $data)
    {
        return $this->db->update('barang', $data, ['id' => $id]);
    }

    public function hapus($id)
    {
        return $this->db->delete('barang', ['id' => $id]);
    }
}

Metode-metode ini memanfaatkan Query Builder CodeIgniter yang aman dari SQL injection karena nilainya otomatis di-escape.

Menambahkan Tombol Aksi di Daftar Barang

Ubah view application/views/barang/index.php, tambahkan tombol Tambah di atas tabel dan kolom Aksi berisi tautan Edit serta Hapus:

<h2>Daftar Barang</h2>
<a href="<?= base_url('barang/tambah') ?>" class="tombol">+ Tambah Barang</a>

<table border="1" cellpadding="8" cellspacing="0">
    <thead>
        <tr>
            <th>Kode</th><th>Nama</th><th>Kategori</th>
            <th>Stok</th><th>Harga</th><th>Aksi</th>
        </tr>
    </thead>
    <tbody>
    <?php foreach ($barang as $b): ?>
        <tr>
            <td><?= $b['kode'] ?></td>
            <td><?= $b['nama'] ?></td>
            <td><?= $b['kategori'] ?></td>
            <td><?= $b['stok'] ?></td>
            <td>Rp <?= number_format($b['harga'], 0, ',', '.') ?></td>
            <td>
                <a href="<?= base_url('barang/edit/' . $b['id']) ?>">Edit</a>
                <a href="<?= base_url('barang/hapus/' . $b['id']) ?>"
                   onclick="return confirm('Yakin hapus barang ini?')">Hapus</a>
            </td>
        </tr>
    <?php endforeach ?>
    </tbody>
</table>

Membuat Form Tambah Barang

Tambahkan metode tambah() di controller Barang. Metode ini menangani dua hal: menampilkan form (saat dibuka) dan memproses data (saat form dikirim). Kita pakai library form_validation:

public function tambah()
{
    $this->load->library('form_validation');

    $this->form_validation->set_rules('kode', 'Kode', 'required');
    $this->form_validation->set_rules('nama', 'Nama Barang', 'required');
    $this->form_validation->set_rules('stok', 'Stok', 'required|integer');
    $this->form_validation->set_rules('harga', 'Harga', 'required|integer');

    if ($this->form_validation->run() == FALSE) {
        // Validasi gagal atau form baru dibuka -> tampilkan form
        $this->load->view('templates/header');
        $this->load->view('barang/form', ['judul' => 'Tambah Barang']);
        $this->load->view('templates/footer');
    } else {
        // Validasi lolos -> simpan data
        $data = [
            'kode'     => $this->input->post('kode'),
            'nama'     => $this->input->post('nama'),
            'kategori' => $this->input->post('kategori'),
            'stok'     => $this->input->post('stok'),
            'harga'    => $this->input->post('harga'),
        ];
        $this->Barang_model->tambah($data);
        $this->session->set_flashdata('sukses', 'Barang baru berhasil ditambahkan.');
        redirect('barang');
    }
}

Perhatikan pola khas CI3: satu metode menangani tampil-dan-proses form sekaligus, dibedakan oleh hasil form_validation->run().

Membuat View Form

Buat view application/views/barang/form.php. View ini dipakai bersama untuk tambah maupun edit. Gunakan form helper CodeIgniter:

<h2><?= $judul ?></h2>

<?= validation_errors('<div class="kotak-error">', '</div>') ?>

<?php $aksi = isset($barang) ? 'barang/update/' . $barang['id'] : 'barang/tambah'; ?>
<?= form_open($aksi) ?>

    <label>Kode</label>
    <input type="text" name="kode"
           value="<?= set_value('kode', isset($barang) ? $barang['kode'] : '') ?>">

    <label>Nama Barang</label>
    <input type="text" name="nama"
           value="<?= set_value('nama', isset($barang) ? $barang['nama'] : '') ?>">

    <label>Kategori</label>
    <input type="text" name="kategori"
           value="<?= set_value('kategori', isset($barang) ? $barang['kategori'] : '') ?>">

    <label>Stok</label>
    <input type="number" name="stok"
           value="<?= set_value('stok', isset($barang) ? $barang['stok'] : '') ?>">

    <label>Harga</label>
    <input type="number" name="harga"
           value="<?= set_value('harga', isset($barang) ? $barang['harga'] : '') ?>">

    <button type="submit" class="tombol">Simpan</button>

<?= form_close() ?>

Fungsi form_open() otomatis membuat tag form dan menyisipkan token CSRF (bila diaktifkan). Fungsi set_value() mengembalikan input sebelumnya jika validasi gagal, atau nilai data barang saat mode edit.

Form tambah barang
Form tambah barang

Menampilkan Pesan Error

Fungsi validation_errors() di view otomatis menampilkan seluruh pesan kesalahan validasi — misalnya “The Kode field is required.” Agar pesannya berbahasa Indonesia, Anda bisa mengatur label pada set_rules() dan menyunting file bahasa. Tambahkan CSS agar kotak error mencolok:

.kotak-error {
    background-color: #fee2e2;
    border: 1px solid #dc2626;
    color: #991b1b;
    padding: 12px 16px;
    border-radius: 6px;
    margin-bottom: 16px;
}

Menampilkan Pesan Sukses (Flashdata)

Flashdata adalah data session yang hanya tampil sekali lalu terhapus otomatis — cocok untuk notifikasi. Kita sudah mengirimnya lewat set_flashdata(). Untuk menampilkannya, tambahkan di bagian atas view daftar barang:

<?php if ($this->session->flashdata('sukses')): ?>
    <div class="kotak-sukses">
        <?= $this->session->flashdata('sukses') ?>
    </div>
<?php endif ?>

Agar flashdata berfungsi, pastikan library session dimuat — tambahkan 'session' ke $autoload['libraries'] di autoload.php.

Daftar barang dengan notifikasi sukses dan tombol aksi
Daftar barang dengan notifikasi sukses dan tombol aksi

Membuat Form Edit Barang

Untuk mengedit, kita ambil data barang berdasarkan ID lalu tampilkan di form yang sama. Tambahkan metode edit():

public function edit($id)
{
    $barang = $this->Barang_model->getById($id);
    if (!$barang) {
        show_404();
    }

    $this->load->view('templates/header');
    $this->load->view('barang/form', [
        'judul'  => 'Edit Barang',
        'barang' => $barang,
    ]);
    $this->load->view('templates/footer');
}

Karena view form kita rancang fleksibel (mengecek isset($barang)), form yang sama otomatis terisi data saat mode edit.

Memperbarui Data

Tambahkan metode update() untuk memproses perubahan:

public function update($id)
{
    $this->load->library('form_validation');
    $this->form_validation->set_rules('kode', 'Kode', 'required');
    $this->form_validation->set_rules('nama', 'Nama Barang', 'required');
    $this->form_validation->set_rules('stok', 'Stok', 'required|integer');
    $this->form_validation->set_rules('harga', 'Harga', 'required|integer');

    if ($this->form_validation->run() == FALSE) {
        $barang = $this->Barang_model->getById($id);
        $this->load->view('templates/header');
        $this->load->view('barang/form', ['judul' => 'Edit Barang', 'barang' => $barang]);
        $this->load->view('templates/footer');
    } else {
        $data = [
            'kode'     => $this->input->post('kode'),
            'nama'     => $this->input->post('nama'),
            'kategori' => $this->input->post('kategori'),
            'stok'     => $this->input->post('stok'),
            'harga'    => $this->input->post('harga'),
        ];
        $this->Barang_model->ubah($id, $data);
        $this->session->set_flashdata('sukses', 'Data barang berhasil diperbarui.');
        redirect('barang');
    }
}

Menghapus Data

Terakhir, metode hapus(). Berkat konfirmasi JavaScript pada tombol Hapus, pengguna tidak akan menghapus data secara tak sengaja:

public function hapus($id)
{
    $this->Barang_model->hapus($id);
    $this->session->set_flashdata('sukses', 'Barang berhasil dihapus.');
    redirect('barang');
}

Kode Controller Selengkapnya

Setelah semua metode ditambahkan, jangan lupa memuat library session dan helper form — cara termudah lewat autoload. Struktur controller Barang Anda kini mencakup: index(), tambah(), edit(), update(), dan hapus(). Berkat model dan Query Builder, tiap metode ringkas dan mudah dibaca — inilah efisiensi yang ditawarkan CodeIgniter 3.

Penutup

Aplikasi inventaris barang Anda kini sudah bisa menambah, menampilkan, mengedit, dan menghapus data, lengkap dengan validasi dan notifikasi yang ramah. Anda telah mempraktikkan alur CRUD yang menjadi fondasi hampir semua aplikasi web.

Ketika data barang bertambah menjadi ratusan, dua kebutuhan baru muncul: pencarian untuk menemukan barang cepat, dan pagination agar halaman tidak berat. Keduanya akan kita bangun di Part 3. Sampai jumpa!

Referensi: untuk pendalaman lebih lanjut, kunjungi dokumentasi resmi CodeIgniter 3.

Baca Juga

Ali Akbar

Software Developer yang fokus mengembangkan aplikasi berbasis Web dan Desktop. Senang mempelajari teknologi baru terutama di bidang web design dan web development.

View all posts by Ali Akbar →

Tinggalkan Balasan

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