แจก PHP Pagination Class โค้ดแบ่งหน้าที่กำหนดการแสดงผลได้ละเอียดมากตามที่คุณต้องการ
Pagination class ของผมตัวนี้สามารถกำหนดให้แสดงการแบ่งหน้าได้ละเอียดมาก เอาเท่าที่ทดสอบแล้วพอจะได้รูปแบบดังนี้
First Previous 1 2 ... 4 5 6 7 8 9 10 ... 13 14 Next Last
First Previous 1 ... 4 5 6 7 8 9 10 ... 12 13 14 Next Last
First Previous 4 5 6 7 8 9 10 ... 13 14 Next Last
First Previous 4 5 6 7 8 9 10 Next Last
Previous 4 5 6 7 8 9 10 Next
4 5 6 7 8 9 10
First Previous Next Last
Previous Next
นอกจากนี้ยังสามารถสั่งให้สร้างข้อมูลเพื่อเอาข้อมูลไปสร้างการแสดงผล html เอาเองแบบอื่นๆที่สุดจะแตกต่างไปมากกว่านี้ได้อีก เช่น แบบ select box, method POST, ajax, ฯลฯ
Download
หมายเหตุ รุ่นที่ปล่อยให้ดาวน์โหลดนี้แม้จะทำงานได้จริงๆ แต่ยังไม่ใช่รุ่นเต็ม (ผมยังไม่ได้กำหนดรุ่นเต็ม) ต้องการให้ได้ทดลองใช้กัน แล้วมาบอกกันหน่อยครับว่าต้องการให้กำหนดการแสดงผลออกมาเป็นอย่างไรได้อีก. และเมื่อลงตัวแล้วก็จะค่อยกำหนดรุ่นเต็มอีกทีหนึ่ง.
Download ผ่าน Github , ติดตั้งผ่าน Composer
การใช้งาน
ก่อนจะยกตัวอย่างการใช้งาน เพื่อความเต็มเหนี่ยว ขอให้ดูเพิ่มเติมได้จากเอกสาร API นะครับมันจะมีบอกไว้หมดเลยว่า property อะไรกำหนดเพื่ออะไรบ้าง และ method อะไรเรียกใช้เพื่ออะไร ซึ่ง method ที่เรียกใช้ได้จากภายนอกก็มีแค่ 2 เท่านั้นแหละครับ.
แต่ทั้งนี้กระผมก็ไม่เก่งอังกฤษ อยากจะช่วยแก้คำผิดในเอกสาร API ตรงไหนก็บอกได้เหมือนกันนะครับ.
การใช้งานแบบเดิมๆ สั้นๆ ง่ายๆเลย
Code (PHP)
// ถ้าติดตั้งจาก Composer ก็ใช้ autoload เอานะครับ ไม่ต้องมา include/require ตรงนี้
// ส่วนผู้ที่โหลดทำมือเอาเองก็เช็คพาธให้ถูกต้องนะครับ.
require 'Rundiz/Pagination/Pagination.php';
// เชื่อมต่อฐานข้อมูล
mysqli_report(MYSQLI_REPORT_STRICT);
try {
$mysql = new \mysqli($db['host'], $db['username'], $db['password'], $db['dbname'], $db['port']);
} catch (\Exception $e) {
echo 'MySQL connect error ('.$e->getCode().') '.$e->getMessage().'<br>'."\n";
echo 'Please make sure that you had already configure database settings in this file. '.__FILE__."\n";
exit;
}
$mysql->set_charset('utf8');
// query หาค่าทั้งหมดก่อน อย่าเพิ่ง LIMIT, OFFSET, แบ่งหน้าอะไรตรงนี้
// ถ้ามีการ filter หรือเงื่อนไข เช่น พวก where อะไรก็ทำตรงนี้ได้เลยครับ
$sql = 'SELECT * FROM `'.$db['tablename'].'`';
$result = $mysql->query($sql);
if ($result === false) {
printf("Error: %s\n", $mysql->error);
exit;
}
$total_records = $result->num_rows;// กำหนดค่ารายการ *ทั้งหมด* ที่พบใน sql ตามเงื่อนไข
$start = (isset($_GET['start']) ? intval($_GET['start']) : 0);
if ($start < 0) {
$start = 0;
}
$limit = 10;// แสดงหน้าละ 10 รายการ
$offset = $start;
// query อีกครั้ง คราวนี้ให้กำหนด LIMIT, OFFSET ได้
$result->free();
$sql .= ' LIMIT '.$limit.' OFFSET '.$offset;
$result = $mysql->query($sql);
if ($result === false) {
printf("Error: %s\n", $mysql->error);
exit;
}
unset($sql);
// เสร็จส่วนของ mysql แล้ว ปิดไปเลย ประหยัดแรมครับ
$mysql->close();
unset($mysql);
// กำหนด base_url สำหรับใช้ในการสร้างลิ้งค์แบ่งหน้า
// ส่วนนี้กับงานจริงๆของคุณต้องดูรายละเอียดอีกทีนะครับ
$base_url = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'] . '?start=%PAGENUMBER%';
// รับค่า query string หรือ method GET อื่นๆมาใช้นอกจาก ?start=
// เช่นกรณีที่คุณแสดงรายการแล้วมีฟอร์มให้ filter ได้ก็ไม่ควรให้ผู้ใช้มานั่ง filter ใหม่ทั้งหมด ก็ทำตรงนี้ไป หรือไม่เอา ก็ลบส่วนนี้ออก
$query_string_array = array();
if (isset($_GET) && is_array($_GET)) {
foreach ($_GET as $key => $value) {
if ($key != 'start') {
$query_string_array[$key] = $value;
}
}// endforeach;
unset($key, $value);
}
if (!empty($query_string_array)) {
$base_url .= '&' . http_build_query($query_string_array, null, '&');
}
unset($query_string_array);
// เริ่มเรียกใช้ class Pagination.
$Pagination = new \Rundiz\Pagination\Pagination();
// กำหนดค่าต่างๆให้ class ด้านล่างนี้เลย รวมถึงการแสดงผลด้วย (ขอให้ดูเพิ่มเติมจากหน้าเอกสาร API)
$Pagination->base_url = $base_url;// *ค่า property นี้ต้องกรอก.
$Pagination->total_records = $total_records;// *ค่า property นี้ต้องกรอก.
$Pagination->page_number_value = $start;// *ค่า property นี้ต้องกรอก.
?>
<!-- สมมุติว่าเรามีหน้า html ทั้งหน้าแล้ว อันนี้เป็นแค่ส่วนแสดงผลตรงตาราง ผมจึงขอแสดงตัวอย่างแค่นี้นะครับ -->
<table class="table">
<thead>
<tr>
<th style="width: 10%;">ID</th>
<th>Name</th>
<th>Gender</th>
<th>Email</th>
<th>IP Address</th>
</tr>
</thead>
<tfoot>
<tr>
<th>ID</th>
<th>Name</th>
<th>Gender</th>
<th>Email</th>
<th>IP Address</th>
</tr>
</tfoot>
<tbody>
<?php
while ($item = $result->fetch_assoc()) {
?>
<tr>
<td><?php echo $item['id']; ?></td>
<td><?php echo $item['first_name'].' '.$item['last_name']; ?></td>
<td><?php echo $item['gender']; ?></td>
<td><?php echo $item['email']; ?></td>
<td><?php echo $item['ip_address']; ?></td>
</tr>
<?php
} // endwhile;
$result->free();
unset($item, $result);
?>
</tbody>
</table>
<?php
// เรียกแสดงการแบ่งหน้าได้เลย
echo $Pagination->createLinks();
?>
ในส่วนของการเรียกแสดงการแบ่งหน้ายังกำหนดค่าใน method createLinks ได้อีก
โดยจะมีค่าแทนตำแหน่งต่างๆดังต่อไปนี้ :current_page_number_displaying จะแทนที่หน้าที่กำลังแสดง, :total_pages จะแทนที่หน้าทั้งหมดที่มี, :pagination จะแทนที่การแบ่งหน้า
ตัวอย่าง
Code (PHP)
echo $Pagination->createLinks('Displaying :current_page_number_displaying/:total_pages<br>:pagination');
การแสดงผลแบบกำหนดเอง
นอกจากการกำหนดค่าที่มีให้แล้ว คุณยังสามารถกำหนดให้มันแตกต่างออกไปได้อีกแทบจะไม่มีขีดจำกัด คือให้เรียกใช้ method getPaginationData() เพื่อรับเอาค่าของมันมาแล้วเอามาวนลูปเขียนการแสดงผลใหม่ได้ เช่นการแสดงผลแบบ select box, method POST, ajax, ฯลฯ
ตัวอย่าง
Code (PHP)
$pagination_data = $Pagination->getPaginationData();
if (is_array($pagination_data) && array_key_exists('generated_pages', $pagination_data)) {
echo '<form id="pagination-method-post-form" method="post" action="'.str_replace(array('start=%PAGENUMBER%&', 'start=%PAGENUMBER%'), '', $base_url).'">'."\n";
echo '<input type="hidden" id="method-post-start-value" name="start" value="">'."\n";
foreach ($pagination_data['generated_pages'] as $page_key => $page_item) {
if (!is_string($page_key) && is_array($page_item)) {
if (array_key_exists('link', $page_item) && array_key_exists('page_value', $page_item) && array_key_exists('text', $page_item)) {
echo '<button type="button" class="button btn';
if (isset($start) && $start == $page_item['page_value']) {
echo ' btn-primary';
} else {
echo ' btn-default';
}
echo '"';
echo ' name="start"';
echo ' value="'.$page_item['page_value'].'"';
echo '>';
echo $page_item['text'];
echo '</button> '."\n";
}
}
}// endforeach;
unset($page_item, $page_key);
echo '</form>'."\n";
}
unset($pagination_data);
ใครที่อยากได้การแสดงผลที่แตกต่างออกไปยังไง ลองบอกมาครับ ผมจะช่วยดูให้ หรือดูคำอธิบายเพิ่มเติมในเว็บได้ที่ http://rundiz.com/web-resources/pagination-v3
หากรูปแบบการแบ่งหน้าแบบไหนๆที่ยังทำไม่ได้ใน class นี้และพิจารณาแล้วสามารถเพิ่มได้ จะลองเพิ่มเติมให้ครับ.Tag : PHP
ประวัติการแก้ไข 2016-04-26 15:42:49
Date :
2016-04-26 15:41:46
By :
mr.v
View :
6597
Reply :
8
เยี่ยมเลยครับ
Date :
2016-04-27 09:17:01
By :
mr.win
ชื่นชมครับ
Date :
2016-04-27 09:39:49
By :
apisitp
แจ่มครับ
Date :
2016-04-27 11:04:26
By :
Chaidhanan
ไม่มีใครมีไอเดียหรืออยากได้การแสดงผลแบ่งหน้าแบบอื่นๆที่แตกต่างจากนี้เลยเหรอครับ อยากจะให้มันสนองนี้ดทำออกมาได้ทุกรูปแบบไรงี้.
Date :
2016-04-27 13:13:02
By :
mr.v
จขกท. โปรเจ็ตคเยอะมากเลยครับ ;)
Date :
2016-04-27 13:36:38
By :
ALTELMA
เดียวแชร์ลง Face ให้ครับ รอคิว....
Date :
2016-04-27 13:46:02
By :
mr.win
ขอบคุณจ้า
Date :
2016-04-28 18:00:51
By :
yingthecob
Load balance : Server 03