PageRenderTime 49ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/application/libraries/tree/paginator/st_paginator.php

http://comet.googlecode.com/
PHP | 406 lines | 227 code | 37 blank | 142 comment | 30 complexity | a3fc0bfcfe7c9eb7f95e751f139825e7 MD5 | raw file
Possible License(s): AGPL-3.0
  1. <?php
  2. if ( ! defined('BASEPATH')) exit('No direct script access allowed');
  3. /**
  4. * CodeIgniter
  5. * @package CodeIgniter
  6. * @subpackage Libraries
  7. * @author AnhDT
  8. */
  9. class st_paginator implements Countable, IteratorAggregate {
  10. // Ki?u tr??t trang
  11. protected static $_defaultScrolling = 'slider';
  12. // Ti?n t? c?a l?p tr??t trang
  13. protected static $_prefixScrolling = 'st_paginator_scrolling_';
  14. // Ti?n t? c?a l?p engine
  15. protected static $_prefixEngine = 'st_paginator_engine_';
  16. // L?p phân trang
  17. protected $_engine = null;
  18. // L?p tr??t trang
  19. protected $_scrolling = null;
  20. // S? l??ng các ph?n t? trong trang hi?n t?i
  21. protected $_currentItemCount = null;
  22. // Các ph?n t? trong trang hi?n t?i
  23. protected $_currentItems = null;
  24. // Ch? m?c trang hi?n t?i
  25. protected $_currentPageIndex = 1;
  26. // S? l??ng các ph?n t? có trong m?i trang
  27. protected $_itemCountPerPage = 4;
  28. // S? l??ng các trang
  29. protected $_pageCount = null;
  30. // Kho?ng cách tr??t
  31. protected $_pageRange = 5;
  32. // Các trang
  33. protected $_pages = null;
  34. public function __construct(st_paginator_engine_interface $_engine = null) {
  35. if (null !== $_engine) {
  36. $this->_engine = $_engine;
  37. }
  38. }
  39. /**Thi?t l?p ti?n t? tr??t trang*/
  40. public function setPrefixScrolling($_prefix = '') {
  41. if (!empty($_prefix)) {
  42. self::$_prefixScrolling = $_prefix;
  43. }
  44. return $this;
  45. }
  46. /**L?y v? ti?n t? tr??t trang*/
  47. public function getPrefixScrolling() {
  48. return (string)self::$_prefixScrolling;
  49. }
  50. /**Thi?t l?p ti?n t? engine*/
  51. public function setPrefixEngine($_prefix = '') {
  52. if (!empty($_prefix)) {
  53. self::$_prefixEngine = $_prefix;
  54. }
  55. return $this;
  56. }
  57. /**L?y v? ti?n t? engine*/
  58. public function getPrefixEngine() {
  59. return (string)self::$_prefixEngine;
  60. }
  61. /**L?y v? ki?u tr??t ch? m?c m?c ??nh*/
  62. public static function getDefaultScrolling() {
  63. return self::$_defaultScrolling;
  64. }
  65. /**Thi?t l?p ki?u tr??t ch? m?c m?c ??nh*/
  66. public static function setDefaultScrolling($_scrollingType = 'slider') {
  67. self::$_defaultScrolling = $_scrollingType;
  68. }
  69. /**
  70. * Tr? v? s? l??ng các trang
  71. * @return integer
  72. */
  73. public function count() {
  74. if (!$this->_pageCount) {
  75. $this->_pageCount = $this->_calculatePageCount();
  76. }
  77. return $this->_pageCount;
  78. }
  79. /**
  80. * Tr? v? s? l??ng các ph?n t? có s?n
  81. * @return integer
  82. */
  83. public function getTotalItemCount() {
  84. return count($this->_scrolling);
  85. }
  86. /**
  87. * Tr? v? ki?u phân trang: collection, array...
  88. * @return st_paginator_engine_interface
  89. */
  90. public function getEngine() {
  91. return $this->_engine;
  92. }
  93. /**
  94. * Thi?t l?p ki?u phân trang: collection, array...
  95. * @return st_paginator
  96. */
  97. public function setEngine(st_paginator_engine_interface $_engine) {
  98. $this->_engine = $_engine;
  99. return $this;
  100. }
  101. /**
  102. * Tr? v? s? l??ng các ph?n t? có trong trang hi?n t?i
  103. * @return integer
  104. */
  105. public function getCurrentItemCount() {
  106. if ($this->_currentItemCount === null) {
  107. $this->_currentItemCount = $this->getItemCount($this->getCurrentItems());
  108. }
  109. return $this->_currentItemCount;
  110. }
  111. /**
  112. * L?y v? các ph?n t? trong trang hi?n t?i
  113. * @return Traversable
  114. */
  115. public function getCurrentItems() {
  116. if ($this->_currentItems === null) {
  117. $this->_currentItems = $this->getItemsByPage($this->getCurrentPageNumber());
  118. }
  119. return $this->_currentItems;
  120. }
  121. /**
  122. * L?y v? ch? m?c trang hi?n th?i
  123. * @return integer
  124. */
  125. public function getCurrentPageNumber() {
  126. return $this->renderPageNumber($this->_currentPageIndex);
  127. }
  128. /**
  129. * Thi?t l?p trang hi?n th?i
  130. * @param integer $_pageNumber Page number
  131. * @return Zend_Paginator $this
  132. */
  133. public function setCurrentPageNumber($_pageNumber) {
  134. $this->_currentPageIndex = (integer) $_pageNumber;
  135. $this->_currentItems = null;
  136. $this->_currentItemCount = null;
  137. return $this;
  138. }
  139. /**
  140. * Tr? v? s? l??ng các ph?n t? có trong m?i trang
  141. * @return integer
  142. */
  143. public function getItemCountPerPage() {
  144. return $this->_itemCountPerPage;
  145. }
  146. /**
  147. * Thi?t l?p s? ph?n t? có trong m?i trang
  148. * @param integer $_itemCountPerPage
  149. * @return Zend_Paginator $this
  150. */
  151. public function setItemCountPerPage($_itemCountPerPage) {
  152. $this->_itemCountPerPage = (integer) $_itemCountPerPage;
  153. if ($this->_itemCountPerPage == 0) {
  154. $this->_itemCountPerPage = 1;
  155. }
  156. $this->_pageCount = $this->_calculatePageCount();
  157. $this->_currentItems = null;
  158. $this->_currentItemCount = null;
  159. return $this;
  160. }
  161. /**
  162. * Tr? v? s? ph?n t? có trong t?p h?p
  163. * @param mixed $items Items
  164. * @return integer
  165. */
  166. public function getItemCount($items) {
  167. $itemCount = 0;
  168. if (is_array($items) or $items instanceof Countable) {
  169. $itemCount = count($items);
  170. }
  171. return $itemCount;
  172. }
  173. /**
  174. * Tr? v? ph?n t? trong m?t trang, s? l?y trang hi?n th?i n?u ch?
  175. * m?c c?a trang không ???c ch? ra
  176. * @param integer $_itemNumber Item number (1 to itemCountPerPage)
  177. * @param integer $_pageNumber
  178. * @return mixed
  179. */
  180. public function getItem($_itemNumber, $_pageNumber = null) {
  181. $_itemNumber = $this->renderItemNumber($_itemNumber);
  182. if ($_pageNumber == null) {
  183. $_pageNumber = $this->getCurrentPageNumber();
  184. }
  185. $page = $this->getItemsByPage($_pageNumber);
  186. $itemCount = $this->getItemCount($page);
  187. if ($itemCount == 0 || $_itemNumber > $itemCount) {
  188. return false;
  189. }
  190. return $page[$_itemNumber - 1];
  191. }
  192. /**
  193. * Returns the items for a given page.
  194. *
  195. * @return Traversable
  196. */
  197. public function getItemsByPage($_pageNumber) {
  198. $_pageNumber = $this->renderPageNumber($_pageNumber);
  199. $offset = ($_pageNumber - 1) * $this->_itemCountPerPage;
  200. $items = $this->_engine->getItems($offset, $this->_itemCountPerPage);
  201. return $items;
  202. }
  203. /**
  204. * L?y v? b? duy?t cho các ph?n t? có trong trang hi?n t?i
  205. * @return Traversable
  206. */
  207. public function getIterator() {
  208. return $this->getCurrentItems();
  209. }
  210. /**
  211. * L?y v? kho?ng cách tr??t trang
  212. * @return integer
  213. */
  214. public function getPageRange() {
  215. return $this->_pageRange;
  216. }
  217. /**
  218. * Thi?t l?p kho?ng cách tr??t trang
  219. * @param integer $_pageRange
  220. * @return Zend_Paginator $this
  221. */
  222. public function setPageRange($_pageRange) {
  223. $this->_pageRange = (integer)$_pageRange;
  224. return $this;
  225. }
  226. /**
  227. * Tr? v? t?p h?p các trang
  228. * @param string $_scrollingType Scrolling style
  229. * @return array
  230. */
  231. public function getPages($_scrollingType) {
  232. if ($this->_pages === null) {
  233. $this->_pages = $this->_createPages($_scrollingType);
  234. }
  235. return $this->_pages;
  236. }
  237. /**
  238. * L?y v? các trang trong m?t kho?ng
  239. * @param integer $lowerBound Lower bound of the range
  240. * @param integer $upperBound Upper bound of the range
  241. * @return array
  242. */
  243. public function getPagesInRange($lowerBound, $upperBound) {
  244. $lowerBound = $this->renderPageNumber($lowerBound);
  245. $upperBound = $this->renderPageNumber($upperBound);
  246. $pages = array();
  247. for ($_pageNumber = $lowerBound; $_pageNumber <= $upperBound; $_pageNumber++) {
  248. $pages[$_pageNumber] = $_pageNumber;
  249. }
  250. return $pages;
  251. }
  252. /**
  253. * Chu?n hóa l?i giá tr? s? trong ?? dŕi c?a trang.
  254. * @param integer $_itemNumber
  255. * @return integer
  256. */
  257. protected function renderItemNumber($_itemNumber) {
  258. $_itemNumber = ($_itemNumber < 1) ? 1 : $_itemNumber;
  259. $_itemNumber = ($_itemNumber > $this->_itemCountPerPage) ? $_itemNumber = $this->_itemCountPerPage : $_itemNumber;
  260. return $_itemNumber;
  261. }
  262. /**Chu?n hóa l?i giá tr? ch? m?c c?a trang
  263. * @param integer $_pageNumber
  264. * @return integer
  265. */
  266. protected function renderPageNumber($_pageNumber) {
  267. $_pageNumber = ($_pageNumber < 1) ? 1 : $_pageNumber;
  268. $_pageCount = $this->count();
  269. if ($_pageCount > 0 and $_pageNumber > $_pageCount) {
  270. $_pageNumber = $_pageCount;
  271. }
  272. return $_pageNumber;
  273. }
  274. /**
  275. * Tính toán s? t?ng s? trang
  276. * @return integer
  277. */
  278. protected function _calculatePageCount() {
  279. return (integer) ceil($this->_engine->count() / $this->_itemCountPerPage);
  280. }
  281. /**
  282. * T?o ra t?p h?p các trang
  283. * @param string $_scrollingType Scrolling style
  284. * @return stdClass
  285. */
  286. protected function _createPages($_scrollingType = null) {
  287. $_pageCount = $this->count();
  288. $_currentPageNumber = $this->getCurrentPageNumber();
  289. $pages = new stdClass();
  290. $pages->pageCount = $_pageCount;
  291. $pages->itemCountPerPage = $this->getItemCountPerPage();
  292. $pages->first = 1;
  293. $pages->current = $_currentPageNumber;
  294. $pages->last = $_pageCount;
  295. // Previous and next
  296. if ($_currentPageNumber - 1 > 0) {
  297. $pages->previous = $_currentPageNumber - 1;
  298. }
  299. if ($_currentPageNumber + 1 <= $_pageCount) {
  300. $pages->next = $_currentPageNumber + 1;
  301. }
  302. // Pages in range
  303. $_scrollingType = $this->_loadScrolling($_scrollingType);
  304. $pages->pagesInRange = $_scrollingType->getPages($this);
  305. $pages->firstPageInRange = min($pages->pagesInRange);
  306. $pages->lastPageInRange = max($pages->pagesInRange);
  307. // Item numbers
  308. if ($this->getCurrentItems() !== null) {
  309. $pages->currentItemCount = $this->getCurrentItemCount();
  310. $pages->itemCountPerPage = $this->getItemCountPerPage();
  311. $pages->totalItemCount = $this->getTotalItemCount();
  312. $pages->firstItemNumber = (($_currentPageNumber - 1) * $this->_itemCountPerPage) + 1;
  313. $pages->lastItemNumber = $pages->firstItemNumber + $pages->currentItemCount - 1;
  314. }
  315. return $pages;
  316. }
  317. /**
  318. * N?p m?t ki?u phân trang
  319. * @param string $_scrollingType
  320. * @return Zend_Paginator_Scrolling_Interface
  321. */
  322. protected function _loadScrolling($_scrollingType = null) {
  323. if ($_scrollingType === null) {
  324. $_scrollingType = self::$_prefixScrolling . self::$_defaultScrolling;
  325. }
  326. switch (strtolower(gettype($_scrollingType))) {
  327. case 'object':
  328. if (!$_scrollingType instanceof st_paginator_scrolling_interface) {
  329. return false;
  330. }
  331. if (null === $this->_scrolling) {
  332. $this->_scrolling = $_scrollingType;
  333. }
  334. return $this->_scrolling;
  335. case 'string':
  336. $_className = strtolower(self::$_prefixScrolling .$_scrollingType);
  337. if (!class_exists($_className)) {
  338. require_once APP_LIBRARY_PATH . 'tree/paginator/scrolling/' . $_className . '.php';
  339. }
  340. if (null === $this->_scrolling) {
  341. $this->_scrolling = new $_className();
  342. }
  343. return $this->_scrolling;
  344. case 'null':
  345. default:
  346. return false;
  347. }
  348. }
  349. /**
  350. * S? d?ng c?u hěnh trong m?t l?n goi ph??ng th?c
  351. * @param class $_engine
  352. * @param integer $_itemPerPage
  353. * @param integer $_pageRange
  354. * @param integer $_currentPageNumber
  355. * @param string $_scrollingType
  356. * @return Zend_Paginator_Scrolling_Interface
  357. */
  358. public function setConfig($_config = array()) {
  359. if (!is_array($_config) || count($_config) == null) {
  360. throw new Exception("config must be array and not empty");
  361. }
  362. foreach ($_config as $_key => $_object) {
  363. $_method = 'set' . ucfirst($_key);
  364. $this->$_method($_object);
  365. }
  366. return $this;
  367. }
  368. }
  369. ?>