Guest User

Untitled

a guest
Jun 22nd, 2018
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.07 KB | None | 0 0
  1. <?php
  2.  
  3. /*
  4. * Класс Pagination для генерации постраничной навигации
  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 type $total <p>Общее количество записей</p>
  48. * @param type $currentPage <p>Номер текущей страницы</p>
  49. * @param type $limit <p>Количество записей на страницу</p>
  50. * @param type $index <p>Ключ для url</p>
  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. * @return HTML-код со ссылками навигации
  73. */
  74. public function get()
  75. {
  76. # Для записи ссылок
  77. $links = null;
  78.  
  79. # Получаем ограничения для цикла
  80. $limits = $this->limits();
  81.  
  82. $html = '<ul class="pagination">';
  83. # Генерируем ссылки
  84. for ($page = $limits[0]; $page <= $limits[1]; $page++) {
  85. # Если текущая это текущая страница, ссылки нет и добавляется класс active
  86. if ($page == $this->current_page) {
  87. $links .= '<li class="active"><a href="#">' . $page . '</a></li>';
  88. } else {
  89. # Иначе генерируем ссылку
  90. $links .= $this->generateHtml($page);
  91. }
  92. }
  93.  
  94. # Если ссылки создались
  95. if (!is_null($links)) {
  96. # Если текущая страница не первая
  97. if ($this->current_page > 1)
  98. # Создаём ссылку "На первую"
  99. $links = $this->generateHtml(1, '<span aria-hidden="true">&laquo;</span></a></li>') . $links;
  100. else
  101. $links = '<li class="disabled"><a href="#" aria-label="Previous"><span aria-hidden="true">&laquo;</span></a></li>' . $links;
  102. # Если текущая страница не первая
  103. if ($this->current_page < $this->amount)
  104. # Создаём ссылку "На последнюю"
  105. $links .= $this->generateHtml($this->amount, '<span aria-hidden="true">»</span>');
  106. else
  107. $links .= '<li class="disabled"><a href="#" aria-label="Previous"><span aria-hidden="true">»</span></a></li>';
  108. }
  109.  
  110. $html .= $links . '</ul>';
  111.  
  112. # Возвращаем html
  113. return $html;
  114. }
  115.  
  116. /**
  117. * Для генерации HTML-кода ссылки
  118. * @param integer $page - номер страницы
  119. *
  120. * @return
  121. */
  122. private function generateHtml($page, $text = null)
  123. {
  124. # Если текст ссылки не указан
  125. if (!$text)
  126. # Указываем, что текст - цифра страницы
  127. $text = $page;
  128.  
  129. $currentURI = rtrim($_SERVER['PHP_SELF'], '/');
  130. $currentURI = preg_replace('~/page-[0-9]+~', '', $currentURI);
  131. # Формируем HTML код ссылки и возвращаем
  132. return
  133. '<li><a href="' . $currentURI . $this->index . $page . '">' . $text . '</a></li>';
  134. }
  135.  
  136. /**
  137. * Для получения, откуда стартовать
  138. *
  139. * @return массив с началом и концом отсчёта
  140. */
  141. private function limits()
  142. {
  143. # Вычисляем ссылки слева (чтобы активная ссылка была посередине)
  144. $left = $this->current_page - round($this->max / 2);
  145.  
  146. # Вычисляем начало отсчёта
  147. $start = $left > 0 ? $left : 1;
  148.  
  149. # Если впереди есть как минимум $this->max страниц
  150. if ($start + $this->max <= $this->amount) {
  151. # Назначаем конец цикла вперёд на $this->max страниц или просто на минимум
  152. $end = $start > 1 ? $start + $this->max : $this->max;
  153. } else {
  154. # Конец - общее количество страниц
  155. $end = $this->amount;
  156.  
  157. # Начало - минус $this->max от конца
  158. $start = $this->amount - $this->max > 0 ? $this->amount - $this->max : 1;
  159. }
  160.  
  161. # Возвращаем
  162. return
  163. array($start, $end);
  164. }
  165.  
  166. /**
  167. * Для установки текущей страницы
  168. *
  169. * @return
  170. */
  171. private function setCurrentPage($currentPage)
  172. {
  173. # Получаем номер страницы
  174. $this->current_page = $currentPage;
  175.  
  176. # Если текущая страница больше нуля
  177. if ($this->current_page > 0) {
  178. # Если текущая страница меньше общего количества страниц
  179. if ($this->current_page > $this->amount)
  180. # Устанавливаем страницу на последнюю
  181. $this->current_page = $this->amount;
  182. } else
  183. # Устанавливаем страницу на первую
  184. $this->current_page = 1;
  185. }
  186.  
  187. /**
  188. * Для получения общего числа страниц
  189. *
  190. * @return число страниц
  191. */
  192. private function amount()
  193. {
  194. # Делим и возвращаем
  195. return ceil($this->total / $this->limit);
  196. }
  197.  
  198. }
  199.  
  200. //////////////////////
  201.  
  202.  
  203. $recordsPerPage = 100;
  204.  
  205. $total = getNumberOfRecords();
  206.  
  207. if (isset($_GET['page'])) {
  208. $page = (int)$_GET['page'];
  209. } else {
  210. // первая страница по умолчанию
  211. $page = 1;
  212. }
  213.  
  214.  
  215. $Records = getRecords($page, $recordsPerPage);
  216.  
  217. $pagination = new Pagination($total, $page, $recordsPerPage, '?action=read&page=');
  218.  
  219.  
  220. ORDER BY qeydiyyat_tarixi DESC OFFSET 20 * ($page - 1) ROWS FETCH NEXT (20 row count) ROWS ONLY"
Add Comment
Please, Sign In to add comment