Untuk keperluan navigasi data biasanya disajikan dengan link berupa nomor halaman atau kadang berbentuk Previous dan Next.
Pada tutorial ini akan dipaparkan bagaimana ide membuat advance paging ini dilakukan. Advance paging adalah paging yang navigasinya berbentuk
1 2 3 4 … 20 Next >>
Contoh tampilan di atas diasumsikan terdapat 20 halaman paging dan halaman yang sedang aktif adalah halaman 1. Bila yang aktif halaman 10, maka tampilan navigasinya adalah:
<< Prev 1 ... 7 8 9 10 11 12 13 … 20 Next >>
Sedangkan bila yang aktif adalah halaman terakhir (20) maka tampilan navigasinya adalah
<< Prev 1 .. 17 18 19 20
Dalam contoh ini kasus advance paging ini akan diterapkan pada data guestbook atau buku tamu. Istilah ‘advance paging’ ini adalah istilah saya saja sih
Mau tau bagaimana ide dan cara membuatnya? simak baik-baik artikel ini. Artikel ini merupakan request dari mas Sadeli (salah satu member saya)
Pertama kita siapkan terlebih dahulu tabel untuk menyimpan datanya:
1.
CREATE
TABLE
guestbook (
2.
id
int
(11) auto_increment,
3.
nama
varchar
(20),
4.
email
varchar
(20),
5.
tanggal
date
,
6.
komentar text,
7.
PRIMARY
KEY
(id)
8.
)
show.php
01.
02.
03.
// koneksi ke mysql
04.
05.
mysql_connect(
'namahost'
,
'dbuser'
,
'dbpassword'
);
06.
mysql_select_db(data);
07.
08.
// jumlah data yang akan ditampilkan per halaman
09.
10.
$dataPerPage
= 5;
11.
.
12.
.
13.
.
14.
?>
http://namaserver/show.php
maka otomatis menuju ke halaman 1. Untuk menuju ke halaman 2, maka URL nya http://namaserver/show.php?page=2
. Sedangkan untuk menuju ke halaman 3, URL nya http://namaserver/show.php?page=3
, dan seterusnya. Dari skenario di atas tampak bahwa bila parameter
?page=...
belum diberikan pada URL maka secara otomatis menuju ke nomor halaman
1. Sedangkan bila terdapat parameter ?page=… maka nomor halamannya
menyesuaikan nilai pada parameter ?page tersebut. Untuk mewujudkan hal
ini, maka kita tambahkan perintah01.
02.
mysql_connect(
'namahost'
,
'dbuser'
,
'dbpassword'
);
03.
mysql_select_db(
'dbname'
);
04.
05.
// jumlah data yang akan ditampilkan per halaman
06.
07.
$dataPerPage
= 5;
08.
09.
// apabila $_GET['page'] sudah didefinisikan, gunakan nomor halaman tersebut,
10.
// sedangkan apabila belum, nomor halamannya 1.
11.
12.
if
(isset(
$_GET
[
'page'
]))
13.
{
14.
$noPage
=
$_GET
[
'page'
];
15.
}
16.
else
$noPage
= 1;
17.
.
18.
.
19.
?>
Trus.. apa kaitannya offset dengan paging? Sabar… perhatikan dulu contoh berikut ini
Sebagai contoh, misalkan terdapat 15 data dalam tabel guestbook dimana kita ingin menyajikan pada setiap halaman adalah 5 data. Dengan demikian total terdapat 3 halaman dalam pagingnya. Untuk halaman pertama, pastilah data yang ditampilkan adalah data ke รข€“ 0, 1, 2, 3 dan 4. Sedangkan halaman kedua, data yang ditampilkan adalah 5, 6, 7, 8, dan 9. Serta halaman ketiga, data ke 10, 11, 12, 13, 14.
Nah… perhatikan bahwa untuk halaman 1, data awal yang ditampilkan adalah data pada urutan ke-0, halaman 2 data awalnya adalah data pada urutan ke-5 dan halaman 3 data pada urutan ke 10.
Lantas apa gunanya offset tersebut? Offset nantinya akan digunakan pada query SQL untuk memunculkan data pada setiap halaman. Query SQL yang digunakan adalah
1.
SELECT
*
FROM
guestbook LIMIT offset, jumlahData;
1.
SELECT
*
FROM
guestbook LIMIT 0, 5;
1.
SELECT
*
FROM
guestbook LIMIT 5, 5;
1.
SELECT
*
FROM
guestbook LIMIT 10, 5;
OK.. deh.. dah paham, trus yang jadi masalah adalah bagaimana menentukan offset pada setiap halamannya? Bila kita lihat patternnya, maka hubungan antara offset, jumlah data yang ingin ditampilkan per halaman dan nomor halamannya adalah:
offset = (no halaman – 1) * jumlah data per halaman;Lho kok bisa? he.. 3x kita cek saja. Untuk halaman 1, maka nilai offset = (1 – 1) * 5 = 0. Untuk halaman 2, nilai $offset = (2 – 1) * 5 = 5 dan halaman ketiga $offset = (3 – 1) * 5 = 10. Bener kan?
OK.. deh, dah paham tentang offset, so.. kita bisa tambahkan scriptnya untuk mencari offset dan query SQL nya.
01.
02.
mysql_connect(
'namahost'
,
'dbuser'
,
'dbpassword'
);
03.
mysql_select_db(
'dbname'
);
04.
05.
// jumlah data yang akan ditampilkan per halaman
06.
07.
$dataPerPage
= 5;
08.
09.
// apabila $_GET['page'] sudah didefinisikan, gunakan nomor halaman tersebut,
10.
// sedangkan apabila belum, nomor halamannya 1.
11.
12.
if
(isset(
$_GET
[
'page'
]))
13.
{
14.
$noPage
=
$_GET
[
'page'
];
15.
}
16.
else
$noPage
= 1;
17.
18.
// perhitungan offset
19.
20.
$offset
= (
$noPage
- 1) *
$dataPerPage
;
21.
22.
// query SQL untuk menampilkan data perhalaman sesuai offset
23.
24.
$query
=
"SELECT * FROM guestbook LIMIT $offset, $dataPerPage"
;
25.
26.
$result
= mysql_query(
$query
)
or
die
(
'Error'
);
27.
28.
// menampilkan data
29.
30.
echo
""
;
31.
echo
"
Nama
Email
Tanggal
Komentar
"
;
32.
while
(
$data
= mysql_fetch_array(
$result
))
33.
{
34.
echo
"
"
.
$data
[
'nama'
].
"
"
.
$data
[
'email'
].
"
".
$data
[
'tanggal'
].
"
".
$data
[
'komentar'
].
"
";
35.
}
36.
37.
echo
"
;
38.
39.
.
40.
.
41.
42.
?>
jumlah halaman = ceil(jumlah data / data per halaman);ceil() adalah function yang digunakan untuk membulatkan ke atas suatu bilangan. Misal ceil(3.2) = 4, ceil(3.7) = 4.
Trus… yang jadi masalah adalah bagaimana mendapatkan jumlah datanya? Nah… untuk mendapatkan jumlah data keseluruhan yang ada kita gunakan query SQL.
1.
SELECT
COUNT
(*)
FROM
guestbook;
01.
02.
mysql_connect(
'namahost'
,
'dbuser'
,
'dbpassword'
);
03.
mysql_select_db(
'dbname'
);
04.
05.
// jumlah data yang akan ditampilkan per halaman
06.
07.
$dataPerPage
= 5;
08.
09.
// apabila $_GET['page'] sudah didefinisikan, gunakan nomor halaman tersebut,
10.
// sedangkan apabila belum, nomor halamannya 1.
11.
12.
if
(isset(
$_GET
[
'page'
]))
13.
{
14.
$noPage
=
$_GET
[
'page'
];
15.
}
16.
else
$noPage
= 1;
17.
18.
// perhitungan offset
19.
20.
$offset
= (
$noPage
- 1) *
$dataPerPage
;
21.
22.
// query SQL untuk menampilkan data perhalaman sesuai offset
23.
24.
$query
=
"SELECT * FROM guestbook LIMIT $offset, $dataPerPage"
;
25.
26.
$result
= mysql_query(
$query
);
27.
28.
// menampilkan data
29.
30.
echo
""
;
31.
echo
"
Nama
Email
Tanggal
Komentar
"
;
32.
while
(
$data
= mysql_fetch_array(
$result
))
33.
{
34.
echo
"
"
.
$data
[
'nama'
].
"
"
.
$data
[
'email'
].
"
".
$data
[
'tanggal'
].
"
".
$data
[
'komentar'
].
"
";
35.
}
36.
37.
echo
"
;
38.
39.
// mencari jumlah semua data dalam tabel guestbook
40.
41.
$query
=
"SELECT COUNT(*) AS jumData FROM guestbook"
;
42.
$hasil
= mysql_query(
$query
);
43.
$data
= mysql_fetch_array(
$hasil
);
44.
45.
$jumData
=
$data
[
'jumData'
];
46.
47.
// menentukan jumlah halaman yang muncul berdasarkan jumlah semua data
48.
49.
$jumPage
=
ceil
(
$jumData
/
$dataPerPage
);
50.
.
51.
.
52.
53.
?>
Tapi eit.. tunggu dulu pada desain advance paging di atas, sebelum memunculkan link nomor halaman, terdapat link << prev. Kapan link ini akan muncul? ya... tepat sekali yaitu ketika nomor halaman yang sedang aktif (sedang dibuka) setelah halaman pertama atau $noPage > 1. Trus.. menuju ke nomor halaman berapakah link tersebut? yap.. benar yaitu menuju ke nomor halaman sebelumnya ($noPage – 1).
Dengan demikian kita bisa tambahkan perintah berikut ini pada script
1.
if
(
$noPage
> 1)
echo
"']."?page=".($noPage-1)."'
><< Prev
";
01.
02.
mysql_connect(
'namahost'
,
'dbuser'
,
'dbpassword'
);
03.
mysql_select_db(
'dbname'
);
04.
05.
// jumlah data yang akan ditampilkan per halaman
06.
07.
$dataPerPage
= 5;
08.
09.
// apabila $_GET['page'] sudah didefinisikan, gunakan nomor halaman tersebut,
10.
// sedangkan apabila belum, nomor halamannya 1.
11.
12.
if
(isset(
$_GET
[
'page'
]))
13.
{
14.
$noPage
=
$_GET
[
'page'
];
15.
}
16.
else
$noPage
= 1;
17.
18.
// perhitungan offset
19.
20.
$offset
= (
$noPage
- 1) *
$dataPerPage
;
21.
22.
// query SQL untuk menampilkan data perhalaman sesuai offset
23.
24.
$query
=
"SELECT * FROM guestbook LIMIT $offset, $dataPerPage"
;
25.
26.
$result
= mysql_query(
$query
)
or
die
(
'Error'
);
27.
28.
// menampilkan data
29.
30.
echo
""
;
31.
echo
"
Nama
Email
Tanggal
Komentar
"
;
32.
while
(
$data
= mysql_fetch_array(
$result
))
33.
{
34.
echo
"
"
.
$data
[
'nama'
].
"
"
.
$data
[
'email'
].
"
".
$data
[
'tanggal'
].
"
".
$data
[
'komentar'
].
"
";
35.
}
36.
37.
echo
"
;
38.
39.
// mencari jumlah semua data dalam tabel guestbook
40.
41.
$query
=
"SELECT COUNT(*) AS jumData FROM guestbook"
;
42.
$hasil
= mysql_query(
$query
);
43.
$data
= mysql_fetch_array(
$hasil
);
44.
45.
$jumData
=
$data
[
'jumData'
];
46.
47.
// menentukan jumlah halaman yang muncul berdasarkan jumlah semua data
48.
49.
$jumPage
=
ceil
(
$jumData
/
$dataPerPage
);
50.
51.
// menampilkan link previous
52.
53.
if
(
$noPage
> 1)
echo
"']."?page=".($noPage-1)."'
><< Prev
";
54.
.
55.
.
56.
57.
?>
01.
for
(
$page
= 1;
$page
<=
$jumPage
;
$page
++)
02.
{
03.
if
(((
$page
>=
$noPage
- 3) && (
$page
<=
$noPage
+ 3)) || (
$page
== 1) || (
$page
==
$jumPage
))
04.
{
05.
if
((
$showPage
== 1) && (
$page
!= 2))
echo
"..."
;
06.
if
((
$showPage
!= (
$jumPage
- 1)) && (
$page
==
$jumPage
))
echo
"..."
;
07.
if
(
$page
==
$noPage
)
echo
" "
.
$page
.
"
;
08.
else
echo
" ']."?page=".$page."'
>".
$page
.
"
"
;
09.
$showPage
=
$page
;
10.
}
11.
}
Maksud dari syarat
1.
if
(((
$page
>=
$noPage
- 3) && (
$page
<=
$noPage
+ 3)) || (
$page
== 1) || (
$page
==
$jumPage
))
2.
{
3.
.
4.
.
5.
}
1 4 5 6 7 8 9 10 15
Anda dapat mengubah rentang halaman sesuai yang diinginkan.
Perintah
1.
if
((
$showPage
== 1) && (
$page
!= 2))
echo
"..."
;
Demikian pula untuk perintah
1.
if
((
$showPage
!= (
$jumPage
- 1)) && (
$page
==
$jumPage
))
echo
"..."
;
Sehingga dari kedua perintah di atas diharapkan akan menampilkan nomor halaman seperti di bawah ini
1 … 4 5 6 7 8 9 10 … 15 (bila yang aktif adalah halaman 7)
1 2 3 4 5 6… 15 (bila yang aktif adalah halaman 2)
1 … 10 11 12 13 14 15 (bila yang aktif adalah halaman 13)
Sedangkan perintah
1.
if
(
$page
==
$noPage
)
echo
" "
.
$page
.
"
;
2.
else
echo
" ']."?page=".$page."'
>".
$page
.
"
"
;
Terakhir.. kita perlu link untuk memunculkan next >>. OK kapan link ini muncul? ya benar… yaitu ketika halaman yang sedang aktif bukanlah pada halaman terakhir atau sebelum halaman terakhir. Sehingga kita bisa tambahkan perintah
1.
if
(
$noPage
<
$jumPage
)
echo
"']."?page=".($noPage+1)."'
>Next >>
";
01.
02.
mysql_connect(
'namahost'
,
'dbuser'
,
'dbpassword'
);
03.
mysql_select_db(
'dbname'
);
04.
05.
// jumlah data yang akan ditampilkan per halaman
06.
07.
$dataPerPage
= 5;
08.
09.
// apabila $_GET['page'] sudah didefinisikan, gunakan nomor halaman tersebut,
10.
// sedangkan apabila belum, nomor halamannya 1.
11.
12.
if
(isset(
$_GET
[
'page'
]))
13.
{
14.
$noPage
=
$_GET
[
'page'
];
15.
}
16.
else
$noPage
= 1;
17.
18.
// perhitungan offset
19.
20.
$offset
= (
$noPage
- 1) *
$dataPerPage
;
21.
22.
// query SQL untuk menampilkan data perhalaman sesuai offset
23.
24.
$query
=
"SELECT * FROM guestbook LIMIT $offset, $dataPerPage"
;
25.
26.
$result
= mysql_query(
$query
)
or
die
(
'Error'
);
27.
28.
// menampilkan data
29.
30.
echo
""
;
31.
echo
"
Nama
Email
Tanggal
Komentar
"
;
32.
while
(
$data
= mysql_fetch_array(
$result
))
33.
{
34.
echo
"
"
.
$data
[
'nama'
].
"
"
.
$data
[
'email'
].
"
".
$data
[
'tanggal'
].
"
".
$data
[
'komentar'
].
"
";
35.
}
36.
37.
echo
"
;
38.
39.
// mencari jumlah semua data dalam tabel guestbook
40.
41.
$query
=
"SELECT COUNT(*) AS jumData FROM guestbook"
;
42.
$hasil
= mysql_query(
$query
);
43.
$data
= mysql_fetch_array(
$hasil
);
44.
45.
$jumData
=
$data
[
'jumData'
];
46.
47.
// menentukan jumlah halaman yang muncul berdasarkan jumlah semua data
48.
49.
$jumPage
=
ceil
(
$jumData
/
$dataPerPage
);
50.
51.
// menampilkan link previous
52.
53.
if
(
$noPage
> 1)
echo
"']."?page=".($noPage-1)."'
><< Prev
";
54.
55.
// memunculkan nomor halaman dan linknya
56.
57.
for
(
$page
= 1;
$page
<=
$jumPage
;
$page
++)
58.
{
59.
if
(((
$page
>=
$noPage
- 3) && (
$page
<=
$noPage
+ 3)) || (
$page
== 1) || (
$page
==
$jumPage
))
60.
{
61.
if
((
$showPage
== 1) && (
$page
!= 2))
echo
"..."
;
62.
if
((
$showPage
!= (
$jumPage
- 1)) && (
$page
==
$jumPage
))
echo
"..."
;
63.
if
(
$page
==
$noPage
)
echo
" "
.
$page
.
"
;
64.
else
echo
" ']."?page=".$page."'
>".
$page
.
"
"
;
65.
$showPage
=
$page
;
66.
}
67.
}
68.
69.
// menampilkan link next
70.
71.
if
(
$noPage
<
$jumPage
)
echo
"']."?page=".($noPage+1)."'
>Next >>
";
72.
73.
?>
[ Download Script ]
Jangan lupa terus stay tune di blog ini karena pasti akan ada artikel-artikel menarik yang lain daripada yang lain seputar programming.
Tidak ada komentar:
Posting Komentar