1 <?php
2 namespace Components;
3
4 class Page {
5 private $total; //数据表中总记录数
6 private $listRows; //每页显示行数
7 private $limit;
8 private $uri;
9 private $pageNum; //页数
10 private $config=array('header'=>"个记录", "prev"=>"上一页", "next"=>"下一页", "first"=>"首 页", "last"=>"尾 页");
11 private $listNum=8;
12 /*
13 * $total
14 * $listRows
15 */
16 public function __construct($total, $listRows=10, $pa=""){
17 $this->total=$total;
18 $this->listRows=$listRows;
19 $this->uri=$this->getUri($pa);
20 $this->page=!empty($_GET["page"]) ? $_GET["page"] : 1;
21 $this->pageNum=ceil($this->total/$this->listRows);
22 $this->limit=$this->setLimit();
23 }
24
25 private function setLimit(){
26 return "Limit ".($this->page-1)*$this->listRows.", {$this->listRows}";
27 }
28
29 private function getUri($pa){
30 $url=$_SERVER["REQUEST_URI"].(strpos($_SERVER["REQUEST_URI"], '?')?'':"?").$pa;
31 $parse=parse_url($url);
32
33
34
35 if(isset($parse["query"])){
36 parse_str($parse['query'],$params);
37 unset($params["page"]);
38 $url=$parse['path'].'?'.http_build_query($params);
39
40 }
41
42 return $url;
43 }
44
45 function __get($args){
46 if($args=="limit")
47 return $this->limit;
48 else
49 return null;
50 }
51
52 private function start(){
53 if($this->total==0)
54 return 0;
55 else
56 return ($this->page-1)*$this->listRows+1;
57 }
58
59 private function end(){
60 return min($this->page*$this->listRows,$this->total);
61 }
62
63 private function first(){
64 $html = "";
65 if($this->page==1)
66 $html.='';
67 else
68 $html.=" <a href='{$this->uri}&page=1'>{$this->config["first"]}</a> ";
69
70 return $html;
71 }
72
73 private function prev(){
74 $html = "";
75 if($this->page==1)
76 $html.='';
77 else
78 $html.=" <a href='{$this->uri}&page=".($this->page-1)."'>{$this->config["prev"]}</a> ";
79
80 return $html;
81 }
82
83 private function pageList(){
84 $linkPage="";
85
86 $inum=floor($this->listNum/2);
87
88 for($i=$inum; $i>=1; $i--){
89 $page=$this->page-$i;
90
91 if($page<1)
92 continue;
93
94 $linkPage.=" <a href='{$this->uri}&page={$page}'>{$page}</a> ";
95
96 }
97
98 $linkPage.=" {$this->page} ";
99
100
101 for($i=1; $i<=$inum; $i++){
102 $page=$this->page+$i;
103 if($page<=$this->pageNum)
104 $linkPage.=" <a href='{$this->uri}&page={$page}'>{$page}</a> ";
105 else
106 break;
107 }
108
109 return $linkPage;
110 }
111
112 private function next(){
113 $html = "";
114 if($this->page==$this->pageNum)
115 $html.='';
116 else
117 $html.=" <a href='{$this->uri}&page=".($this->page+1)."'>{$this->config["next"]}</a> ";
118
119 return $html;
120 }
121
122 private function last(){
123 $html = "";
124 if($this->page==$this->pageNum)
125 $html.='';
126 else
127 $html.=" <a href='{$this->uri}&page=".($this->pageNum)."'>{$this->config["last"]}</a> ";
128
129 return $html;
130 }
131
132 private function goPage(){
133 return ' <input type="text" onkeydown="javascript:if(event.keyCode==13){var page=(this.value>'.$this->pageNum.')?'.$this->pageNum.':this.value;location=\''.$this->uri.'&page=\'+page+\'\'}" value="'.$this->page.'" style="width:25px"><input type="button" value="GO" onclick="javascript:var page=(this.previousSibling.value>'.$this->pageNum.')?'.$this->pageNum.':this.previousSibling.value;location=\''.$this->uri.'&page=\'+page+\'\'"> ';
134 }
135 function fpage($display=array(0,1,2,3,4,5,6,7,8)){
136 $html[0]=" 共有<b>{$this->total}</b>{$this->config["header"]} ";
137 $html[1]=" 每页显示<b>".($this->end()-$this->start()+1)."</b>条,本页<b>{$this->start()}-{$this->end()}</b>条 ";
138 $html[2]=" <b>{$this->page}/{$this->pageNum}</b>页 ";
139
140 $html[3]=$this->first();
141 $html[4]=$this->prev();
142 $html[5]=$this->pageList();
143 $html[6]=$this->next();
144 $html[7]=$this->last();
145 $html[8]=$this->goPage();
146 $fpage='';
147 foreach($display as $index){
148 $fpage.=$html[$index];
149 }
150
151 return $fpage;
152
153 }
154
155
156 }