Modul 07: Portal Siswa (Katalog, Pinjam & Buku Saya)
Modul 07: Portal Siswa (Katalog, Pinjam & Buku Saya)
Berikut adalah seluruh berkas kode program aktual yang digunakan dalam aplikasi SIPAS tanpa potongan atau placeholder. Kode dapat dipelajari dan diketikkan langsung pada Sublime Text 3.
1
Controller Dashboard Siswa (user/Dashboard.php)
Lokasi Berkas: application/controllers/user/Dashboard.php
Gambar: Pratinjau antarmuka dashboard siswa dengan counter buku pinjaman aktif.
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* User Dashboard Controller
*/
class Dashboard extends CI_Controller {
public function __construct() {
parent::__construct();
check_user();
$this->load->model('Dashboard_model');
$this->load->model('Transaksi_model');
}
public function index() {
$user_id = $this->session->userdata('user_id');
$data['title'] = 'Dashboard Siswa - SIPAS';
$data['stats'] = $this->Dashboard_model->get_user_stats($user_id);
$data['buku_pinjam'] = $this->Transaksi_model->get_active_by_user($user_id);
$this->load->view('user/dashboard', $data);
}
}
💡 Catatan: Baris komentar (// atau /* */)
bersifat opsional/penjelas logika. Tidak wajib diketik semua agar lebih cepat.
2
Controller Katalog Buku Siswa (user/Buku.php)
Lokasi Berkas: application/controllers/user/Buku.php
Gambar: Pratinjau katalog pencarian buku siswa format kartu 3 kolom.
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* User Buku Controller
* Siswa mencari buku, melihat detail buku, dan meminjam buku
*/
class Buku extends CI_Controller {
public function __construct() {
parent::__construct();
check_user();
$this->load->model('Buku_model');
$this->load->model('Transaksi_model');
$this->load->library('pagination');
}
/**
* Katalog / Pencarian Buku Siswa (Grid View Card)
*/
public function index() {
$search = $this->input->get('keyword', TRUE);
$kategori = $this->input->get('kategori', TRUE);
$limit = 9; // 3x3 Grid
$page = $this->input->get('page') ? (int) $this->input->get('page') : 1;
$offset = ($page - 1) * $limit;
$total_rows = $this->Buku_model->count_all($search, $kategori);
// Pagination setup
$config['base_url'] = site_url('user/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 justify-content-center 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'] = 'Koleksi Buku - SIPAS Perpustakaan';
$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['keyword'] = $search;
$data['selected_kategori'] = $kategori;
$this->load->view('user/buku/index', $data);
}
/**
* Detail Buku Siswa
*/
public function detail($id) {
$buku = $this->Buku_model->get_by_id($id);
if (!$buku) {
$this->session->set_flashdata('error', 'Buku tidak ditemukan.');
redirect('user/buku');
}
$user_id = $this->session->userdata('user_id');
$is_borrowed = $this->Transaksi_model->is_book_borrowed_by_user($user_id, $id);
$data['title'] = 'Detail Buku: ' . $buku->judul;
$data['buku'] = $buku;
$data['is_borrowed'] = $is_borrowed;
$this->load->view('user/buku/detail', $data);
}
/**
* Proses Peminjaman Buku
*/
public function pinjam($id) {
$user_id = $this->session->userdata('user_id');
// Panggil model transaksi yang memuat database transaction dan 4 level validasi
$result = $this->Transaksi_model->create_peminjaman($user_id, $id);
if ($result['status']) {
$this->session->set_flashdata('success', $result['message']);
redirect('user/peminjaman');
} else {
$this->session->set_flashdata('error', $result['message']);
redirect('user/buku/detail/' . $id);
}
}
}
💡 Catatan: Baris komentar (// atau /* */)
bersifat opsional/penjelas logika. Tidak wajib diketik semua agar lebih cepat.
3
Controller Peminjaman & Buku Saya (user/Peminjaman.php)
Lokasi Berkas: application/controllers/user/Peminjaman.php
Gambar: Pratinjau modal konfirmasi peminjaman buku mandiri oleh siswa.
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* User Peminjaman Controller
* Buku Saya & Riwayat Peminjaman Siswa
*/
class Peminjaman extends CI_Controller {
public function __construct() {
parent::__construct();
check_user();
$this->load->model('Transaksi_model');
$this->load->library('pagination');
}
/**
* Halaman Buku Saya (/user/peminjaman)
* Menampilkan buku yang sedang dipinjam oleh user aktif
*/
public function index() {
$user_id = $this->session->userdata('user_id');
$data['title'] = 'Buku Saya - SIPAS Perpustakaan';
$data['buku_pinjam'] = $this->Transaksi_model->get_active_by_user($user_id);
$this->load->view('user/peminjaman/index', $data);
}
/**
* Siswa melakukan pengembalian buku mandiri
*/
public function kembalikan($transaksi_id) {
$user_id = $this->session->userdata('user_id');
// Panggil model proses pengembalian dengan proteksi user_id
$result = $this->Transaksi_model->proses_pengembalian($transaksi_id, $user_id);
if ($result['status']) {
$this->session->set_flashdata('success', $result['message']);
} else {
$this->session->set_flashdata('error', $result['message']);
}
redirect('user/peminjaman');
}
/**
* Halaman Riwayat Transaksi Peminjaman (/user/riwayat)
*/
public function riwayat() {
$user_id = $this->session->userdata('user_id');
$search = $this->input->get('keyword', TRUE);
$status = $this->input->get('status', TRUE);
$limit = 10;
$page = $this->input->get('page') ? (int) $this->input->get('page') : 1;
$offset = ($page - 1) * $limit;
$total_rows = $this->Transaksi_model->count_by_user($user_id, $status, $search);
// Pagination setup
$config['base_url'] = site_url('user/riwayat');
$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'] = 'Riwayat Peminjaman - SIPAS';
$data['riwayat'] = $this->Transaksi_model->get_by_user($user_id, $status, $search, $limit, $offset);
$data['pagination'] = $this->pagination->create_links();
$data['total_rows'] = $total_rows;
$data['offset'] = $offset;
$data['limit'] = $limit;
$data['keyword'] = $search;
$data['selected_status'] = $status ? $status : 'semua';
$this->load->view('user/peminjaman/riwayat', $data);
}
}
💡 Catatan: Baris komentar (// atau /* */)
bersifat opsional/penjelas logika. Tidak wajib diketik semua agar lebih cepat.
4
Controller Profil Anggota Siswa (user/Profil.php)
Lokasi Berkas: application/controllers/user/Profil.php
Gambar: Pratinjau halaman buku saya dan tombol pengembalian buku mandiri.
<?php
defined('BASEPATH') OR exit('No direct script access allowed');
/**
* User Profil Controller
*/
class Profil extends CI_Controller {
public function __construct() {
parent::__construct();
check_user();
$this->load->model('User_model');
$this->load->model('Transaksi_model');
}
public function index() {
$user_id = $this->session->userdata('user_id');
$user = $this->User_model->get_by_id($user_id);
$data['title'] = 'Profil Saya - SIPAS Perpustakaan';
$data['user'] = $user;
$data['total_pinjam'] = $this->Transaksi_model->count_by_user($user_id);
$this->load->view('user/profil/index', $data);
}
}
💡 Catatan: Baris komentar (// atau /* */)
bersifat opsional/penjelas logika. Tidak wajib diketik semua agar lebih cepat.