PHP Class Pagination alias Pengaturan Data per Halaman
Screenshot sebagai berikut:
Berikut php class pagination, pada script disertakan juga keterangan komentar pada file script.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 |
<?php class JinPagination { // fungsi pengaturan/option $this->blabla = "value nya blabla" function setOption($field, $value) { $this->$field = $value; } // fungsi paginasi generate array berupa total jumlah halaman, pagination, data dan posisi start // berguna untuk diatur secara fleksible terutama untuk berbasis menggunakan template function build() { // SETUP $tabel = $this->tabel; $where = $this->where; $limit = $this->limit; $order = $this->order; $page = $this->page; // SETUP OPTIONAL if(!isset($this->web_url_page)) { $web_url_page = "?page="; } else { $web_url_page = $this->web_url_page; } if(!isset($this->adjacents)) { $adjacents = "3"; } else { $adjacents = $this->adjacents; } if(!isset($this->txt_prev)) { $txt_prev = "« prev"; } else { $txt_prev = $this->txt_prev; } if(!isset($this->txt_next)) { $txt_next = "next »"; } else { $txt_next = $this->txt_next; } if(!isset($this->txt_titik)) { $txt_titik = "..."; } else { $txt_titik = $this->txt_titik; } $query = mysql_query("SELECT * FROM ".$tabel." ".$where.""); //$total_pages = mysql_fetch_array(mysql_query($query)); //$total_pages = $total_pages['num']; $total_pages = mysql_num_rows($query); if($page) { $start = ($page - 1) * $limit; //first item to display on this page } else { $start = 0; //if no page var is given, set start to 0 } // Get data. $query = "SELECT * FROM ".$tabel." ".$where." ".$order." LIMIT ".$start.", ".$limit.""; $hasil = mysql_query($query); /* Setup page vars for display. */ if ($page == 0) $page = 1; //if no page var is given, default to 1. $prev = $page - 1; //previous page is page - 1 $next = $page + 1; //next page is page + 1 $lastpage = ceil($total_pages/$limit); //lastpage is = total pages / items per page, rounded up. $lpm1 = $lastpage - 1; //last page minus 1 /* Now we apply our rules and draw the pagination object. We're actually saving the code to a variable in case we want to draw it more than once. */ $pagination = ""; if($lastpage > 1) { $pagination .= "<div class=\"pagination\">"; //previous button if ($page > 1) { $pagination .= "<a href=\"".$web_url_page.$prev."".$extra_href."\">" . $txt_prev . "</a>"; } else { $pagination .= "<span class=\"disabled\">" . $txt_prev . "</span>"; } //pages if ($lastpage < 7 + ($adjacents * 2)) { //not enough pages to bother breaking it up for ($counter = 1; $counter <= $lastpage; $counter++) { if ($counter == $page) { $pagination .= "<span class=\"current\">".$counter."</span>"; } else { $pagination .= "<a href=\"".$web_url_page.$counter."".$extra_href."\">".$counter."</a>"; } } } elseif($lastpage > 5 + ($adjacents * 2)) { //enough pages to hide some if($page < 1 + ($adjacents * 2)) { //close to beginning; only hide later pages for ($counter = 1; $counter < 4 + ($adjacents * 2); $counter++) { if ($counter == $page) { $pagination .= "<span class=\"current\">".$counter."</span>"; } else { $pagination .= "<a href=\"".$web_url_page.$counter."".$extra_href."\">$counter</a>"; } } $pagination .= $txt_titik; $pagination .= "<a href=\"".$web_url_page.$lpm1."".$extra_href."\">".$lpm1."</a>"; $pagination .= "<a href=\"".$web_url_page.$lastpage."".$extra_href."\">".$lastpage."</a>"; } elseif($lastpage - ($adjacents * 2) > $page && $page > ($adjacents * 2)) { //in middle; hide some front and some back $pagination .= "<a href=\"".$web_url_page."1".$extra_href."\">1</a>"; $pagination .= "<a href=\"".$web_url_page."2".$extra_href."\">2</a>"; $pagination .= $txt_titik; for ($counter = $page - $adjacents; $counter <= $page + $adjacents; $counter++) { if ($counter == $page) { $pagination .= "<span class=\"current\">".$counter."</span>"; } else { $pagination .= "<a href=\"".$web_url_page.$counter."".$extra_href."\">".$counter."</a>"; } } $pagination .= $txt_titik; $pagination .= "<a href=\"".$web_url_page.$lpm1."".$extra_href."\">".$lpm1."</a>"; $pagination .= "<a href=\"".$web_url_page.$lastpage."".$extra_href."\">".$lastpage."</a>"; } else { //close to end; only hide early pages $pagination .= "<a href=\"".$web_url_page."1".$extra_href."\">1</a>"; $pagination .= "<a href=\"".$web_url_page."2".$extra_href."\">2</a>"; $pagination .= $txt_titik; for ($counter = $lastpage - (2 + ($adjacents * 2)); $counter <= $lastpage; $counter++) { if ($counter == $page) { $pagination .= "<span class=\"current\">".$counter."</span>"; } else { $pagination .= "<a href=\"".$web_url_page.$counter."".$extra_href."\">".$counter."</a>"; } } } } //next button if ($page < $counter - 1) { $pagination .= "<a href=\"".$web_url_page.$next."".$extra_href."\">" . $txt_next . "</a>"; } else { $pagination .= "<span class=\"disabled\">" . $txt_next . "</span>"; $pagination .= "</div>\n"; } } // hasil dari fungsi build() return array( "pagination" => $pagination, "total" => number_format($total_pages), "hasil" => $hasil, "start" => $start ); } } // Penggunaan Class // koneksi DB // asumsikan kita sudah terkoneksi dengan database MySQL // Setting CSS $isi = ""; $isi .= " <style> /* optional */ body { background-color:#fff; font-size:11px; font-family:Verdana; margin:0; padding:0; color:#555555; } /* END - optional */ /* PAGINATION */ div.pagination { padding: 3px 0 3px 0; margin: 0; } div.pagination a { padding: 2px 5px 2px 5px; margin: 2px; border: 1px solid #AAAADD; text-decoration: none; /* no underline */ color: #000099; } div.pagination a:hover, div.pagination a:active { border: 1px solid #000099; color: #000; } div.pagination span.current { padding: 2px 5px 2px 5px; margin: 2px; border: 1px solid #000099; font-weight: bold; background-color: #000099; color: #FFF; } div.pagination span.disabled { padding: 2px 5px 2px 5px; margin: 2px; border: 1px solid #EEE; color: #DDD; } /* END - PAGINATION */ </style> "; // optional CSS display echo $isi; // bikin object $hal = new JinPagination; // setup paginasi $hal->setOption("tabel", "jaw_airport"); // nama tabel database $hal->setOption("where", "WHERE `cek_aktif`='1'"); // where kondisi, kosongkan jika tidak memakai WHERE $hal->setOption("limit", "10"); // LIMIT tampilan per halaman $hal->setOption("order", "ORDER BY `code` DESC"); // urutan, kosongkan jika tidak memakai urutan $hal->setOption("page", $_REQUEST["page"]); // setup untuk ambil variable angka halaman (berguna jika menggunakan SEO url, ubah sesuai dgn kebutuhan) $hal->setOption("web_url_page", "?page="); // setup alamat url (berguna jika menggunakan SEO url, ubah sesuai dgn kebutuhan) // optional setup $hal->setOption("adjacents", "5"); // tampil berapa angka ke kanan dan ke kiri nya, jika kita diposisi tengah halaman $hal->setOption("txt_prev", "« sebelumnya"); // mengubah text "prev" menjadi "sebelumnya" $hal->setOption("txt_next", "berikutnya »"); // mengubah text "next" menjadi "berikutnya" // generate hasil pagination $hal_array = $hal->build(); // setup penomoran $no = $hal_array["start"] + 1; // tampilkan echo "<h1>Demo Data Pagination</h1>"; echo $hal_array["pagination"]; // tampilkan pagination diatas echo "<br /><br />"; // data while($data = mysql_fetch_array($hal_array["hasil"])){ echo $no . ". " . $data['code'] . " - ".$data['nama']." <br>"; $no++; } echo "<br />"; echo "total: " . $hal_array["total"]; // tampilkan total data echo $hal_array["pagination"]; // tampilkan pagination dibawah ?> |
Demo lainnya: klik disini
Download file contoh script komplit nya:
class.pagination.rar (2.5 KiB, 5,150 hits, Updated: 14 April 2011)
semoga bermanfaat…
Tambahan:
untuk pagination Style, dapat Anda pilih disini: some-styles-for-your-pagination
bermanfaat kok bang
tp kalo aq bikin itu lepas dari db. jadi cuman perlu parameter total record sama current page aja, ntar tinggal build jadi navigation.
ide itu hasil aq nyontek di code orang sih 😈
tp yang ini pake class, lebih yahud 😳
@rlyna, makasih komentarnya 😉
owhh iya bisa juga ya diwaktu bulid nya gak perlu pake db ya…
total record sama current page aja ya.. wah iya ya bener juga…
ntar saya bikin class pagination yg versi tanpa berkutat langsung dgn db ya… jadi pengaturan db nya di waktu eksekusi di controller (istilah framework nya, halah..)
eh eh, tapi ntar di controller mesti query2 dulu dong yah untuk mendapatkan jumlah totalnya, bukannya malah jadi tambah panjang code2 pengulangannya? kan kalau yg ini, tinggal setting nama tabel, where, limit, order aja.. atau gimana yg lebih efisien dan fleksibel? yah sementara saya pakai yg ini dulu aja…
thx 😀
mantap 🙂 😛
ini script OK juga. tapi saya punya kendala nich wkt pakenya buat kasus saya.
mau nanya nich, klo untuk WHERE nya supaya bisa dirubah-rubah gimana ya? soalnya page 1 nya data keluar tapi pas page 2 datanya blank, pas dilihat ternyata isi WHERE nya kosong, jadi gmn caranya?… saya ambil nilai untuk WHERE nya dari list/menu. thanks banget.
mas, untuk nampilin misal: hal 1 dari 10 halaman gimana mas?
trims
@ian
di bagian ini bisa diubah WHERE nya terserah kita.
bisa juga ambil dari variabel menu yg ian maksudkan.
@joko
bagian akhir dari fungsi bulid() diubah seperti ini:
lalu dibagian yg ingin kita tampilkan seperti ini:
jadi tinggal nambahin “lastpage” aja ya mas, gak ada bagian lain-lain yang dirubah kan
trims
@joko
iya mas joko, silahkan dicoba sesuai komentar saya yg di atas, yaitu nambahin hasil array nya (lastpage).
semoga membantu dan terimakasih atas masukannya.
implementasinya kalo ke MS SQL Server yang connect via ODBC gimana ya?
sudah diotak-atik malah jadi bingung 🙂
diantos waleranna,,, nuhun
maaf ketinggalan,,, koneksi odbc saya seperti ini:
mudah-mudahan ada yang bisa bantu, terutama mas Jawaad.
terima kasih.
@Adi Suwarso, untuk database MS SQL, silahkan dicoba seperti ini:
dibaris yg
menjadi:
terus semua perintah mysql_query nya diubah menjadi odbc_exec.
semoga bisa membantu..
cmiiw
mas saya sudah berhasil untuk pagingnya, tapi untuk seting adjacents gak berfungsi , malah kalo gak di kaish adjacent paging nya berhasil, salah saya di mana mas? trims
Mas saya udah berhasil pake pagingnya, tapi untuk seting adjacent gak bisa, malah kalo gak dikaih seting adjacent paging bejalan dengan baik, salah saya dimana ya mas, trims
@Joko, kenapa gak bisa? saya dan teman lain dah coba bisa.. kalau aneh, default yg di class nya diubah aja mas adjcent nya..
dibagian ini:
angka 3 nya diubah aja sesuai yg mas Joko inginkan.
Adjacents ini keliatan jika halaman kita banyak.. misalnya yg ada di demo ini:
http://www.nusansifor.com/demo/pagination/?test=pagination&page=1977
di link tersebut adjacents nya 2, jadi jika di posisi halaman 1977, maka yg tampil di sebelah kanan dan kiri nya hanya 2 halaman sebelumnya dan 2 halaman setelahnya, yaitu halaman 1975, 1976 (kiri) dan 1978, 1979 (kanan).
mas,,saya menginginkan file class nya terpisah..bagai mana ya..jadi class pagination ini berbeda file dengan penggunaanya…
kan contoh yang ini di gabung..saya udah nyoba tapi gak berhasil..tolong ya mas..trims
sudah bisa mas..tapi sekarang bingung,, kalo saya menggunakan searching,,paging itu ga berfungsi…jadi harus gimana ya??thanks…
@wie, file php pagination class ini memang di-design supaya bisa jalan dengan file terpisah.. dan class memang biasanya jg seperti itu sifatnya, supaya tidak boros copy-paste script.
Logika untuk searching, pada penggunaan setup, sesuaikan pada baris berikut:
sesuaikan WHERE kondisi nya sesuai dengan search, dan alamat url web juga sesuaikan dengan variabel search nya… gunakan variabel dari $_GET, dan method searchnya gunakan GET jangan POST.
contoh pencarian kata “test”:
blabla.com/?search=test
maka setupnya sbb:
silahkan dicoba, semoga membantu.
Thx bos, saya sudah coba, saya gabung dengan script dasar punya saya (maksudnya yang saya pelajari dari tutorial para master) dan berjalan dengan baik.
Mas Jawaad, scriptnya jalan bagus dan cukup mudah dimengerti sehingga bisa disesuaikan dengan kebutuhan untuk tampilannya di web kita,
hanya saya kesulitan untuk mengcustomize link2 halamannya, tidak seperti paginator.class yang pernah saya pakai (yang memang untuk pemula seperti saya sangat susah dimengerti).
sebagai contoh :
members.php?perintah=anggota&sorting=tanggal
file members.php (induk) meng-include file anggota.php yang berfungsi menghubungi database dan memformat halaman serta memanggil JinPagination.class.php
maka link2 halaman yang dihasilkan menjadi (contoh):
members.php?page=8
padahal kondisi link yang diinginkan:
members.php?perintah=anggota&page=8&sorting=tanggal
sehingga anggota.php bisa diinclude kembali oleh members.php dengan parameter setelahnya.
mudah-mudahan kalimat saya tidak membingungkan 🙂 dan mudah-mudahan mas Jawaad bisa bantu implementasikan 😉
hatur tengkyu… (maaf kepanjangan)
@Mas Adi Suwarso,
PHP class Pagination yg ini di set supaya bisa fleksibel, jadi tinggal atur set-up an kita saja mas.
lihat bagian ini mas di contoh script:
lalu sesuaikan dengan kebutuhan:
misalkan kasus seperti mas, kita asumsikan begini:
Btw, mas Suwarso kasusnya mirip dengan yg wie utarakan diatas. Yaitu setup bagian web_url_page dan WHERE.
Terimakasih atas komentarnya
🙁 kehilangan data setelah memodifikasi script ini,,, pantang menyerah, baca ulang 🙂
mas Jawaad, untuk kasus terakhir belum saya coba praktekan, tapi kepikiran sesuatu sehingga saya tambahkan beberapa baris pada script tersebut, mohon commentnya betul atau salah 😉
eh hanya 2 barus ya 🙂
######original line
// SETUP
$tabel = $this->tabel;
$where = $this->where;
$limit = $this->limit;
$order = $this->order;
$page = $this->page;
######modified to
// SETUP
$tabel = $this->tabel;
$where = $this->where;
$selection = $this->selection; //opsi kalau tidak mau semua field di select
$limit = $this->limit;
$order = $this->order;
$page = $this->page;
######original line
// bikin object
$hal = new JinPagination;
// setup paginasi
$hal->setOption(“tabel”, “barang”); // nama tabel database
$hal->setOption(“selection”, “kodebrg, hargajual, hargajual1”); // field yang akan di select beri “*” kalau mau semua field di select
$hal->setOption(“where”, “WHERE hargajual > 90000”); // where kondisi, kosongkan jika tidak memakai WHERE
$hal->setOption(“limit”, “15”); // LIMIT tampilan per halaman
$hal->setOption(“order”, “ORDER BY hargajual ASC”); // urutan, kosongkan jika tidak memakai urutan
$hal->setOption(“page”, $_REQUEST[“page”]); // setup untuk ambil variable angka halaman (berguna jika menggunakan SEO url, ubah sesuai dgn kebutuhan)
######modified line
// bikin object
$hal = new JinPagination;
// setup paginasi
$hal->setOption(“tabel”, “barang”); // nama tabel database
$hal->setOption(“selection”, “kodebrg, hargajual, hargajual1”); // field yang akan di select beri “*” kalau mau semua field di select
$hal->setOption(“where”, “WHERE hargajual > 90000”); // where kondisi, kosongkan jika tidak memakai WHERE
$hal->setOption(“limit”, “15”); // LIMIT tampilan per halaman
$hal->setOption(“order”, “ORDER BY hargajual ASC”); // urutan, kosongkan jika tidak memakai urutan
$hal->setOption(“page”, $_REQUEST[“page”]); // setup untuk ambil variable angka halaman (berguna jika menggunakan SEO url, ubah sesuai dgn kebutuhan)
mudah-mudahan tidak salah dan tidak mengganggu 🙂
wakkk, jelek amat tampilan comment saya,,, gimana caranya supaya pada comment baris-baris script code masuk kedalam kotak ‘source’ seperti mas seperti punyanya mas Jawaad ya?
🙂
yup,,, malah bingung 🙂
######original line
$var_tambahan = ”;
if(isset($_GET[‘perintah’])) {
$var_tambahan .= “perintah=”.$_GET[‘perintah’].”&”;
}
if(isset($_GET[‘sorting’])) {
$var_tambahan .= “sorting=”.$_GET[‘sorting’].”&”;
}
$hal->setOption(“web_url_page”, “?”.$var_tambahan.”page=”);
ganti jadi:
######modified line
$var_tambahan = ‘perintah=daftarharga&sorting=tanggal&’;
$hal->setOption(“web_url_page”, “?”.$var_tambahan.”page=”); // setup alamat url (berguna jika menggunakan SEO url, ubah sesuai dgn kebutuhan)
maaf, kelebihannya apa mas kalo saya pake baris-baris yang mas Jawaad kasih (belum terpikir), yang saya rubah malah terlalu simpel ya…
ato ada kekurangan tambahan baris pada script class-nya? kayaknya pertanyaan yang gak nyambung ya 🙁
sorry…
@Adi Suwarso, mas untuk komen code silahkan pakai
…
Oya mas, itu bagian yg mas ubah:
*) kok perintah nya selalu daftarharga dan sortingnya selalu tanggal? kalau tidak dinamis, mendingan langsung aja dibagian web_url_page. jadi begini:
itu hanya contoh saja mas… 🙂
pada implementasinya itu memang harus dinamis kok,,, masih pengembangan jadi masih bolak-balik di ‘daftarharga’ dan tanggal 😉
nantinya pagination ini akan dijalankan sesuai perintah yang diberikan…
terima kasih
Bagaimana kalau search-nya menggunakan metode POST
@Stiksa Eureka, kalau pakai method POST, class nya mesti diubah $web_url_page nya dengan menggunakan variable hidden post.
Semoga membantu.
sebenarnya masih bingung tapi biar saya coba cari dulu tutorial penggunaan variable hidden post.
@Stiksa Eureka, oiya tinggal ubah saja bagian:
Yang tadinya pakai $_GET.
diubah menjadi pakai $_POST.
semoga membantu.
Nanya lagi, saya pake WP, bagaimana memanggil sticky post di wordpress (maaf kalo banyak nanya)
Soalnya gini saya make wp, tapi untuk halaman index-nya saya mau kombinasi dengan script ini, maksudnya biar lebih bebas mengatur tampilan.
@Stiksa Eureka, Kalau pakai WP, mendingan pakai Plugin saja.
http://wordpress.org/extend/plugins/wp-pagenavi/
Makasih Mas.
pak,,, minta contoh tabelnya,, saya kesulitan memodifikasi dengan tabel daya terima kasih, mohon di kirim ke email saya putrablora@yahoo.co.id
@Budi,
Tabel pakai kode html sederhana saja kan?
Kalau Anda sudah ada tabelnya tinggal copy paste aja.
Ini contoh tabel:
mas, emang aplikasi ini kita bisa menghasilkan uang ya mas…?
Gan, link download class.pagination nya sudah gak aktif lagi ya….
hiks..hiks hiks…
jadi kagak bisa ikotan download nya
@Supriyadi, bisa kok gan, silahkan dicoba.