Thursday, March 23, 2017

PHP - Membuat Paging Halaman tanpa DataTables

PHP - Membuat Paging Halaman tanpa DataTables


Beberapa waktu lalu saya telah berbagi tentang cara membuat pagination sederhana. Pagination tersebut memiliki kekurangan yaitu ketika datanya sangat banyak misalkan hingga ratusan atau ribuan baris, maka tombol paging yang tercetak pasti banyak juga. Walaupun sebenarnya tidak terlalu bermasalah, namun dari sisi estetika dan kemudahan akses akan sangat tidak nyaman. Oleh karena itu, pada tulisan ini, saya akan berbagi tentang cara membuat pagination yang lebih baik.

Pagination selanjutnya digunakan untuk menangani masalah paging dengan jumlah halaman lebih atau sangat banyak. Pembuatan paging yang mungkin kurang tepat jika dibuat dengan menggunakan JQuery DataTables. Ketika membuat pagination ini, aturan saya adalah jumlah halaman lebih dari 5(Anda bisa mengatur ulang sesuai dengan kebutuhan). Asumsi bahwa saat ini Anda memiliki kasus dimana paging mencapai 20 halaman atau lebih. Dari sini buat kondisi yaitu seperti dibawah ini:
Catatan:
  • N = 20, jumlah N adalah jumlah paging;
  • n = posisi halaman paging;
  • nn = halaman paling awal, yaitu 1
  • n+1 = nilai posisi page saat ini + 1 

Petunjuk pengkondisian beserta contohnya:

    >> N = 20
    >> jika n = 1
    >> print   n, n+1, n+2, dan N
    >> jika n = 2
    >> print  nn,   n, n+1, dan N
    >> jika n = 3
    >> print  nn, n-1,   n,  n+1, dan N
    >> jika n = 18
    >> print  nn, n-1,   n,  n+1, dan N
    >> jika n = 19
    >> print  nn, n-1,   n,     N
    >> jika n = 20
    >> print  nn, n+2, n-1, dan n 
    

    Paging

    Buat file apapun.php, isinya adalah kode untuk membuat paging menggunakan php, yaitu kode di bawah ini:
    <?php
    //koneksi dan menentukan database
    mysql_select_db("nama_database_anda", mysql_connect("lokasi_hosting(contoh:localhost)", "isi_dengan_username", "isi_dengan_password"));
    
    //index awal data yang ingin ditampilkan
    $default_index = 0;
    
    //batasan menampilkan data
    $default_batas = 10;
    
    //jika terdapat nilai batas di URL, gunakan untuk mengganti nilai default $default_batas
    if(isset($_GET['batas']))
    {
        $default_batas = $_GET['batas'];
    }
    
    //nomor halaman default
    $nomor_halaman = 1;
    
    //jika terdapat nilai halaman di URL, gunakan untuk mengganti nilai dafault dari $default_index
    if(isset($_GET['halaman']))
    {
        $default_index = ($_GET['halaman']-1) * $default_batas;
        $nomor_halaman = $_GET['halaman'];
    }
    
    /*
     * ambil beberapa data kolom di tabel dengan data yang ditayangkan
     * mulai dari index ke ($default_index) dengan jumlah hingga
     * sebanyak ($default_batas)
    */
    $ambil_data = mysql_query("SELECT Name, Region, Population, GNP FROM country limit ".$default_index.", ".$default_batas);
    
    #menghitung total baris di tabel country
    $total_baris = mysql_num_rows(
            //mengambil data di tabel country
            mysql_query("SELECT * FROM country")
        );
    
    # MEMBUAT TOMBOL PAGING
    
    //inisiasi variabel yang memuat nomor halaman
    $nomor_paging = 1;
    
    //inisiasi variabel yang memuat total halaman
    $total_paging = 0;
    $html_paging = "<ul class='pagination'>";
    
    /* asumsi nilai $total_baris adalah ganjil, contoh sederhana adalah sebagai berikut:
     * ===============================================================
     * misalkan data ada 5 baris, dan ditayangkan 2 baris per-halaman,
     * maka untuk menghitung jumlah halamannya yaitu dengan mengurangi
     * nilai 5 dengan 2 berturut-turut hingga bernilai kurang dari 2
     * (yaitu : 1) yang masih ditampung di $total_baris
     
     * asumsi nilai $total_baris adalah genap, contoh sederhana adalah sebagai berikut:
     * ===============================================================
     * misalkan data ada 4 baris, dan ditayangkan 2 baris per-halaman,
     * cara menghitung sama seperti asumsi ganjil, hanya saja tidak ada
     * nilai sisa
    */
    while($total_baris - $default_batas > 0)
    {
        $total_paging = $nomor_paging;
        $nomor_paging++;
        $total_baris -= $default_batas;
    }
    /*
     * asumsi nilai $total_baris adalah ganjil
     * tersisa 1 baris lagi untuk ditayangkan yang value nya berada di $total_baris
    */
    if($total_baris > 0)
    {
        $total_paging = $nomor_paging;
    }
    
    #PENGKONDISIAN UNTUK TOTAL PAGING
    $numerik_paging = "";
    //jika paging yang dibutuhkan banyak
    if($total_paging >= 6)
    {
        for($a = 1; $a <= $total_paging; $a++){
            if($a == $nomor_halaman && $a == 1)
                $numerik_paging =   "<li class='active'><a href='?halaman=".$a."&batas=".$default_batas."'>".$a."</a></li>
                                    <li><a href='?halaman=".($a+1)."&batas=".$default_batas."'>".($a+1)."</a></li>
                                    <li><a href='?halaman=".($a+2)."&batas=".$default_batas."'>".($a+2)."</a></li>
                                    <li><a href='?halaman=".($total_paging)."&batas=".$default_batas."'>&gt;</a></li>";
            if($a == $nomor_halaman && $a == 2)
                $numerik_paging =   "<li><a href='?halaman=1&batas=".$default_batas."'>1</a></li>
                                    <li class='active'><a href='?halaman=".$a."&batas=".$default_batas."'>".$a."</a></li>
                                    <li><a href='?halaman=".($a+1)."&batas=".$default_batas."'>".($a+1)."</a></li>
                                    <li><a href='?halaman=".($a+1)."&batas=".$default_batas."'>&gt;</a></li>";
            if($a == $nomor_halaman && $a >= 3)
                $numerik_paging =   "<li><a href='?halaman=1&batas=".$default_batas."'>&lt;</a></li>
                                    <li><a href='?halaman=".($a-1)."&batas=".$default_batas."'>".($a-1)."</a></li>
                                    <li class='active'><a href='?halaman=".$a."&batas=".$default_batas."'>".$a."</a></li>
                                    <li><a href='?halaman=".($a+1)."&batas=".$default_batas."'>".($a+1)."</a></li>
                                    <li><a href='?halaman=".$total_paging."&batas=".$default_batas."'>&gt;</a></li>";
            if($a == $nomor_halaman && $a + 2 == $total_paging)
                $numerik_paging =   "<li><a href='?halaman=1&batas=".$default_batas."'>&lt;</a></li>
                                    <li><a href='?halaman=".($a-1)."&batas=".$default_batas."'>".($a-1)."</a></li>
                                    <li class='active'><a href='?halaman=".($a+1)."&batas=".$default_batas."'>".$a."</a></li>
                                    <li><a href='?halaman=".($a+1)."&batas=".$default_batas."'>".($a+1)."</a></li>
                                    <li><a href='?halaman=".$total_paging."&batas=".$default_batas."'>&gt;</a></li>";
            if($a == $nomor_halaman && $a + 1 == $total_paging)
                $numerik_paging =   "<li><a href='?halaman=1&batas=".$default_batas."'>&lt;</a></li>
                                    <li><a href='?halaman=".($a-1)."&batas=".$default_batas."'>".($a-1)."</a></li>
                                    <li class='active'><a href='?halaman=".$a."&batas=".$default_batas."'>".$a."</a></li>
                                    <li><a href='?halaman=".($a+1)."&batas=".$default_batas."'>".$total_paging."</a></li>";
            if($a == $nomor_halaman && $a == $total_paging)
                $numerik_paging =   "<li><a href='?halaman=1&batas=".$default_batas."'>&lt;</a></li>
                                    <li><a href='?halaman=".($a-2)."&batas=".$default_batas."'>".($a-2)."</a></li>
                                    <li><a href='?halaman=".($a-1)."&batas=".$default_batas."'>".($a-1)."</a></li>
                                    <li class='active'><a href='?halaman=".$a."&batas=".$default_batas."'>".$a."</a></li>";
        }
    
    //jika paging yang dibutuhkan sedikit:
    }else if($total_paging < 6){
        for($a = 1; $a <= $total_paging; $a++){
            if($a == $nomor_halaman)
                $numerik_paging =   "<li class='active'><a href='?halaman=".$a."&batas=".$default_batas."'>".$a."</a></li>";
            else
                $numerik_paging =   "<li><a href='?halaman=".$a."&batas=".$default_batas."'>".$a."</a></li>";
        }
    }
    
    $html_paging .= $numerik_paging."</ul>";
    
    # MEMBUAT TABEL YANG MENAYANGKAN DATA
    $output_html = "<table class='table table-bordered'>".
                        "<tr>".
                            "<th>Nomor</th>".
                            "<th>Name</th>".
                            "<th>Region</th>".
                            "<th>Population</th>".
                            "<th>GNP</th>".
                        "<tr/>";
    
    //perulangan membuat list data
    $nomor_baris = $default_index + 1;
    while($data = mysql_fetch_assoc($ambil_data))
    {
        $output_html .= "<tr>".
                            "<td>".$nomor_baris."</td>".
                            "<td>".$data["Name"]."</td>".
                            "<td>".$data["Region"]."</td>".
                            "<td>".$data["Population"]."</td>".
                            "<td>".$data["GNP"]."</td>".
                        "</tr>";
        $nomor_baris++;
    }
    $output_html .= "</table>";
    ?>
    <html>
        <head>
            <meta charset="utf8">
            <meta content="width:device-width;initial-scale:1">
            <!--styling instan dengan memanfaatkan framework bootstrap-->
            <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"/>
            <title>dhan - Sample Pagination</title>
        </head>
        <body>
            <div class="container">
                <h2>Sample Pagination</h2>
                <h5>Menggunakan sample database world.sql dari Mysql</h5>
            </div>
            <div class="container">
                <div class="form-group" style="float:left">
                    <span>Tampilkan hingga :</span>
                    <input name='batas-baris' value='<?php echo $default_batas?>'/>
                    <span>baris</span>
                    <button id="batas" class="btn btn-danger btn-sm">Terapkan</button>
                    <script>
                        document.getElementById("batas").addEventListener("click", function(){
                            batas_baris          = document.getElementsByName('batas-baris')[0].value;
                            window.location.href = "?halaman=1&batas="+batas_baris;
                        });
                    </script>
                </div>
                <!--tayangkan tabel country-->
                <?php echo $output_html?>
                <?php echo $html_paging?>
            </div>
        </body>
    </html>

    Sample Data 

    Untuk melakukan uji coba, Anda bisa memanfaatkan sample data dari MySQL yang saya gunakan untuk menulis tutorial ini, Anda bisa mengaksesnya melalui link download mysql sample world database.

    Demo 

    Anda dapat mencoba hasil dari penerapan kode di atas melalui halaman demo Sample Pagination
    Sekian dari tulisan ini, jika terdapat kendala atau memiliki pertanyaan lain, silahkan tulisan melalui komentar

    0 on: "PHP - Membuat Paging Halaman tanpa DataTables"