application/controllers/admin/Buku.php
PHP
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* Admin Buku Controller
* CRUD Data Buku
*/
class Buku extends CI_Controller {
public function __construct() {
parent::__construct();
check_admin();
$this->load->model('Buku_model');
$this->load->library('pagination');
}
/**
* Daftar Buku dengan Pencarian & Pagination
*/
public function index() {
$search = $this->input->get('keyword', TRUE);
$kategori = $this->input->get('kategori', TRUE);
$limit = 10;
$page = $this->input->get('page') ? (int) $this->input->get('page') : 1;
$offset = ($page - 1) * $limit;
$total_rows = $this->Buku_model->count_all($search, $kategori);
// Konfigurasi Pagination Bootstrap 5
$config['base_url'] = site_url('admin/buku');
$config['total_rows'] = $total_rows;
$config['per_page'] = $limit;
$config['page_query_string'] = TRUE;
$config['query_string_segment'] = 'page';
$config['reuse_query_string'] = TRUE;
$config['full_tag_open'] = '<nav><ul class="pagination pagination-sm mb-0">';
$config['full_tag_close'] = '</ul></nav>';
$config['first_link'] = '«';
$config['first_tag_open'] = '<li class="page-item">';
$config['first_tag_close'] = '</li>';
$config['last_link'] = '»';
$config['last_tag_open'] = '<li class="page-item">';
$config['last_tag_close'] = '</li>';
$config['next_link'] = '›';
$config['next_tag_open'] = '<li class="page-item">';
$config['next_tag_close'] = '</li>';
$config['prev_link'] = '‹';
$config['prev_tag_open'] = '<li class="page-item">';
$config['prev_tag_close'] = '</li>';
$config['cur_tag_open'] = '<li class="page-item active"><span class="page-link">';
$config['cur_tag_close'] = '</span></li>';
$config['num_tag_open'] = '<li class="page-item">';
$config['num_tag_close'] = '</li>';
$config['attributes'] = ['class' => 'page-link'];
$this->pagination->initialize($config);
$data['title'] = 'Data Buku - SIPAS';
$data['buku'] = $this->Buku_model->search($search, $kategori, $limit, $offset);
$data['categories'] = $this->Buku_model->get_categories();
$data['pagination'] = $this->pagination->create_links();
$data['total_rows'] = $total_rows;
$data['offset'] = $offset;
$data['limit'] = $limit;
$data['keyword'] = $search;
$data['selected_kategori'] = $kategori;
$this->load->view('admin/buku/index', $data);
}
/**
* Tambah Buku
*/
public function tambah() {
$this->form_validation->set_rules('kode_buku', 'Kode Buku', 'required|trim|is_unique[buku.kode_buku]', [
'required' => 'Kode buku wajib diisi.',
'is_unique' => 'Kode buku ini sudah digunakan.'
]);
$this->form_validation->set_rules('judul', 'Judul Buku', 'required|trim', [
'required' => 'Judul buku wajib diisi.'
]);
$this->form_validation->set_rules('penulis', 'Penulis', 'trim');
$this->form_validation->set_rules('penerbit', 'Penerbit', 'trim');
$this->form_validation->set_rules('tahun_terbit', 'Tahun Terbit', 'numeric');
$this->form_validation->set_rules('kategori', 'Kategori', 'trim');
$this->form_validation->set_rules('stok', 'Stok', 'required|numeric|greater_than_equal_to[0]', [
'required' => 'Stok buku wajib diisi.',
'greater_than_equal_to' => 'Stok minimal 0.'
]);
$this->form_validation->set_rules('rak', 'Lokasi Rak', 'trim');
$this->form_validation->set_rules('deskripsi', 'Deskripsi', 'trim');
if ($this->form_validation->run() === FALSE) {
$data['title'] = 'Tambah Buku - SIPAS';
$this->load->view('admin/buku/tambah', $data);
} else {
$insert_data = [
'kode_buku' => strtoupper($this->input->post('kode_buku', TRUE)),
'judul' => $this->input->post('judul', TRUE),
'penulis' => $this->input->post('penulis', TRUE),
'penerbit' => $this->input->post('penerbit', TRUE),
'tahun_terbit' => $this->input->post('tahun_terbit', TRUE) ? (int)$this->input->post('tahun_terbit') : NULL,
'kategori' => $this->input->post('kategori', TRUE),
'stok' => (int)$this->input->post('stok'),
'rak' => $this->input->post('rak', TRUE),
'deskripsi' => $this->input->post('deskripsi', TRUE),
'created_at' => date('Y-m-d H:i:s'),
'updated_at' => date('Y-m-d H:i:s')
];
if ($this->Buku_model->create($insert_data)) {
$this->session->set_flashdata('success', 'Data buku berhasil ditambahkan.');
redirect('admin/buku');
} else {
$this->session->set_flashdata('error', 'Gagal menambahkan data buku.');
redirect('admin/buku/tambah');
}
}
}
/**
* Edit Buku
*/
public function edit($id) {
$buku = $this->Buku_model->get_by_id($id);
if (!$buku) {
$this->session->set_flashdata('error', 'Data buku tidak ditemukan.');
redirect('admin/buku');
}
// Jika kode buku diubah, cek keunikan
$kode_rule = 'required|trim';
if ($this->input->post('kode_buku') !== $buku->kode_buku) {
$kode_rule .= '|is_unique[buku.kode_buku]';
}
$this->form_validation->set_rules('kode_buku', 'Kode Buku', $kode_rule);
$this->form_validation->set_rules('judul', 'Judul Buku', 'required|trim');
$this->form_validation->set_rules('stok', 'Stok', 'required|numeric|greater_than_equal_to[0]');
if ($this->form_validation->run() === FALSE) {
$data['title'] = 'Edit Buku - SIPAS';
$data['buku'] = $buku;
$this->load->view('admin/buku/edit', $data);
} else {
$update_data = [
'kode_buku' => strtoupper($this->input->post('kode_buku', TRUE)),
'judul' => $this->input->post('judul', TRUE),
'penulis' => $this->input->post('penulis', TRUE),
'penerbit' => $this->input->post('penerbit', TRUE),
'tahun_terbit' => $this->input->post('tahun_terbit', TRUE) ? (int)$this->input->post('tahun_terbit') : NULL,
'kategori' => $this->input->post('kategori', TRUE),
'stok' => (int)$this->input->post('stok'),
'rak' => $this->input->post('rak', TRUE),
'deskripsi' => $this->input->post('deskripsi', TRUE),
'updated_at' => date('Y-m-d H:i:s')
];
if ($this->Buku_model->update($id, $update_data)) {
$this->session->set_flashdata('success', 'Data buku berhasil diperbarui.');
redirect('admin/buku');
} else {
$this->session->set_flashdata('error', 'Gagal memperbarui data buku.');
redirect('admin/buku/edit/' . $id);
}
}
}
/**
* Detail Buku
*/
public function detail($id) {
$buku = $this->Buku_model->get_by_id($id);
if (!$buku) {
$this->session->set_flashdata('error', 'Data buku tidak ditemukan.');
redirect('admin/buku');
}
$data['title'] = 'Detail Buku - ' . $buku->judul;
$data['buku'] = $buku;
$this->load->view('admin/buku/detail', $data);
}
/**
* Hapus Buku
*/
public function hapus($id) {
$buku = $this->Buku_model->get_by_id($id);
if (!$buku) {
$this->session->set_flashdata('error', 'Data buku tidak ditemukan.');
redirect('admin/buku');
}
// Cek apakah masih memiliki transaksi aktif
if ($this->Buku_model->has_active_transaction($id)) {
$this->session->set_flashdata('error', 'Buku tidak dapat dihapus karena masih memiliki transaksi aktif peminjaman.');
redirect('admin/buku');
return;
}
if ($this->Buku_model->delete($id)) {
$this->session->set_flashdata('success', 'Data buku berhasil dihapus.');
} else {
$this->session->set_flashdata('error', 'Gagal menghapus buku. Buku mungkin masih memiliki riwayat transaksi.');
}
redirect('admin/buku');
}
}
💡 Catatan: Baris komentar (// atau /*
*/) bersifat opsional/penjelas logika. Tidak wajib diketik semua agar lebih cepat.