Membuat sorting sederhana di Laravel

menambahkan fungsi pengurutan (sorting) ke tabel dengan ikon panah atas dan panah bawah, Anda dapat memodifikasi tampilan produk (products.index.blade.php). Berikut adalah contoh cara menambahkan fungsi pengurutan ke kolom-kolom tabel "Nama", "Harga", dan "Stok":

@extends('layouts.app')

@section('content')
    <h2>Daftar Produk</h2>
    <form action="{{ route('products.search') }}" method="GET">
        <div class="input-group mb-3">
            <input type="text" class="form-control" placeholder="Cari produk..." name="query" value="{{ request('query') }}">
            <div class="input-group-append">
                <button class="btn btn-outline-secondary" type="submit">Cari</button>
                <a href="{{ route('products.index') }}" class="btn btn-outline-secondary">Clear</a>
            </div>
        </div>
    </form>
    <table class="table">
        <thead>
            <tr>
                <th>
                    Nama
                    <a href="{{ route('products.index', ['sort' => 'asc','order' => 'name']) }}">
                        <i class="fas fa-arrow-up"></i>
                    </a>
                    <a href="{{ route('products.index', ['sort' => 'desc','order' => 'name']) }}">
                        <i class="fas fa-arrow-down"></i>
                    </a>
                </th>
                <th>
                    Harga
                    <a href="{{ route('products.index', ['sort' => 'asc','order' => 'price']) }}">
                        <i class="fas fa-arrow-up"></i>
                    </a>
                    <a href="{{ route('products.index', ['sort' => 'desc','order' => 'price']) }}">
                        <i class="fas fa-arrow-down"></i>
                    </a>
                </th>
                <th>
                    Stok
                    <a href="{{ route('products.index', ['sort' => 'asc','order' => 'stock']) }}">
                        <i class="fas fa-arrow-up"></i>
                    </a>
                    <a href="{{ route('products.index', ['sort' => 'desc','order' => 'stock']) }}">
                        <i class="fas fa-arrow-down"></i>
                    </a>
                </th>
                <th>Aksi</th>
            </tr>
        </thead>
        <tbody>
            @foreach ($products as $product)
                <tr>
                    <td>{{ $product->name }}</td>
                    <td>{{ $product->price }}</td>
                    <td>{{ $product->stock }}</td>
                    <td>
                        <a href="{{ route('products.show', $product->id) }}" class="btn btn-info">Detail</a>
                        <a href="{{ route('products.edit', $product->id) }}" class="btn btn-primary">Edit</a>
                        <form action="{{ route('products.destroy', $product->id) }}" method="POST" style="display:inline;">
                            @csrf
                            @method('DELETE')
                            <button type="submit" class="btn btn-danger" onclick="return confirm('Apakah Anda yakin ingin menghapus produk ini?')">Hapus</button>
                        </form>
                    </td>
                </tr>
            @endforeach
        </tbody>
    </table>

    <!-- Tampilkan navigasi pagination -->
    {{ $products->links() }}

    <a href="{{ route('products.create') }}" class="btn btn-success">Tambah Produk Baru</a>
@endsection

Dalam contoh di atas, setiap kolom memiliki dua tombol panah (atas dan bawah) yang mengarah ke rute yang berbeda untuk mengurutkan data sesuai dengan nama kolom dan arah pengurutan yang diinginkan (asc untuk ascending, desc untuk descending).

Pastikan Anda memiliki fontawesome atau ikon panah lainnya yang dapat digunakan di aplikasi Laravel Anda. Anda juga perlu menangani logika pengurutan di dalam ProductController berdasarkan parameter sort yang diberikan oleh URL. Misalnya, jika parameter sort adalah 'name_asc', Anda harus mengurutkan produk berdasarkan nama secara ascending. Lakukan hal serupa untuk harga dan stok.

Pastikan Font Awesome Dimuat dengan Benar:

Dalam berkas layout Anda (biasanya resources/views/layouts/app.blade.php), pastikan bahwa CSS Font Awesome telah dimuat dengan benar. Anda dapat menggunakan CDN atau menyimpan Font Awesome secara lokal. Jika Anda menggunakan CDN, letakkan baris berikut di dalam bagian <head> HTML Anda:

<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css" rel="stylesheet">

Jika Anda menyimpan Font Awesome secara lokal, pastikan path berkas yang benar digunakan dan pastikan menggunakan fungsi asset() dengan benar untuk menghasilkan URL yang tepat.

Jangan lupa sesuaikan logika pengurutan di dalam controller dengan parameter sort yang diterima. Misalnya:

    public function index(Request $request)
    {
        $query = $request->input('query');
        $order = $request->input('order', "name");
        $sort = $request->input('sort',"asc"); // Nilai default adalah 'asc' jika tidak ada parameter sort atau nilai sort tidak valid

        $products = Product::where($order, 'like', '%'.$query.'%')
                        ->orderBy($order, $sort)
                        ->paginate(5);

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

Pastikan Anda telah menyesuaikan logika pengurutan sesuai dengan nama kolom di tabel produk Anda. Dengan demikian, pengguna dapat mengurutkan produk berdasarkan kolom yang diinginkan dengan mengklik ikon panah di tabel.

Last updated