PageRenderTime 50ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/php/PageBrowser/Default.php

http://dynagrid.googlecode.com/
PHP | 240 lines | 121 code | 19 blank | 100 comment | 11 complexity | 848a65fd604854ff73abad511bc05b78 MD5 | raw file
  1. <?php
  2. /**
  3. * DynaGrid - The PHP datagrid
  4. *
  5. * @package DynaGrid
  6. * @author $Author: keesschepers $
  7. * @version $Id: Default.php 12 2011-02-12 00:33:20Z keesschepers $
  8. */
  9. include_once 'PageBrowser/Interface.php';
  10. final class DynaGrid_PageBrowser_Default implements DynaGrid_PageBrowser_Interface {
  11. public static $lblPrevious = 'Previous';
  12. public static $lblNext = 'Next';
  13. public static $lblGlobal = 'Page';
  14. /**
  15. * Limit of items on a page
  16. *
  17. * @var integer
  18. */
  19. private $limit=0;
  20. /**
  21. * Total amount of records available for the list the parent object is drawing
  22. *
  23. * @var integer
  24. */
  25. private $totalRecords=0;
  26. /**
  27. * Calculated number of pages available for parent's data
  28. *
  29. * @var integer
  30. */
  31. private $pages=0;
  32. /**
  33. * To avoid too many numbers being displayed, you can use a offset like google (...5678...) instead
  34. * of 12345678.
  35. *
  36. * @var integer
  37. */
  38. private $browseOffset=8;
  39. /**
  40. * Current page the user is browsing
  41. *
  42. * @var integer
  43. */
  44. private $pageNumber=0;
  45. /**
  46. * URL object, to modify or display the correct url
  47. *
  48. * @var DynaGrid_Url
  49. */
  50. private $url;
  51. /**
  52. *
  53. * @var string Argument which is used for determing which page nr we are.
  54. */
  55. private $pageArgument;
  56. /**
  57. * Constructor
  58. *
  59. * @param DynaGrid_Url $url
  60. * @param string $pageArgument Which GET argument is used for determining which pagenr we are
  61. * @param array $labels An associative array with keys previous, next and page with value as label
  62. */
  63. public function __construct(DynaGrid_Url &$url, $pageArgument='pagenr', $labels = array()) {
  64. $this->pageNumber = $url->pagenr;
  65. $this->url = $url;
  66. $this->pageArgument = $pageArgument;
  67. /**
  68. * Set the labels for rendering the pagebrowser
  69. */
  70. if(is_array($labels) && count($labels) > 2) {
  71. foreach($labels as $key=>$label) {
  72. switch($key) {
  73. case 'previous' :
  74. self::$lblPrevious = $label;
  75. break;
  76. case 'next' :
  77. self::$lblNext;
  78. break;
  79. case 'page' :
  80. self::$lblGlobal = $label;
  81. break;
  82. }
  83. }
  84. }
  85. }
  86. /**
  87. * Set the limit of "items" per page
  88. *
  89. * @param integer $limit
  90. */
  91. public function setLimit($limit) {
  92. $this->limit = (int)$limit;
  93. }
  94. /**
  95. * The total amount of "items" available
  96. *
  97. * @param integer $totalRecords
  98. */
  99. public function setTotalRecords($totalRecords) {
  100. $this->totalRecords = (int)$totalRecords;
  101. }
  102. public function setBrowseOffset($browseoffset) {
  103. $this->browseOffset = $browseoffset>0 ? (int)$browseoffset : 8;
  104. }
  105. /**
  106. * Set the current page user is visiting
  107. *
  108. * @param integer $currentPage
  109. */
  110. public function setCurrentPage($currentPage) {
  111. $this->pageNumber = (int)$currentPage;
  112. }
  113. public function getCurrentPage() {
  114. return $this->pageNumber;
  115. }
  116. /**
  117. * Get the previous "button"
  118. *
  119. * @return string HTML
  120. */
  121. private function getPrevious() {
  122. $str = '';
  123. $url = clone $this->url;
  124. $url->pagenr = ($url->pagenr-1);
  125. $str .= '<div class="browserleft">';
  126. $str .= '<a href="'.$url->getQueryString().'" ';
  127. $str .= 'title="'.self::$lblPrevious.' &laquo;" ';
  128. $str .= '>'.self::$lblPrevious;
  129. $str .= '</a>';
  130. $str .= '</div>';
  131. return $str;
  132. }
  133. /**
  134. * Get the next "button"
  135. *
  136. * @return string HTML
  137. */
  138. private function getNext() {
  139. $str = '';
  140. $url = clone $this->url;
  141. $url->pagenr = ($url->pagenr+1);
  142. $str .= '<div class="browserright">';
  143. $str .= '<a href="'.$url->getQueryString().'" ';
  144. $str .= 'title="'.self::$lblNext.' &raquo;" ';
  145. $str .= '>'.self::$lblNext;
  146. $str .= '</a>';
  147. $str .= '</div>';
  148. return $str;
  149. }
  150. /**
  151. * Creates the HTML for a part of the page browser (a iteration) and returns it's HTML.
  152. *
  153. * @param integer $pagenr
  154. * @param string $innerHTML will be replaced with the iteration if set
  155. * @return string HTML
  156. */
  157. private function renderPageNumber($pagenr,$innerHTML='') {
  158. $str ='';
  159. $url = clone $this->url;
  160. $url->pagenr = $pagenr;
  161. $str .= '<span>';
  162. $str .= '<a href="'.$url->getQueryString().'" ';
  163. $str .= 'title="'.ucfirst(self::$lblGlobal).': '.($pagenr+1).'" ';
  164. $str .= 'class="'.(($pagenr == $this->pageNumber) ? 'pageBrowserSelected' : 'pageBrowser').'" ';
  165. $str .= '>';
  166. $str .= ((strlen($innerHTML)>0) ? $innerHTML : ($pagenr+1));
  167. $str .= '</a>';
  168. $str .= '</span>';
  169. return $str;
  170. }
  171. /**
  172. * Proces all functionality of the page browser and return a HTML string
  173. *
  174. * @return string HTML
  175. */
  176. private function process() {
  177. if($this->totalRecords > 0 && $this->limit > 0){
  178. $this->pages = ceil($this->totalRecords / $this->limit);
  179. }
  180. $str = '<div class="pagebrowser">';
  181. /**
  182. * Previous button
  183. */
  184. if($this->pageNumber > 0){
  185. $str .= $this->getPrevious();
  186. }else{
  187. $str .= '<div class="browserleft">&nbsp;</div>' ;
  188. }
  189. $str .= '<div class="browsermiddle">';
  190. $start = ($this->pageNumber>($this->browseOffset/2)) ? ceil($this->pageNumber-($this->browseOffset/2)) : 0;
  191. $end = (($this->pageNumber+($this->browseOffset/2)) < $this->pages) ? ceil($this->pageNumber+($this->browseOffset/2)) : $this->pages;
  192. if($this->pages>0)
  193. $str .= $this->renderPageNumber(0,'&laquo;');
  194. for($pagenr=$start; $pagenr<$end; $pagenr++) {
  195. $str .= ' '.$this->renderPageNumber($pagenr).' ';
  196. }
  197. if($this->pages>0)
  198. $str .= $this->renderPageNumber(($this->pages-1),'&raquo;');
  199. $str .= '</div>';
  200. /**
  201. * Next button
  202. */
  203. if($this->pageNumber < ($this->pages-1)){
  204. $str .= $this->getNext();
  205. } else {
  206. $str .= '<div class="browserright">&nbsp;</div>';
  207. }
  208. $str .= '<div class="spacer"></div>';
  209. $str .= '</div>';
  210. return $str;
  211. }
  212. /**
  213. * Function according to the interface which should return HTML content
  214. *
  215. * @return string HTML
  216. */
  217. public function getHTML() {
  218. return $this->process();
  219. }
  220. }
  221. ?>