1: | <?php
|
2: | |
3: | |
4: | |
5: | |
6: | |
7: | |
8: | |
9: | |
10: | |
11: | |
12: | |
13: | |
14: | |
15: | |
16: | |
17: |
|
18: |
|
19: | use Xmf\Request;
|
20: |
|
21: | defined('XOOPS_ROOT_PATH') || exit('Restricted access');
|
22: |
|
23: | |
24: | |
25: |
|
26: | class XoopsPageNav
|
27: | {
|
28: | |
29: | |
30: | |
31: | |
32: |
|
33: | public $total;
|
34: | public $perpage;
|
35: | public $current;
|
36: | public $url;
|
37: | public $extra;
|
38: | |
39: | |
40: |
|
41: |
|
42: | |
43: | |
44: | |
45: | |
46: | |
47: | |
48: | |
49: | |
50: |
|
51: | public function __construct($total_items, $items_perpage, $current_start, $start_name = 'start', $extra_arg = '')
|
52: | {
|
53: | $this->total = (int)$total_items;
|
54: | $this->perpage = (int)$items_perpage;
|
55: | $this->current = (int)$current_start;
|
56: | $this->extra = $extra_arg;
|
57: | if ($extra_arg != '' && (substr($extra_arg, -5) !== '&' || substr($extra_arg, -1) !== '&')) {
|
58: | $this->extra = '&' . $extra_arg;
|
59: | }
|
60: | $this->url = htmlspecialchars(Request::getString('PHP_SELF', '', 'SERVER'), ENT_QUOTES) . '?' . trim($start_name) . '=';
|
61: | }
|
62: |
|
63: | |
64: | |
65: | |
66: | |
67: | |
68: |
|
69: | public function renderNav($offset = 4)
|
70: | {
|
71: | $ret = '';
|
72: | if ($this->total <= $this->perpage) {
|
73: | return $ret;
|
74: | }
|
75: | if (($this->total != 0) && ($this->perpage != 0)) {
|
76: | $navigation = array();
|
77: | $total_pages = ceil($this->total / $this->perpage);
|
78: | if ($total_pages > 1) {
|
79: | $i = 0;
|
80: | $prev = $this->current - $this->perpage;
|
81: | if ($prev >= 0) {
|
82: | $navigation[$i]['url'] = $this->url . $prev . $this->extra;
|
83: | $navigation[$i]['value'] = '';
|
84: | $navigation[$i]['option'] = 'first';
|
85: | ++$i;
|
86: | }
|
87: | $counter = 1;
|
88: | $current_page = (int)floor(($this->current + $this->perpage) / $this->perpage);
|
89: | while ($counter <= $total_pages) {
|
90: | if ($counter == $current_page) {
|
91: | $navigation[$i]['url'] = $this->url . $prev . $this->extra;
|
92: | $navigation[$i]['value'] = $counter;
|
93: | $navigation[$i]['option'] = 'selected';
|
94: | } elseif (($counter > $current_page - $offset && $counter < $current_page + $offset) || $counter == 1 || $counter == $total_pages) {
|
95: | if ($counter == $total_pages && $current_page < $total_pages - $offset) {
|
96: | $navigation[$i]['url'] = '';
|
97: | $navigation[$i]['value'] = '';
|
98: | $navigation[$i]['option'] = 'break';
|
99: | ++$i;
|
100: | }
|
101: | $navigation[$i]['url'] = $this->url . (($counter - 1) * $this->perpage) . $this->extra;
|
102: | $navigation[$i]['value'] = $counter;
|
103: | $navigation[$i]['option'] = 'show';
|
104: | ++$i;
|
105: | if ($counter == 1 && $current_page > 1 + $offset) {
|
106: | $navigation[$i]['url'] = '';
|
107: | $navigation[$i]['value'] = '';
|
108: | $navigation[$i]['option'] = 'break';
|
109: | }
|
110: | }
|
111: | ++$counter;
|
112: | ++$i;
|
113: | }
|
114: | $next = $this->current + $this->perpage;
|
115: | if ($this->total > $next) {
|
116: | $navigation[$i]['url'] = $this->url . $next . $this->extra;
|
117: | $navigation[$i]['value'] = '';
|
118: | $navigation[$i]['option'] = 'last';
|
119: | }
|
120: | }
|
121: | return $this->displayPageNav('Nav', $navigation);
|
122: | }
|
123: | return $ret;
|
124: | }
|
125: |
|
126: | |
127: | |
128: | |
129: | |
130: | |
131: |
|
132: | public function renderSelect($showbutton = false)
|
133: | {
|
134: | $ret = '';
|
135: | if ($this->total < $this->perpage) {
|
136: | return $ret;
|
137: | }
|
138: | $total_pages = ceil($this->total / $this->perpage);
|
139: | if ($total_pages > 1) {
|
140: | $counter = 1;
|
141: | $current_page = (int)floor(($this->current + $this->perpage) / $this->perpage);
|
142: | while ($counter <= $total_pages) {
|
143: | if ($counter == $current_page) {
|
144: | $ret .= '<option value="' . $this->url . (($counter - 1) * $this->perpage) . $this->extra . '" selected>' . $counter . '</option>';
|
145: | } else {
|
146: | $ret .= '<option value="' . $this->url . (($counter - 1) * $this->perpage) . $this->extra . '">' . $counter . '</option>';
|
147: | }
|
148: | ++$counter;
|
149: | }
|
150: | if ($showbutton) {
|
151: | $navigation['button'] = true;
|
152: | } else {
|
153: | $navigation['button'] = false;
|
154: | }
|
155: | $navigation['select'] = $ret;
|
156: | return $this->displayPageNav('Select', $navigation);
|
157: | }
|
158: | return $ret;
|
159: | }
|
160: |
|
161: | |
162: | |
163: | |
164: | |
165: | |
166: |
|
167: | public function renderImageNav($offset = 4)
|
168: | {
|
169: | $ret = '';
|
170: | if ($this->total < $this->perpage) {
|
171: | return $ret;
|
172: | }
|
173: | $total_pages = ceil($this->total / $this->perpage);
|
174: | if ($total_pages > 1) {
|
175: | $i = 0;
|
176: | $prev = $this->current - $this->perpage;
|
177: | if ($prev >= 0) {
|
178: | $navigation[$i]['url'] = $this->url . $prev . $this->extra;
|
179: | $navigation[$i]['value'] = '';
|
180: | $navigation[$i]['option'] = 'first';
|
181: | ++$i;
|
182: | } else {
|
183: | $navigation[$i]['url'] = '';
|
184: | $navigation[$i]['value'] = '';
|
185: | $navigation[$i]['option'] = 'firstempty';
|
186: | ++$i;
|
187: | }
|
188: | $counter = 1;
|
189: | $current_page = (int)floor(($this->current + $this->perpage) / $this->perpage);
|
190: | while ($counter <= $total_pages) {
|
191: | if ($counter == $current_page) {
|
192: | $navigation[$i]['url'] = '';
|
193: | $navigation[$i]['value'] = $counter;
|
194: | $navigation[$i]['option'] = 'selected';
|
195: | } elseif (($counter > $current_page - $offset && $counter < $current_page + $offset) || $counter == 1 || $counter == $total_pages) {
|
196: | if ($counter == $total_pages && $current_page < $total_pages - $offset) {
|
197: | $navigation[$i]['url'] = '';
|
198: | $navigation[$i]['value'] = '';
|
199: | $navigation[$i]['option'] = 'break';
|
200: | ++$i;
|
201: | }
|
202: | $navigation[$i]['url'] = $this->url . (($counter - 1) * $this->perpage) . $this->extra;
|
203: | $navigation[$i]['value'] = $counter;
|
204: | $navigation[$i]['option'] = 'show';
|
205: | ++$i;
|
206: | if ($counter == 1 && $current_page > 1 + $offset) {
|
207: | $navigation[$i]['url'] = '';
|
208: | $navigation[$i]['value'] = '';
|
209: | $navigation[$i]['option'] = 'break';
|
210: | }
|
211: | }
|
212: | ++$counter;
|
213: | ++$i;
|
214: | }
|
215: | $next = $this->current + $this->perpage;
|
216: | if ($this->total > $next) {
|
217: | $navigation[$i]['url'] = $this->url . $next . $this->extra;
|
218: | $navigation[$i]['value'] = '';
|
219: | $navigation[$i]['option'] = 'last';
|
220: | ++$i;
|
221: | } else {
|
222: | $navigation[$i]['url'] = '';
|
223: | $navigation[$i]['value'] = '';
|
224: | $navigation[$i]['option'] = 'lastempty';
|
225: | }
|
226: | return $this->displayPageNav('Image', $navigation);
|
227: | }
|
228: | return $ret;
|
229: | }
|
230: |
|
231: | |
232: | |
233: | |
234: | |
235: | |
236: | |
237: |
|
238: | private function displayPageNav($type = 'nav', $navigation = array()){
|
239: | if (!isset($GLOBALS['xoTheme']) || !is_object($GLOBALS['xoTheme'])) {
|
240: | include_once $GLOBALS['xoops']->path('/class/theme.php');
|
241: | $GLOBALS['xoTheme'] = new \xos_opal_Theme();
|
242: | }
|
243: | require_once $GLOBALS['xoops']->path('/class/template.php');
|
244: | $pageNavTpl = new \XoopsTpl();
|
245: | $pageNavTpl->assign('pageNavType', $type);
|
246: | $pageNavTpl->assign('pageNavigation', $navigation);
|
247: |
|
248: | return $pageNavTpl->fetch("db:system_pagenav.tpl");
|
249: |
|
250: | }
|
251: | }
|
252: | |