You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

234 lines
11 KiB

7 years ago
7 years ago
  1. <?php
  2. defined('BASEPATH') OR exit('No direct script access allowed');
  3. class Paging
  4. {
  5. protected $base_url = ""; // 기본 연결링크
  6. protected $page_rows = 0; // 한페이지에 출력할 Row 수
  7. protected $total_rows = 0; // 총 Row수
  8. protected $display_always = TRUE; // 페이지가 1페이지만 있어도 출력할건지 여부
  9. protected $fixed_page_num = 10; // 한번에 표시할 페이지 수
  10. protected $first_link = "<i class='far fa-chevron-double-left'></i>"; // [처음] 버튼에 표시할 문자
  11. protected $next_link = '<i class="far fa-chevron-right"></i>'; // [다음] 버튼에 표시할 문자
  12. protected $prev_link = '<i class="far fa-chevron-left"></i>'; // [이전] 버튼에 표시할 문자
  13. protected $last_link = '<i class="far fa-chevron-double-right"></i>'; // [마지막] 버튼에 표시할 문자
  14. protected $full_tag_open = '<ul class="pagination pagination-sm">'; // 전체를 감싸는 여는 태그
  15. protected $full_tag_close = '</ul>'; // 전체를 감싸는 닫는 태그
  16. protected $item_tag_open = "<li>"; // 각 페이지 링크 여는 태그
  17. protected $item_tag_close = "</li>"; // 각 페이지 링크 닫는 태그
  18. protected $cur_tag_open = "<li class='active'>"; // 현재 페이지 링크 여는 태그
  19. protected $cur_tag_close = "</li>"; // 현재 페이지 링크 닫는 태그
  20. protected $first_tag_open = '<li class="paging-first paging-util">';
  21. protected $first_tag_close = '</li>';
  22. protected $last_tag_open = '<li class="paging-last paging-util">';
  23. protected $last_tag_close = '</li>';
  24. protected $next_tag_open = '<li class="paging-next paging-util">';
  25. protected $next_tag_close = '</li>';
  26. protected $prev_tag_open = '<li class="paging-prev paging-util">';
  27. protected $prev_tag_close = '</li>';
  28. protected $page_param = "page"; // 패러미터 이름
  29. protected $add_param = ""; // 추가 패러미터
  30. protected $display_pages = TRUE;
  31. protected $disable_first_link = TRUE; // 현재 페이지가 첫페이지일때 [처음] 링크를 disabled 시킨다..
  32. protected $disable_last_link = TRUE; // 현재 페이지가 마지막페이지일때 [마지막] 링크를 disabled 시킨다..
  33. protected $disable_prev_link = TRUE; // 현재 페이지가 처음페이지일때 [이전] 링크를 disabled 시킨다..
  34. protected $disable_next_link = TRUE; // 현재 페이지가 마지막페이지일때 [마지막] 링크를 disabled 시킨다.
  35. protected $display_first_always = TRUE; // 현재페이지가 첫페이일때 [처음] 링크를 보여준다..
  36. protected $display_last_always = TRUE; // 현재페이지가 마지막페이지일때 [마지막] 링크를 보여준다..
  37. protected $display_prev_always = TRUE; // 현재페이지가 첫번째페이지일때 [이전] 링크를 보여준다..
  38. protected $display_next_always = TRUE; // 현재페이지가 마지막페이지일때 [다음] 링크를 보여준다.
  39. protected $disabled_first_tag_open = '<li class="paging-first disabled">';
  40. protected $disabled_first_tag_close = '</li>';
  41. protected $disabled_last_tag_open = '<li class="paging-last disabled">';
  42. protected $disabled_last_tag_close = '</li>';
  43. protected $disabled_prev_tag_open = '<li class="paging-prev disabled">';
  44. protected $disabled_prev_tag_close = '</li>';
  45. protected $disabled_next_tag_open = '<li class="paging-next disabled">';
  46. protected $disabled_next_tag_close = '</li>';
  47. // 내부 사용변수
  48. protected $page = 1; // 현재 페이지
  49. protected $CI;
  50. function __construct($params = array())
  51. {
  52. $this->initialize($params);
  53. $this->CI =& get_instance();
  54. }
  55. // 넘겨받은 설정값으로 세팅값을 변경한다.
  56. public function initialize(array $params = array())
  57. {
  58. foreach ($params as $key => $val)
  59. {
  60. if (property_exists($this, $key))
  61. {
  62. $this->$key = $val;
  63. }
  64. }
  65. return $this;
  66. }
  67. public function create($options=array())
  68. {
  69. if(is_array($options) && count($options) > 0)
  70. {
  71. $this->initialize($options);
  72. }
  73. if( empty($this->add_param) ) {
  74. $get_array = $_GET;
  75. unset($get_array['page']);
  76. $this->add_param = http_build_query($get_array);
  77. if(! empty($this->add_param)) {
  78. $this->add_param = "&".$this->add_param;
  79. }
  80. }
  81. if( empty($this->base_url)) {
  82. $this->base_url = current_url();
  83. }
  84. // 만약 총 Rows가 0이거나, 한줄당 표시가 0 인경우는 return 한다.
  85. if ($this->total_rows == 0 OR $this->page_rows == 0) return '';
  86. // 총 몇페이지가 나올지 계산한다
  87. $num_pages = (int) ceil($this->total_rows / $this->page_rows);
  88. // $display_always 값이 FALSE 이고 페이지가 하나일경우 return 한다.
  89. if ($this->display_always === FALSE AND $num_pages === 1) return '';
  90. // 한번에 표시할 페이지수를 체크한다.
  91. // 값이 잘못되어있다면 아무것도 표시하지 않는다.
  92. $this->fixed_page_num = (int) $this->fixed_page_num;
  93. if ($this->fixed_page_num < 0) return "";
  94. // 앞부분 링크 URL을 만든다.
  95. $base_url = trim($this->base_url);
  96. // 주소 URL에서 현재 page를 가져온다.
  97. $this->page = (isset($_GET[$this->page_param]) && $_GET[$this->page_param])?$_GET[$this->page_param]:1;
  98. $this->cur_page = (int) $this->page;
  99. // 페이지 값이 총 페이지수를 넘지 않는지 확인한다.
  100. // 만약 더 많다면, 총 페이지값으로 치환해준다.
  101. if ($this->cur_page > $num_pages)
  102. {
  103. $this->cur_page = $num_pages;
  104. }
  105. $uri_page_number = $this->cur_page;
  106. // 시작과 종료 페이지 번호를 얻어온다.
  107. $start = (ceil($this->cur_page / $this->fixed_page_num) - 1) * $this->fixed_page_num + 1 + 1; // Last plus one is for loop statement starts $start - 1
  108. $end = (ceil($this->cur_page / $this->fixed_page_num) == ceil($num_pages / $this->fixed_page_num)) ? $num_pages : ceil($this->cur_page / $this->fixed_page_num) * $this->fixed_page_num;
  109. // Return 할 문자열을 만든다.
  110. $output = '';
  111. // [처음으로] 버튼 만들기
  112. if ($this->first_link !== FALSE)
  113. {
  114. if ($this->display_first_always === TRUE AND $this->disable_first_link === TRUE AND $this->cur_page == 1)
  115. {
  116. $output .= $this->disabled_first_tag_open . "<span>" . $this->first_link . "</span>" . $this->disabled_first_tag_close;
  117. }
  118. else if ($this->display_first_always === TRUE OR $this->cur_page != 1)
  119. {
  120. $output .= $this->first_tag_open.'<a href="'.$base_url.'?'.$this->page_param.'=1'.$this->add_param.'">'.$this->first_link.'</a>'.$this->first_tag_close;
  121. }
  122. }
  123. // [이전] 버튼 만들기
  124. if ($this->prev_link !== FALSE)
  125. {
  126. if ($this->display_prev_always === TRUE AND $this->disable_prev_link === TRUE AND $this->cur_page == 1)
  127. {
  128. $output .= $this->disabled_prev_tag_open . "<span>" . $this->prev_link . "</span>" . $this->disabled_prev_tag_close;
  129. }
  130. else if ($this->display_prev_always === TRUE OR $this->cur_page != 1)
  131. {
  132. // 이전페이지 번호를 가져온다. 단, 현재페이지가 1이면, 이전페이지도 1을 가져온다.
  133. $i = ($uri_page_number == 1) ? 1 : ( $uri_page_number - 1);
  134. $output .= $this->prev_tag_open.'<a href="'.$base_url.'?'.$this->page_param."=".$i.$this->add_param.'">'
  135. .$this->prev_link.'</a>'.$this->prev_tag_close;
  136. }
  137. }
  138. // 각 페이지 버튼을 만든다.
  139. if ($this->display_pages !== FALSE)
  140. {
  141. for ($loop = $start -1; $loop <= $end; $loop++)
  142. {
  143. $i = $loop;
  144. if ($i >= 1)
  145. {
  146. if ($this->cur_page == $loop)
  147. {
  148. // 현재 페이지일 경우
  149. $output .= $this->cur_tag_open.'<span>'.$loop.'</span>'.$this->cur_tag_close;
  150. }
  151. else
  152. {
  153. $output .= $this->item_tag_open.'<a href="'.$base_url.'?'.$this->page_param."=".$loop.$this->add_param.'">'.$loop.'</a>'.$this->item_tag_close;
  154. }
  155. }
  156. }
  157. }
  158. // 다음으로 버튼을 만든다.
  159. if ($this->next_link !== FALSE)
  160. {
  161. if ($this->display_next_always === TRUE AND $this->disable_next_link === TRUE AND $this->cur_page == $num_pages)
  162. {
  163. $output .= $this->disabled_next_tag_open . "<span>" . $this->next_link . "</span>" . $this->disabled_next_tag_close;
  164. }
  165. else if ($this->display_next_always === TRUE OR $this->cur_page != $num_pages)
  166. {
  167. // 다음페이지를 계산해준다. 현재페이지가 마지막페이지라면, 현재페이지를 세팅
  168. $i = ($this->cur_page == $num_pages)? $num_pages : $this->cur_page + 1;
  169. $output .= $this->next_tag_open.'<a href="'.$base_url.'?'.$this->page_param."=".$i.$this->add_param.'">'.$this->next_link.'</a>'.$this->next_tag_close;
  170. }
  171. }
  172. // [마지막으로 페이지를 만든다.]
  173. if ($this->last_link !== FALSE)
  174. {
  175. if ($this->display_last_always === TRUE AND $this->disable_last_link === TRUE AND $this->cur_page == $num_pages)
  176. {
  177. $output .= $this->disabled_last_tag_open . "<span>" . $this->last_link . "</span>" . $this->disabled_last_tag_close;
  178. }
  179. else if ($this->display_last_always === TRUE OR $this->cur_page != $num_pages)
  180. {
  181. $i = $num_pages;
  182. $output .= $this->last_tag_open.'<a href="'.$base_url.'?'.$this->page_param."=".$i.'">'.$this->last_link.'</a>'.$this->last_tag_close;
  183. }
  184. }
  185. // 완성된 return 값을 정리한다.
  186. $output = preg_replace('#([^:])//+#', '\\1/', $output);
  187. return $this->full_tag_open.$output.$this->full_tag_close;
  188. }
  189. function __destruct()
  190. {
  191. }
  192. }