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

Dashboard Siswa
Gambar: Pratinjau antarmuka dashboard siswa dengan counter buku pinjaman aktif.
application/controllers/user/Dashboard.php PHP
<?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

Katalog Buku Siswa
Gambar: Pratinjau katalog pencarian buku siswa format kartu 3 kolom.
application/controllers/user/Buku.php PHP
<?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

Modal Pinjam Buku
Gambar: Pratinjau modal konfirmasi peminjaman buku mandiri oleh siswa.
application/controllers/user/Peminjaman.php PHP
<?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

Buku Saya & Pengembalian
Gambar: Pratinjau halaman buku saya dan tombol pengembalian buku mandiri.
application/controllers/user/Profil.php PHP
<?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.