StackOverflow Seperti Pagination
Beberapa waktu lalu, saya membangun sistem pagination di PHP untuk menampilkan daftar panjang tautan pagination. Sistem pagination menunjukkan paling banyak 5 tautan sekaligus dan tautan tambahan diwakili oleh ellipsis (...). Namun, saya tidak dapat menangani case edge tertentu, jadi saya mendapatkan beberapa inspirasi dari sistem pagination yang digunakan pada StackOverflow untuk mengatasinya. Seperti inilah hasil akhirnya:

- Tautan halaman pertama dan terakhir selalu terlihat
- Tautan halaman sebelumnya dan berikutnya (yang numerik) selalu terlihat
- Paling banyak n tautan halaman tidak termasuk tautan halaman pertama dan terakhir terlihat; sisanya diwakili oleh ellipsis
- The pagination untuk n - 1 halaman pertama dan terakhir ditangani sedikit berbeda
Lengkapi kode sumber PHP di bawah ini.
Fungsi Pagination
<? php / ** * Menampilkan tautan pagination berdasarkan parameter yang diberikan * * @param int $ currentPage - halaman saat ini * @par int $ itemCount - jumlah item yang akan dihubungi, digunakan untuk menghitung jumlah total halaman * @param int $ itemsPerPage - jumlah item per halaman, yang digunakan untuk menghitung jumlah total halaman * @param int $ berdekatanCount - setengah jumlah tautan halaman yang ditampilkan berdekatan dengan halaman saat ini * @param (string | callable) $ pageLinkTemplate - string URL pagination yang berisi% d placeholder atau fungsi yang dapat dipanggil yang menerima nomor halaman dan mengembalikan URL halaman * @param boolean $ showPrevNext - apakah akan menampilkan tautan halaman sebelumnya dan berikutnya * @return batal * / fungsi pagination ($ currentPage, $ itemCount, $ itemsPerPage, $ berdekatanCount, $ pageLinkTemplate, $ showPrevNext = true) { $ firstPage = 1; $ lastPage = ceil ($ itemCount / $ itemsPerPage); if ($ lastPage == 1) { kembali; } if ($ currentPage <= $ adjacentCount + $ berdekatanCount) { $ firstAdjacentPage = $ firstPage; $ lastAdjacentPage = min ($ firstPage + $ berdekatanCount + $ berdekatanCount, $ lastPage); } elseif ($ currentPage> $ lastPage - $ adjacentCount - $ berdekatanCount) { $ lastAdjacentPage = $ lastPage; $ firstAdjacentPage = $ lastPage - $ berdekatanCount - $ berdekatanCount; } lain { $ firstAdjacentPage = $ currentPage - $ berdekatanCount; $ lastAdjacentPage = $ currentPage + $ berdekatanCount; } gema '<div>'; if ($ showPrevNext) { if ($ currentPage == $ firstPage) { gema '<span> & lt; </span>'; } lain { echo '<a href="'. (is_callable($pageLinkTemplate)? $pageLinkTemplate($currentPage-1): sprintf($pageLinkTemplate, $currentPage-1)).'"> & lt; </a>'; } } if ($ firstAdjacentPage> $ firstPage) { echo '<a href="'. (is_callable($pageLinkTemplate)? $pageLinkTemplate($firstPage): sprintf($pageLinkTemplate, $firstPage)).'">'. $ firstPage. '</a>'; if ($ firstAdjacentPage> $ firstPage + 1) { gema '<span> ... </span>'; } } untuk ($ i = $ firstAdjacentPage; $ i <= $ lastAdjacentPage; $ i ++) { if ($ currentPage == $ i) { gema '<b>'. $ i. '</b>'; } lain { echo '<a href="'. (is_callable($pageLinkTemplate)? $pageLinkTemplate($i): sprintf($pageLinkTemplate, $i)).'">'. $ i. '</a>'; } } if ($ lastAdjacentPage <$ lastPage) { if ($ lastAdjacentPage <$ lastPage - 1) { gema '<span> ... </span>'; } echo '<a href="'. (is_callable($pageLinkTemplate)? $pageLinkTemplate($lastPage): sprintf($pageLinkTemplate, $lastPage)).'">'. $ lastPage. '</a>'; } if ($ showPrevNext) { if ($ currentPage == $ lastPage) { gema '<span> & gt; </span>'; } lain { echo '<a href="'. (is_callable($pageLinkTemplate)? $pageLinkTemplate($currentPage + 1): sprintf($pageLinkTemplate, $currentPage + 1)).'"> & gt; </a>'; } } gema '</div>'; } ?>
Contoh 1
pagination (1, 123, 10, 2, "users.php? halaman =% d");
Contoh 2: Menggunakan URL kanonik untuk halaman pertama
pagination (1, 123, 10, 2, function ($ page) { // gunakan fungsi panggilan balik untuk menangani kasus-kasus khusus misalnya // kembalikan URL kanonik untuk halaman pertama dan URL halaman untuk istirahat return $ page == 1? "/ users /": "/ users / $ page /"; });
Tidak ada komentar:
Posting Komentar