Tutorial membuat pagination laravel #3

Cara membuat pagination laravel 11

Di artikel kali ini, saya akan membagikan tutorial cara membuat pagination pada laravel. Pagination pada Laravel adalah fitur yang digunakan untuk membagi hasil query menjadi beberapa halaman. Fitur ini sangat berguna ketika kita ingin menampilkan data dalam jumlah besar secara terstruktur dan mudah diakses oleh pengguna. Dengan menggunakan pagination, kita dapat menghindari tampilan data yang terlalu panjang dalam satu halaman dan memudahkan navigasi antar halaman. Berikut cara menambahkan pagination.

Buka file ProjekController.php pada artikel sebelumnya. Lalu pada bagian public function index, tempatkan skrip berikut:

<?php

namespace App\Http\Controllers;

use App\Models\Projek; 
use Illuminate\View\View;
use Illuminate\Http\Request;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\Storage;

class projekcontroller extends Controller
{
    public function index(Request $request): View
    {
        $projek = Projek::all();

        $projek = Projek::orderBy('nama', 'asc')->paginate(10);
        $onFirstPage = $projek->onFirstPage();
        if ($request->fullUrl() != session('previous_url')) {
            session(['previous_url' => url()->previous()]);
        }

        return view('projek.index', compact('projek'));
    }

    public function create(): View
    {
        return view('projek.create');
    }

    public function store(Request $request): RedirectResponse
    {
        $request->validate([
            'nama'         => 'required|string|max:255',
            'kelas'        => 'required|numeric',
            'jurusan'      => 'required|string|max:255'
        ]);

        Projek::create([
            'nama'          => $request->nama,
            'kelas'         => $request->kelas,
            'jurusan'       => $request->jurusan,
        ]);

        return redirect()->route('projek.index')->with(['success' => 'Data Berhasil Disimpan!']);
    }

    public function edit(string $id): View
    {
        $projek = Projek::findOrFail($id);

        return view('projek.edit', compact('projek'));
    }

    public function update(Request $request, $id): RedirectResponse
    {
        $request->validate([
            'nama'         => 'required|string|max:255',
            'kelas'        => 'required|numeric',
            'jurusan'      => 'required|string|max:255'
        ]);

        $projek = Projek::findOrFail($id);

        $projek->update([
            'nama'          => $request->nama,
            'kelas'         => $request->kelas,
            'jurusan'       => $request->jurusan,
        ]);

        return redirect()->route('projek.index')->with(['success' => 'Data Berhasil Diubah!']);
    }

    public function destroy(string $id): RedirectResponse
    {
        $projek = Projek::findOrFail($id);

        $projek->delete();

        return redirect()->route('projek.index')->with(['success' => 'Data Berhasil Dihapus!']);
    }
}

paginate(10) adalah berapa banyak data yang akan dipisah ke halaman selanjutnya. Pastikan ada baris skrip 'use Illuminate\Http\Request;' didalam ProjekController.php.

Jika sudah seperti biasa jangan lupa di save, setelah itu masuk ke file index.blade.php yang sudah dibuat di artikel sebelumnya. Tambahkan skrip baru dibawah ini:

<!DOCTYPE html>
<html>
<head>
    <title>Daftar Data Siswa</title>
</head>
<body>
    <h1>Daftar Data Siswa</h1>
    <a href="{{ route('projek.create') }}">Tambah Data Siswa</a>
    <table>
        <thead>
            <tr>
                <th>No</th>
                <th>Nama</th>
                <th>Kelas</th>
                <th>Jurusan</th>
                <th>Action</th>
            </tr>
        </thead>
        <tbody>
            @foreach ($projek as $index => $p)
            <tr>
                <td>{{ $index + 1 + ($projek->currentPage() - 1) * $projek->perPage() }}</td>
                <td>{{ $p->nama }}</td>
                <td>{{ $p->kelas }}</td>
                <td>{{ $p->jurusan }}</td>
                <td>
                    <form onsubmit="return confirm('Apakah Anda Yakin ingin menghapus data ini?');" 
                        action="{{ route('projek.destroy', $p->id) }}" method="POST">
                        <a href="{{ route('projek.edit', $p->id) }}">Edit</a>
                        @csrf
                        @method('DELETE')
                        <button type="submit">Delete</button>
                    </form>
                </td>
            </tr>
            @endforeach
        </tbody>
    </table>

    <nav>
        <ul>
            @if ($projek->onFirstPage())
                <li><span>Sebelumnya</span></li>
            @else
                <li><a href="{{ $projek->previousPageUrl() }}">Sebelumnya</a></li>
            @endif

            @if ($projek->hasMorePages())
                <li><a href="{{ $projek->nextPageUrl() }}">Berikutnya</a></li>
            @else
                <li><span>Berikutnya</span></li>
            @endif
        </ul>
    </nav>
    <div>
        <span>Halaman {{ $projek->currentPage() }} dari {{ $projek->lastPage() }}</span>
    </div>
</body>
</html>

Jika sudah jangan lupa di save. Kemudian setelah itu, masuk ke browser dan ketikkan localhost:8000/projek. Tambahkan data hingga mencapai 11. Kalian bisa lihat dua gambar di bawah bahwa fungsi paginasi sudah bekerja dengan baik.


Namun kalau dilihat lihat, tampilan websitenya tidak ada hiasan yang menarik sama sekali. Jadi saya akan tambahkan hiasan dengan memanfaatkan bootstrap. Buka kembali index.blade.php dan perbarui skrip tersebut dengan tambahan bootstrap seperti yang dibawah:

<!DOCTYPE html>
<html>
<head>
    <title>Daftar Data Siswa</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body class="bg-light">
    <div class="container mt-5">
        <h1 class="mb-4">Daftar Data Siswa</h1>
        <a href="{{ route('projek.create') }}" class="btn btn-primary mb-3">Tambah Data Siswa</a>
        <table class="table table-striped table-bordered">
            <thead class="table-dark">
                <tr>
                    <th>No</th>
                    <th>Nama</th>
                    <th>Kelas</th>
                    <th>Jurusan</th>
                    <th>Action</th>
                </tr>
            </thead>
            <tbody>
                @foreach ($projek as $index => $p)
                <tr>
                    <td>{{ $index + 1 + ($projek->currentPage() - 1) * $projek->perPage() }}</td>
                    <td>{{ $p->nama }}</td>
                    <td>{{ $p->kelas }}</td>
                    <td>{{ $p->jurusan }}</td>
                    <td>
                        <form onsubmit="return confirm('Apakah Anda Yakin ingin menghapus data ini?');" 
                            action="{{ route('projek.destroy', $p->id) }}" method="POST">
                            <a href="{{ route('projek.edit', $p->id) }}" class="btn btn-warning btn-sm">Edit</a>
                            @csrf
                            @method('DELETE')
                            <button type="submit" class="btn btn-danger btn-sm">Delete</button>
                        </form>
                    </td>
                </tr>
                @endforeach
            </tbody>
        </table>

        <nav aria-label="Page navigation example">
            <ul class="pagination">
                @if ($projek->onFirstPage())
                    <li class="page-item disabled"><span class="page-link">Sebelumnya</span></li>
                @else
                    <li class="page-item"><a class="page-link" href="{{ $projek->previousPageUrl() }}">Sebelumnya</a></li>
                @endif

                @if ($projek->hasMorePages())
                    <li class="page-item"><a class="page-link" href="{{ $projek->nextPageUrl() }}">Berikutnya</a></li>
                @else
                    <li class="page-item disabled"><span class="page-link">Berikutnya</span></li>
                @endif
            </ul>
        </nav>
        <div class="text-center">
            <span>Halaman {{ $projek->currentPage() }} dari {{ $projek->lastPage() }}</span>
        </div>
    </div>
</body>
</html>

Setelah itu save, dan buka kembali file create.blade.php dan tambahkan skrip baru seperti berikut:

<!DOCTYPE html>
<html>
<head>
    <title>Tambah Data Siswa</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body class="bg-light">
    <div class="container mt-5">
        <h1 class="mb-4">Tambah Data Siswa</h1>
        <form action="{{ route('projek.store') }}" method="POST" class="bg-white p-4 shadow-sm rounded">
            @csrf

            <div class="mb-3">
                <label for="nama" class="form-label">Nama:</label>
                <input type="text" class="form-control" id="nama" name="nama" required>
            </div>

            <div class="mb-3">
                <label for="kelas" class="form-label">Kelas:</label>
                <input type="text" class="form-control" id="kelas" name="kelas" required>
            </div>

            <div class="mb-3">
                <label for="jurusan" class="form-label">Jurusan:</label>
                <input type="text" class="form-control" id="jurusan" name="jurusan" required>
            </div>

            <div class="d-flex justify-content-between">
                <button type="submit" class="btn btn-success">Simpan</button>
                <a href="{{ route('projek.index') }}" class="btn btn-secondary">Kembali</a>
            </div>
        </form>
    </div>
</body>
</html>

Setelah itu save dan buka kembali file edit.blade.php dan tambahkan skrip baru seperti berikut:

<!DOCTYPE html>
<html>
<head>
    <title>Edit Data Siswa</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/css/bootstrap.min.css" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0-alpha1/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body class="bg-light">
    <div class="container mt-5">
        <h1 class="mb-4">Edit Data Siswa</h1>
        <form action="{{ route('projek.update', $projek->id) }}" method="POST" class="bg-white p-4 shadow-sm rounded">
            @csrf
            @method('PUT')

            <div class="mb-3">
                <label for="nama" class="form-label">Nama:</label>
                <input type="text" class="form-control" id="nama" name="nama" value="{{ $projek->nama }}" required>
            </div>

            <div class="mb-3">
                <label for="kelas" class="form-label">Kelas:</label>
                <input type="text" class="form-control" id="kelas" name="kelas" value="{{ $projek->kelas }}" required>
            </div>

            <div class="mb-3">
                <label for="jurusan" class="form-label">Jurusan:</label>
                <input type="text" class="form-control" id="jurusan" name="jurusan" value="{{ $projek->jurusan }}" required>
            </div>

            <div class="d-flex justify-content-between">
                <button type="submit" class="btn btn-primary">Update</button>
                <a href="{{ route('projek.index') }}" class="btn btn-secondary">Kembali</a>
            </div>
        </form>
    </div>
</body>
</html>

Jika sudah jangan lupa save. Bisa dilihat bahwa tampilannya sudah semakin bagus dan enak dilihat. Namun jika kalian punya hiasan sendiri, kalian bisa menambahkannya juga. Semua skrip akan saya taruh di github saya sebagai bahan pelajaran.

Terima kasih..

Posting Komentar