1: <?php
2: 3: 4: 5: 6: 7: 8: 9:
10:
11: define('XCUBE_PAGENAVI_START', 1);
12: define('XCUBE_PAGENAVI_PERPAGE', 2);
13:
14: define('XCUBE_PAGENAVI_SORT', 1);
15: define('XCUBE_PAGENAVI_PAGE', 4);
16:
17: define('XCUBE_PAGENAVI_DEFAULT_PERPAGE', 20);
18:
19: 20: 21: 22: 23:
24: class XCube_PageNavigator
25: {
26: 27: 28: 29:
30: var $mAttributes = array();
31:
32: 33: 34: 35:
36: var $mStart = 0;
37:
38: 39: 40: 41:
42: var $mTotalItems = 0;
43:
44: 45: 46: 47:
48: var $mPerpage = XCUBE_PAGENAVI_DEFAULT_PERPAGE;
49:
50: 51: 52: 53: 54:
55: var $mPerpageFreeze = false;
56:
57: 58: 59: 60:
61: var $mSort = array();
62:
63: 64: 65: 66:
67: var $mUrl = "";
68:
69: 70: 71: 72:
73: var $mPrefix = null;
74:
75: 76: 77:
78: var $mExtra = array();
79:
80: 81: 82:
83: var $mFlags = 0;
84:
85: 86: 87:
88: var $mFetch = null;
89:
90: 91: 92: 93: 94:
95: var $_mIsSpecifedTotalItems = false;
96:
97: 98: 99: 100: 101: 102: 103:
104: var $mGetTotalItems = null;
105:
106:
107: 108: 109: 110: 111: 112:
113: function XCube_PageNavigator($url, $flags = XCUBE_PAGENAVI_START)
114: {
115: $this->mUrl = $url;
116: $this->mFlags = $flags;
117:
118: $this->mFetch =new XCube_Delegate();
119: $this->mFetch->add(array(&$this, 'fetchNaviControl'));
120:
121: $this->mGetTotalItems =new XCube_Delegate();
122: }
123:
124: 125: 126: 127:
128: function fetch()
129: {
130: $this->mFetch->call(new XCube_Ref($this));
131: }
132:
133: function fetchNaviControl(&$navi)
134: {
135: $root =& XCube_Root::getSingleton();
136:
137: $startKey = $navi->getStartKey();
138: $perpageKey = $navi->getPerpageKey();
139:
140: if ($navi->mFlags & XCUBE_PAGENAVI_START) {
141: $t_start = $root->mContext->mRequest->getRequest($navi->getStartKey());
142: if ($t_start != null && intval($t_start) >= 0) {
143: $navi->mStart = intval($t_start);
144: }
145: }
146:
147: if ($navi->mFlags & XCUBE_PAGENAVI_PERPAGE && !$navi->mPerpageFreeze) {
148: $t_perpage = $root->mContext->mRequest->getRequest($navi->getPerpageKey());
149: if ($t_perpage != null && intval($t_perpage) > 0) {
150: $navi->mPerpage = intval($t_perpage);
151: }
152: }
153: }
154:
155: function addExtra($key, $value)
156: {
157: $this->mExtra[$key] = $value;
158: }
159:
160: function removeExtra($key)
161: {
162: if ($this->mExtra[$key]) {
163: unset($this->mExtra[$key]);
164: }
165: }
166:
167:
168: protected function _renderExtra( $key, $extra, &$query)
169: {
170: if(! is_array($extra)){
171: $query[] = $key.'='.urlencode($extra);
172: }
173: else{
174: foreach($extra as $k=>$value){
175: $this->_renderExtra($key."[".$k."]", $value, $query);
176: }
177: }
178: }
179:
180: function getRenderBaseUrl($mask = null)
181: {
182: if ($mask == null) {
183: $mask = array();
184: }
185: if (!is_array($mask)) {
186: $mask = array($mask);
187: }
188:
189: if(count($this->mExtra) > 0) {
190: $tarr=array();
191:
192: foreach($this->mExtra as $key=>$value) {
193: if (is_array($mask) && !in_array($key, $mask)) {
194:
195: $this->_renderExtra($key, $value, $tarr);
196: }
197: }
198:
199: if (count($tarr)==0) {
200: return $this->mUrl;
201: }
202:
203: if(strpos($this->mUrl,"?")!==false) {
204: return $this->mUrl."&".implode("&",$tarr);
205: }
206: else {
207: return $this->mUrl."?".implode("&",$tarr);
208: }
209: }
210:
211: return $this->mUrl;
212: }
213:
214: 215: 216: 217: 218: 219:
220: function getRenderUrl($mask = null)
221: {
222: if ($mask != null && !is_array($mask)) {
223: $mask = array($mask);
224: }
225:
226: $demiliter = "?";
227: $url = $this->getRenderBaseUrl($mask);
228:
229: if(strpos($url,"?")!==false) {
230: $demiliter = "&";
231: }
232:
233: return $url . $demiliter . $this->getStartKey() . "=";
234: }
235:
236: function renderUrlForSort()
237: {
238: if(count($this->mExtra) > 0) {
239: $tarr=array();
240:
241: foreach($this->mExtra as $key=>$value) {
242:
243: $this->_renderExtra($key, $value, $tarr);
244: }
245:
246: $tarr[] = $this->getPerpageKey() . "=" . $this->mPerpage;
247:
248: if(strpos($this->mUrl,"?")!==false) {
249: return $this->mUrl."&".implode("&",$tarr);
250: }
251: else {
252: return $this->mUrl."?".implode("&",$tarr);
253: }
254: }
255:
256: return $this->mUrl;
257: }
258:
259: function renderUrlForPage($page = null)
260: {
261: $tarr=array();
262:
263: foreach($this->mExtra as $key=>$value) {
264:
265: $this->_renderExtra($key, $value, $tarr);
266: }
267:
268: foreach($this->mSort as $key=>$value) {
269: $tarr[]=$key."=".urlencode($value);
270: }
271:
272: $tarr[] = $this->getPerpageKey() . "=" . $this->getPerpage();
273:
274: if ($page !== null) {
275: $tarr[] = $this->getStartKey() . '=' . intval($page);
276: }
277:
278: if (strpos($this->mUrl,"?") !== false) {
279: return $this->mUrl."&".implode("&",$tarr);
280: }
281:
282: return $this->mUrl."?".implode("&",$tarr);
283: }
284:
285: 286: 287: 288:
289: function renderSortUrl($mask = null)
290: {
291: return $this->renderUrlForSort();
292: }
293:
294: function setStart($start)
295: {
296: $this->mStart = intval($start);
297: }
298:
299: function getStart()
300: {
301: return $this->mStart;
302: }
303:
304: function setTotalItems($total)
305: {
306: $this->mTotal = intval($total);
307: $this->_mIsSpecifiedTotal = true;
308: }
309:
310: function getTotalItems()
311: {
312: if ($this->_mIsSpecifedTotalItems == false) {
313: $this->mGetTotalItems->call(new XCube_Ref($this->mTotal));
314: $this->_mIsSpecifedTotalItems = true;
315: }
316:
317: return $this->mTotal;
318: }
319:
320: function getTotalPages()
321: {
322: if ($this->getPerpage() > 0) {
323: return ceil($this->getTotalItems() / $this->getPerpage());
324: }
325:
326: return 0;
327: }
328:
329: function setPerpage($perpage)
330: {
331: $this->mPerpage = intval($perpage);
332: }
333:
334: function freezePerpage()
335: {
336: $this->mPerpageFreeze = true;
337: }
338:
339: function getPerpage()
340: {
341: return $this->mPerpage;
342: }
343:
344: function setPrefix($prefix)
345: {
346: $this->mPrefix = $prefix;
347: }
348:
349: function getPrefix()
350: {
351: return $this->mPrefix;
352: }
353:
354: function getStartKey()
355: {
356: return $this->mPrefix . "start";
357: }
358:
359: function getPerpageKey()
360: {
361: return $this->mPrefix . "perpage";
362: }
363:
364: function getCurrentPage()
365: {
366: return intval(floor(($this->getStart() + $this->getPerpage()) / $this->getPerpage()));
367: }
368:
369: function hasPrivPage()
370: {
371: return ($this->getStart() - $this->getPerpage()) >= 0;
372: }
373:
374: function getPrivStart()
375: {
376: $prev = $this->getStart() - $this->getPerpage();
377:
378: return ($prev > 0) ? $prev : 0;
379: }
380:
381: function hasNextPage()
382: {
383: return $this->getTotalItems() > ($this->getStart() + $this->getPerpage());
384: }
385:
386: function getNextStart()
387: {
388: $next = $this->getStart() + $this->getPerpage();
389:
390: return ($this->getTotalItems() > $next) ? $next : 0;
391: }
392: }
393:
394: ?>
395: