1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
| /**
Example:
$page = (isset($this->params['named']['page'])) ? $this->params['named']['page'] : 1;
// 导入分页类
App::import('Vendor', 'page_class');
// 获取公告总数
$total = $this->Bulletin->getBulletinTotal();
$perpage = ITEMPREPAGE;
$offset = $perpage * ($page - 1);
$pagebar = new Pagebar($total, $page, $offset, $perpage);
$pagenav = $pagebar->construct_page_nav($total, $page, SYSTEMURL . '/bulletins/index', null, null);
*/
<?php
class Pagebar
{
var $perpage = 20;
/**
* Ensures that the variables for a multi-page display are sane
*
* @param integer Total number of items to be displayed
* @param integer (ref) Current page number
* @param integer (ref) Desired number of results to show per-page
*/
function Pagebar($numresults, &$page, &$limitlower, $perpage)
{
$this->perpage = $perpage;
$numpages = ceil($numresults / $this->perpage);
if ($numpages == 0)
{
$numpages = 1;
}
if ($page < 1)
{
$page = 1;
}
else if ($page > $numpages)
{
$page = $numpages;
}
$limitlower = ($page - 1) * $this->perpage;
$limitupper = ($page) * $this->perpage;
if ($limitupper > $numresults)
{
$limitupper = $numresults;
if ($limitlower > $numresults)
{
$limitlower = ($numresults - $this->perpage) - 1;
}
}
if ($limitlower < 0)
{
$limitlower = 0;
}
}
/**
* Returns the HTML for multi-page navigation
*
* @param integer Total number of items found
* @param integer Page number being displayed
* @param string Base address for links eg: q.php?t=99{&page=4}
* @param string Ending portion of address for links
*
* @return string Page navigation HTML
*/
function construct_page_nav($results, $pagenumber, $address, $address2 = '', $option = array())
{
$perpage = $this->perpage;
$show = array();
$curpage = 0;
$pagenav = '';
$firstlink = '';
$prevlink = '';
$lastlink = '';
$nextlink = '';
if ($results <= $perpage)
{
$show['pagenav'] = false;
return '';
}
$show['pagenav'] = true;
$total = number_format($results);
$totalpages = ceil($results / $perpage);
$show['prev'] = false;
$show['next'] = false;
$show['first'] = false;
$show['last'] = false;
if ($pagenumber > 1)
{
$prevpage = $pagenumber - 1;
$prevnumbers = $this->fetch_start_end_total_array($prevpage, $perpage, $results);
$show['prev'] = true;
}
if ($pagenumber < $totalpages)
{
$nextpage = $pagenumber + 1;
$nextnumbers = $this->fetch_start_end_total_array($nextpage, $perpage, $results);
$show['next'] = true;
}
// create array of possible relative links that we might have (eg. +10, +20, +50, etc.)
$pagenavsarr = array(10, 50, 100, 500, 1000);
$pagenavpages = 5;
while ($curpage++ < $totalpages)
{
if (abs($curpage - $pagenumber) >= $pagenavpages AND $pagenavpages != 0)
{
if ($curpage == 1)
{
$firstnumbers = $this->fetch_start_end_total_array(1, $perpage, $results);
$show['first'] = true;
}
if ($curpage == $totalpages)
{
$lastnumbers = $this->fetch_start_end_total_array($totalpages, $perpage, $results);
$show['last'] = true;
}
// generate relative links (eg. +10,etc).
if (in_array(abs($curpage - $pagenumber), $pagenavsarr) AND $curpage != 1 AND $curpage != $totalpages)
{
$pagenumbers = $this->fetch_start_end_total_array($curpage, $perpage, $results);
$relpage = $curpage - $pagenumber;
if ($relpage > 0)
{
$relpage = '+' . $relpage;
}
$pagenav .= "<a onclick=\"$option[onclick]\" class=\"smallfont\" href=\"$address". "/page:$curpage". ($address2 ? '?'.$address2 : '') . "\" title=\"显示结果从 $pagenumbers[first] 到 $pagenumbers[last] 共计 $total 条\"><!--$relpage--> $curpage </a>";
}
}
else
{
if ($curpage == $pagenumber)
{
$numbers = $this->fetch_start_end_total_array($curpage, $perpage, $results);
$pagenav .= " <span class=\"smallfont\" title=\"显示结果从 $numbers[first] 到 $numbers[last] 共计 $total 条\"><strong> $curpage </strong></span>";
}
else
{
$pagenumbers = $this->fetch_start_end_total_array($curpage, $perpage, $results);
$pagenav .= "<a onclick=\"$option[onclick]\" class=\"smallfont\" href=\"$address". "/page:$curpage". (($address2) ? '?'.$address2 : '') . "\" title=\"显示结果从 $pagenumbers[first] 到 $pagenumbers[last] 共计 $total 条\"> $curpage </a>";
}
}
}
$pagenav = "
<span class=\"disabled\">
".(($show['prev']) ? ("<a onclick=\"$option[onclick]\" class=\"smallfont\" href=\"$address".("/page:$prevpage".($address2 ? '?'.$address2 : ''))."\" title=\"上一页 - 结果从 $prevnumbers[first] 到 $prevnumbers[last] 共计 $total\">上一页</a></span>") : ("上一页</span>"))."
$pagenav
".(($show['next']) ? ("<span><a onclick=\"$option[onclick]\" class=\"smallfont\" href=\"$address/page:$nextpage".($address2 ? '?'.$address2 : '')."\" title=\"下一页 - 结果从 $nextnumbers[first] 到 $nextnumbers[last] 共计 $total\">下一页</a></span>") : ("<span>下一页</span>"))."
<span>第 $pagenumber / $totalpages 页,共 <strong>$total</strong>条记录</span>";
return $pagenav;
}
/**
* Returns an array so you can print 'Showing results $arr[first] to $arr[last] of $totalresults'
*
* @param integer Current page number
* @param integer Results to show per-page
* @param integer Total results found
*
* @return array In the format of - array('first' => x, 'last' => y)
*/
function fetch_start_end_total_array($pagenumber, $perpage, $total)
{
$first = $perpage * ($pagenumber - 1);
$last = $first + $perpage;
if ($last > $total)
{
$last = $total;
}
$first++;
return array('first' => number_format($first), 'last' => number_format($last));
}
}
?> |