ไม่ได้เข้ามาตอบนาน มีของมาฝาก PHP Pagination Class
Paginator.php
Code (PHP)
<?php
class Paginator{
var $__all_records;
var $__per_page = 20;
var $__cur_page = 1;
var $__record_start = 0;
var $__page_count = 0;
var $__page_range = 5;
var $__page_param = "page";
var $__query_strings = array();
var $__config = array(
"css_id" => "pagination",
"css_pg" => "page",
"css_on" => "on",
"css_off" => "off",
"first" => "first",
"prev" => "prev",
"last" => "last",
"next" => "next",
);
var $__output = "";
public function __construct($_all_records, $_per_page = 0, $_page_rangs = 0){
$this->setAllRecords($_all_records);
if($_per_page > 0){
$this->setPerPage($_per_page);
}
if($_page_rangs > 0){
$this->setPageRange($_page_rangs);
}
unset($_all_records);
unset($_per_page);
unset($_page_rangs);
}
private function setConfig($_config){
if(is_array($_config) and count($_config) > 0)
$this->__config = array_merge_recursive($this->__config, $_config);
unset($_config);
}
private function getConfig($_config, $_default=false){
return array_key_exists($_config, $this->__config)? $this->__config[$_config] : $_default;
unset($_config);
}
private function getCurPage(){
if(!empty($_SERVER['QUERY_STRING'])){
$this->__query_strings = array_merge($this->__query_strings, $_GET);
if(array_key_exists($this->__page_param, $this->__query_strings)){
$this->setCurPage($this->__query_strings[$this->__page_param]);
}
}else{
$this->setCurPage($this->__cur_page);
}
unset($_strings);
unset($_querys);
unset($_params);
unset($_querys);
unset($_param);
unset($_value);
}
private function calcPage(){
$this->__record_start = ((int)$this->__cur_page - 1) * (int)$this->__all_records;
$this->__page_count = ceil((int)$this->__all_records / (int)$this->__per_page);
}
public function getRecordStart(){
return $this->__record_start;
}
public function setAllRecords($_all_records=0){
if($_all_records == 0){
if($this->setConfig("all_records") === false) throw new Exception('Error pagination, Please set all_records parameter.');
$this->__all_records = $this->getConfig("all_records");
}else{
$this->__all_records = $_all_records;
}
unset($_all_records);
}
public function getAllRecords(){
return $this->__all_records;
}
public function setPerPage($_per_page=0){
if($_per_page == 0){
$this->__per_page = $this->setConfig("per_page", 20);
}else{
$this->__per_page = $_per_page;
}
unset($_per_page);
}
public function getPerPage(){
return $this->__per_page;
}
public function setCurPage($_cur_page = 0){
if($_cur_page == 0){
$this->__cur_page = $this->setConfig("cur_page",1);
}else{
$this->__cur_page = $_cur_page;
}
unset($_cur_page);
}
public function setPageRange($_page_range = 0){
if($_page_range == 0){
$this->__page_range = $this->setConfig("page_range",4);
}else{
$this->__page_range = $_page_range;
}
unset($_page_range);
}
public function setParamName($_param_name){
$this->__page_param = $_param_name;
unset($_page_range);
}
public function getPageCount(){
return $this->__page_count;
}
public function build_query($_strings, $_prefix='', $_sep='', $_key=''){
if(!function_exists('http_build_query')){
$ret = array();
foreach ((array)$data as $k => $v){
if(is_int($k) && $_prefix != null){
$k = urlencode($_prefix . $k);
}
if((!empty($_key)) || ($_key === 0)) $k = $_key.'['.urlencode($k).']';
if(is_array($v) || is_object($v)){
array_push($ret, $this->build_query($v, '', $_sep, $k));
} else {
array_push($ret, $k.'='.urlencode($v));
}
}
if(empty($_sep)) $_sep = ini_get('arg_separator.output');
return implode($_separator, $ret);
}else{
return http_build_query($_strings);
}
unset($_strings);
unset($_prefix);
unset($_sep);
unset($_key);
}
public function setHttpQuery($_offset, $_value){
$this->__query_strings[$_offset] = $_value;
unset($_offset);
unset($_value);
}
public function setHttpQueryArray($_params){
$this->__query_strings = array_merge($this->__query_strings, $_params);
unset($_params);
}
private function buildHttpQuery($_page){
$this->__query_strings[$this->__page_param] = $_page;
unset($_page);
return '?' . $this->build_query($this->__query_strings);
}
public function display(){
$this->getCurPage();
$this->calcPage();
$__loop_start = $this->__cur_page - $this->__page_range;
$__loop_stop = $this->__cur_page + $this->__page_range;
$__loop_start = ($__loop_start <= 0)? 1 : $__loop_start;
$__loop_stop = ($__loop_stop >= $this->__page_count)? $this->__page_count : $__loop_stop;
$__class_on = $this->getConfig("css_on");
$__class_off = $this->getConfig("css_off");
if($this->__cur_page>1){
if($this->__cur_page > 2){
$this->__output .= '<li class="' . $__class_off . '">';
$this->__output .= '<a href="' . $this->buildHttpQuery(1) . '">' . $this->getConfig("first") . '</a>';
$this->__output .= '</li>';
}
$this->__output .= '<li class="' . $__class_off . '">';
$this->__output .= '<a href="' . $this->buildHttpQuery(($this->__cur_page-1)) . '">' . $this->getConfig("prev") . '</a>';
$this->__output .= '</li>';
}
for($i = $__loop_start; $i <= $__loop_stop; $i++){
if($i == $this->__cur_page){
$this->__output .= '<li class="' . $__class_on . '">' . $i . '</li>';
}else{
$this->__output .= '<li class="' . $__class_off . '">';
$this->__output .= '<a href="' . $this->buildHttpQuery($i) . '">' . $i . '</a>';
$this->__output .= '</li>';
}
}
if($this->__cur_page < $this->__page_count){
$this->__output .= '<li class="' . $__class_off . '">';
$this->__output .= '<a href="' . $this->buildHttpQuery(($this->__cur_page+1)) . '">' . $this->getConfig("next") . '</a>';
$this->__output .= '</li>';
if(($this->__cur_page+1) < $this->__page_count){
$this->__output .= '<li class="' . $__class_off . '">';
$this->__output .= '<a href="' . $this->buildHttpQuery($this->__page_count) . '">' . $this->getConfig("last") . '</a>';
$this->__output .= '</li>';
}
}
if($__loop_start > $__loop_stop){
$this->__output .= '<li class="' . $__class_off . '">';
$this->__output .= '<a href="' . $this->buildHttpQuery($this->__cur_page) . '"> ' . $this->__cur_page . ' </a>';
$this->__output .= '</li>';
}
if(!empty($this->__output)){
$this->__output = '<div id="' . $this->getConfig("css_id") . '"><ol class="float-left">' . $this->__output . '</ol>';
$this->__output .= '<div class="' . $this->getConfig("css_pg") . '">' . $this->__cur_page . ' of ' . $this->__page_count . '</div>';
$this->__output .= '</div>';
}
unset($__loop_start);
unset($__loop_stop);
unset($__link_target);
unset($__class_on);
unset($__class_off);
echo $this->__output;
}
}
?>
style.css
Code
#pagination{
display:inline-block;
padding:8px 0px 0px 0px;
width:100%;
}
#pagination ol{
margin:0px;
padding:0px;
}
#pagination li.off{
float:left;
list-style:none;
text-align:center;
font:12px Tahoma, Geneva, sans-serif;
color:#f00;
background:#fff;
display:inline-block;
margin-left:2px;
padding:2px 5px;
cursor:pointer;
border:solid 1px #aaa;
}
#pagination li.off a{
color:#f00;
text-decoration:none;
}
#pagination li.on{
float:left;
list-style:none;
text-align:center;
font:bold 12px Tahoma, Geneva, sans-serif;
color:#f00;
background:#fff;
display:inline-block;
margin-left:2px;
padding:2px 5px;
border:solid 1px #aaa;
}
#pagination li.on a{
color:#2b57a2;
text-decoration:none;
}
#pagination div.page{
float:right;
font:12px Tahoma, Geneva, sans-serif;
}
index.php (using)
Code (PHP)
<link href="style.css" rel="stylesheet" type="text/css">
<?php
require_once("Paginator.php");
$all_records = 200;
$per_pages = 20;
$Pg = new Paginator($all_records, $per_pages);
//กรณีอยากเพิ่ม parameter ในโค๊ด
$keyword = isset($_REQUEST['keyword'])?$_REQUEST['keyword']:'';
$Pg->setHttpQueryArray(array('keyword'=>$keyword));
//อยากโชว์กี่หน้า
$Pg->setPageRange(10);
$Pg->display();
?>
ข้อดีคือมันจะดักจับ การส่งข้อมูบแบบ GET ให้อัตโนมัติ แต่ถ้าจะส่งไปเองก็ set ได้
ใครมีความคิดเห็นให้ปรับปรุงตรงไหนก็บอกนะครับ เขียนไว้นานละTag : PHP, HTML/CSS
Date :
2013-02-20 10:19:07
By :
ikikkok
View :
1320
Reply :
10
ขอบคุณครับ
Date :
2013-02-20 10:27:37
By :
Ex-[S]i[L]e[N]t
จัดไปครับ
Date :
2013-02-20 10:34:25
By :
mr.win
ขอบคุณมากครับ +1 เลยครับ อิอิ
Date :
2013-02-20 11:01:40
By :
sakuraei
ต้องบอกว่าดีครับที่แบ่งปัน
นับถือในน้ำใจครับ
ผมดูคร่าวๆ โดยรวมแล้ว
มีหลายจุดครับ ที่ต้องปรับปรุง โดยเฉพาะที่เกี่ยวกับ page การตั้งค่า การคำนวณ และการตรวจจับต่างๆ ยังคงไม่แม่นเท่าไหร่
setConfig() ก็เหมือนจะไม่มีประโยชน์เท่าไหร่ ควรปรับปรุงครับ
ลักษณะของคลาสนี้ จะคล้ายการลากเส้นครับ
ลากเส้นให้วนไปวนมายังจุดต่างๆ
บางจุด ไม่มีประโยชน์ที่จะต้องลากเส้นผ่านครับ
ต่อไปนี้เป็นคำแนะนำเฉยๆ นะครับ จะตั้งแบบไหนมันก็ไม่ผิดหรอกครับ ขึ้นกับความสะดวก
เรื่องเกี่ยวกับ naming
จริงๆแล้ว ก็ไม่ควรยึดกฎเกณฑ์อะไรมาก ถูกแล้วครับ
แต่ __ ควรใช้กับสิ่งที่มันพิเศษ ครับ
และ _ ควรใช้กับสิ่งที่เป้น private
ส่วน public ก็ตั้งธรรมดา ขึ้นต้นด้วยตัวอักษรเฉยๆ ก็โอเคแล้วครับ
เรื่อง visibility
ในโค้ดประกาศ public ชัดเจน ควรประกาศ public แทน var หน้า properties ครับ (ให้มันเหมือนกัน จะง่ายต่อการสังเกตครับ)
หรือเอา public ออกไปเลยก็ได้ครับ อันอื่นๆที่มันไม่ public ก็ใส่ไว้เป็นปกติ
แก้ไขนิดหน่อยก็โอเคแล้วล่ะครับ
ที่ต้องดูเรื่อง page เพราะมันเป็น pagination ครับ
เงื่อนไขบางตัวในโค้ด ทำให้บางอย่างหายไปด้วย ซึ่งมันควรจะมีเหลือไว้ โดย common sense ครับ เช่น first - last
Date :
2013-02-20 11:22:24
By :
triplea
น้อง Plakrim หายไปนาน แอบไป ซุ่มงาน สงสัยรวยแล้วมั่ง
Date :
2013-02-20 11:28:31
By :
mr.win
พี่Plakrim หายไป แต่ยังไม่ลืมกันก็โอเช
Date :
2013-02-20 11:41:55
By :
namebom
ขอบคุณครับ
Date :
2013-02-20 13:45:59
By :
Dragons_first
ลองหัดใช้ ถ้าดึงข้อมูลจาก database ดึงแล้วใส่อย่างไรครับ ขอบคุณครับ
<link href="style.css" rel="stylesheet" type="text/css">
<?php
require_once("Paginator.php");
$all_records = 200;
$per_pages = 20;
$Pg = new Paginator($all_records, $per_pages);
//กรณีอยากเพิ่ม parameter ในโค๊ด
$keyword = isset($_REQUEST['keyword'])?$_REQUEST['keyword']:'';
$Pg->setHttpQueryArray(array('keyword'=>$keyword));
//อยากโชว์กี่หน้า
$Pg->setPageRange(10);
$Pg->display();
?>
Date :
2013-03-14 18:07:14
By :
weaned
$all_records ผมรับค่านี้มาจากการ query ข้อมูลว่ามีกี่ record ครับ
Date :
2013-03-15 01:16:24
By :
ikikkok
Load balance : Server 04