Guest User

Untitled

a guest
Mar 19th, 2018
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.16 KB | None | 0 0
  1. <?php
  2.  
  3. /*
  4. * Класс для генерации постраничной навигации
  5. */
  6.  
  7. class Pagination
  8. {
  9.  
  10. /**
  11. *
  12. * @var Ссылок навигации на страницу
  13. *
  14. */
  15. private $max = 10;
  16.  
  17. /**
  18. *
  19. * @var Ключ для GET, в который пишется номер страницы
  20. *
  21. */
  22. private $index = 'page';
  23.  
  24. /**
  25. *
  26. * @var Текущая страница
  27. *
  28. */
  29. private $current_page;
  30.  
  31. /**
  32. *
  33. * @var Общее количество записей
  34. *
  35. */
  36. private $total;
  37.  
  38. /**
  39. *
  40. * @var Записей на страницу
  41. *
  42. */
  43. private $limit;
  44.  
  45. /**
  46. * Запуск необходимых данных для навигации
  47. * @param integer $total - общее количество записей
  48. * @param integer $limit - количество записей на страницу
  49. *
  50. * @return
  51. */
  52. public function __construct($total, $currentPage, $limit, $index)
  53. {
  54. # Устанавливаем общее количество записей
  55. $this->total = $total;
  56.  
  57. # Устанавливаем количество записей на страницу
  58. $this->limit = $limit;
  59.  
  60. # Устанавливаем ключ в url
  61. $this->index = $index;
  62.  
  63. # Устанавливаем количество страниц
  64. $this->amount = $this->amount();
  65.  
  66. # Устанавливаем номер текущей страницы
  67. $this->setCurrentPage($currentPage);
  68. }
  69.  
  70. /**
  71. * Для вывода ссылок
  72. *
  73. * @return HTML-код со ссылками навигации
  74. */
  75. public function get()
  76. {
  77. # Для записи ссылок
  78. $links = null;
  79.  
  80. # Получаем ограничения для цикла
  81. $limits = $this->limits();
  82.  
  83. $html = '<ul class="pagination">';
  84. # Генерируем ссылки
  85. for ($page = $limits[0]; $page <= $limits[1]; $page++) {
  86. # Если текущая это текущая страница, ссылки нет и добавляется класс active
  87. if ($page == $this->current_page) {
  88. $links .= '<li class="active"><a href="#">' . $page . '</a></li>';
  89. } else {
  90. # Иначе генерируем ссылку
  91. $links .= $this->generateHtml($page);
  92. }
  93. }
  94.  
  95. # Если ссылки создались
  96. if (!is_null($links)) {
  97. # Если текущая страница не первая
  98. if ($this->current_page > 1)
  99. # Создаём ссылку "На первую"
  100. $links = $this->generateHtml(1, '<') . $links;
  101.  
  102. # Если текущая страница не первая
  103. if ($this->current_page < $this->amount)
  104. # Создаём ссылку "На последнюю"
  105. $links .= $this->generateHtml($this->amount, '>');
  106. }
  107.  
  108. $html .= $links . '</ul>';
  109.  
  110. # Возвращаем html
  111. return $html;
  112. }
  113.  
  114. /**
  115. * Для генерации HTML-кода ссылки
  116. * @param integer $page - номер страницы
  117. *
  118. * @return
  119. */
  120. private function generateHtml($page, $text = null)
  121. {
  122. # Если текст ссылки не указан
  123. if (!$text)
  124. # Указываем, что текст - цифра страницы
  125. $text = $page;
  126.  
  127. $currentURI = rtrim($_SERVER['REQUEST_URI'], '/') . '/';
  128. $currentURI = preg_replace('~/page-[0-9]+~', '', $currentURI);
  129. # Формируем HTML код ссылки и возвращаем
  130. return
  131. '<li><a href="' . $currentURI . $this->index . $page . '">' . $text . '</a></li>';
  132. }
  133.  
  134. /**
  135. * Для получения, откуда стартовать
  136. *
  137. * @return массив с началом и концом отсчёта
  138. */
  139. private function limits()
  140. {
  141. # Вычисляем ссылки слева (чтобы активная ссылка была посередине)
  142. $left = $this->current_page - round($this->max / 2);
  143.  
  144. # Вычисляем начало отсчёта
  145. $start = $left > 0 ? $left : 1;
  146.  
  147. # Если впереди есть как минимум $this->max страниц
  148. if ($start + $this->max <= $this->amount)
  149. # Назначаем конец цикла вперёд на $this->max страниц или просто на минимум
  150. $end = $start > 1 ? $start + $this->max : $this->max;
  151. else {
  152. # Конец - общее количество страниц
  153. $end = $this->amount;
  154.  
  155. # Начало - минус $this->max от конца
  156. $start = $this->amount - $this->max > 0 ? $this->amount - $this->max : 1;
  157. }
  158.  
  159. # Возвращаем
  160. return
  161. array($start, $end);
  162. }
  163.  
  164. /**
  165. * Для установки текущей страницы
  166. *
  167. * @return
  168. */
  169. private function setCurrentPage($currentPage)
  170. {
  171. # Получаем номер страницы
  172. $this->current_page = $currentPage;
  173.  
  174. # Если текущая страница боле нуля
  175. if ($this->current_page > 0) {
  176. # Если текунщая страница меньше общего количества страниц
  177. if ($this->current_page > $this->amount)
  178. # Устанавливаем страницу на последнюю
  179. $this->current_page = $this->amount;
  180. } else
  181. # Устанавливаем страницу на первую
  182. $this->current_page = 1;
  183. }
  184.  
  185. /**
  186. * Для получеия общего числа страниц
  187. *
  188. * @return число страниц
  189. */
  190. private function amount()
  191. {
  192. # Делим и возвращаем
  193. return ceil($this->total / $this->limit);
  194. }
  195.  
  196. }
Add Comment
Please, Sign In to add comment