Advertisement
UserWEb

Untitled

Jul 11th, 2016
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 9.56 KB | None | 0 0
  1. <?php
  2.     /*
  3.     * Класс для генерации постраничной навигации
  4.     */
  5.     class Pagination
  6.     {
  7.         /**
  8.         *
  9.         * @var Ссылок навигации на страницу
  10.         *
  11.         */
  12.         private $max = 4;
  13.        
  14.         /**
  15.         *
  16.         * @var Ключ для GET, в который пишется номер страницы
  17.         *
  18.         */
  19.         private $index = 'page';
  20.        
  21.         /**
  22.         *
  23.         * @var Текущий GET-запрос
  24.         *
  25.         */
  26.         private $query;
  27.        
  28.         /**
  29.         *
  30.         * @var Текущая страница
  31.         *
  32.         */
  33.         private $current_page;
  34.        
  35.         /**
  36.         *
  37.         * @var Общее количество записей
  38.         *
  39.         */
  40.         private $total;
  41.        
  42.         /**
  43.         *
  44.         * @var Записей на страницу
  45.         *
  46.         */
  47.         private $limit;
  48.        
  49.         /**
  50.         * Запуск необходимых данных для навигации
  51.         * @param integer $total - общее количество записей
  52.         * @param integer $limit - количество записей на страницу
  53.         *
  54.         * @return
  55.         */
  56.         public function __construct( $total, $limit )
  57.         {
  58.             # Устанавливаем общее количество записей
  59.            $this->total  = $total;
  60.            
  61.             # Устанавливаем количество записей на страницу
  62.            $this->limit  = $limit;
  63.            
  64.             # Устанавливаем количество страниц
  65.            $this->amount = $this->amount();
  66.            
  67.             # Вызываем метод установки текущей страницы
  68.            $this->setCurrentPage();
  69.            
  70.             # Вызываем метод установки текущего GET-запроса
  71.            $this->setQueryString();
  72.         }
  73.        
  74.         /**
  75.         *  Для вывода ссылок
  76.         *
  77.         * @return HTML-код со ссылками навигации
  78.         */
  79.         public function get()
  80.         {
  81.             # Для записи ссылок
  82.            $links = null;
  83.            
  84.             # Получаем ограничения для цикла
  85.            $limits = $this->limits();
  86.            
  87.             # Генерируем ссылки
  88.            for($page=$limits[0]; $page<=$limits[1]; $page++)
  89.             {
  90.                 # Если текущая это текущая страница
  91.                if($page == $this->current_page)
  92.                     # Обводим жирным
  93.                    $links .= '<b>'. $page .'</b>';
  94.                 else
  95.                     # Заносим ссылку
  96.                    $links .= $this->generateHtml($page);
  97.             }
  98.            
  99.             # Если ссылки создались - генерируем "Следующая", "Предыдущая", "Первая", "Последняя"
  100.            if(!is_null( $links ))
  101.             {
  102.                 # Если текущая страница не первая
  103.                if($this->current_page > 1){
  104.                     # Создаём ссылку "Предыдущая"
  105.                    $links = $this->generateHtml($this->current_page - 1, '&lt;', 'Предыдущая') . $links;
  106.                    
  107.                     # Создаём ссылку "Первая"
  108.                    $links = $this->generateHtml(1, '&lt;&lt;', 'Первая') . $links;
  109.                 }
  110.                
  111.                 # Если текущая страница не первая
  112.                if($this->current_page < $this->amount){
  113.                     # Создаём ссылку "Следующая"
  114.                    $links .= $this->generateHtml($this->current_page + 1, '&gt;', 'Следующая');  
  115.                    
  116.                     # Создаём ссылку "Следующая"
  117.                    $links .= $this->generateHtml($this->amount, '&gt;&gt;', 'Последняя');  
  118.                 }  
  119.             }
  120.            
  121.             # Возвращаем ссылки
  122.            return $links;
  123.         }
  124.        
  125.         /**
  126.         * Для получения, откуда начинать выборку
  127.         *
  128.         * @return integer
  129.         */
  130.         public function skip(){
  131.             return
  132.                 $this->current_page * $this->limit - $this->limit;
  133.         }
  134.        
  135.         /**
  136.         * Для получение ограничения выборки
  137.         *
  138.         * @return integer
  139.         */
  140.         public function take(){
  141.             # Получаем, откуда начинаем
  142.            $skip = $this->skip();
  143.            
  144.             # Возвращаем ограницение
  145.            return
  146.                 $skip + $this->limit > $this->total ? $this->total - $skip : $this->limit;
  147.         }
  148.        
  149.         /**
  150.         * Для генерации HTML-кода ссылки
  151.         * @param string $query - текущий GET-запрос
  152.         * @param integer $page - номер страницы
  153.         *
  154.         * @return
  155.         */
  156.         private function generateHtml( $page, $text=null, $title=null ){
  157.             # Если текст ссылки не указан
  158.            if(!$text)
  159.                 # Указываем, что текст - цифра страницы
  160.                $text = $page;
  161.            
  162.             # Формируем ссылку
  163.            $query = $this->index .'='. $page;
  164.            
  165.             # Формируем строку запроса (после вопроса)
  166.            $query = $this->query ? $this->query .'&'. $query : $query;
  167.                
  168.             # Формируем HTML код ссылки и возвращаем
  169.            return
  170.                 '<a href="?'. $query .'" title="'. $title .'">'. $text .'</a>';
  171.         }
  172.        
  173.         /**
  174.         *  Для получения, откуда стартовать вывод ссылок
  175.         *
  176.         * @return массив с началом и концом отсчёта
  177.         */
  178.         private function limits()
  179.         {
  180.             # Вычисляем ссылки слева (чтобы активная ссылка была посередине)
  181.            $left = $this->current_page - round($this->max / 2);
  182.  
  183.             # Вычисляем начало отсчёта
  184.            $start = $left > 0 ? $left : 1;                
  185.            
  186.             # Если впереди есть как минимум $this->max страниц
  187.            if($start + $this->max <= $this->amount)
  188.                 # Назначаем конец цикла вперёд на $this->max страниц или просто на минимум
  189.                $end = $start > 1 ? $start + $this->max : $this->max;
  190.             else{
  191.                 # Конец - общее количество страниц
  192.                $end = $this->amount;
  193.  
  194.                 # Начало - минус $this->max от конца
  195.                $start = $this->amount - $this->max > 0 ? $this->amount - $this->max : 1;
  196.              
  197.             }
  198.            
  199.             # Возвращаем
  200.            return [$start, $end];
  201.         }
  202.  
  203.         /**
  204.         * Для установки текущей страницы
  205.         *
  206.         * @return
  207.         */
  208.         private function setCurrentPage()
  209.         {
  210.             # Получаем номер страницы
  211.            $this->current_page = isset($_GET[$this->index]) ? (int) $_GET[$this->index] : 1;
  212.            
  213.             # Если текущая страница боле нуля
  214.            if($this->current_page > 0)
  215.             {
  216.                 # Если текунщая страница меньше общего количества страниц
  217.                if($this->current_page > $this->amount)
  218.                     # Устанавливаем страницу на последнюю
  219.                    $this->current_page = $this->amount;
  220.             }
  221.             else
  222.                 # Устанавливаем страницу на первую
  223.                $this->current_page = 1;
  224.         }
  225.        
  226.         /**
  227.         * Для получения и установки текущего GET-запроса
  228.         *
  229.         * @return
  230.         */
  231.         private function setQueryString(){
  232.             # Получаем параметры текущего запроса
  233.            $query = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_QUERY );
  234.            
  235.             # Разбираем строку запроса
  236.            parse_str( $query, $params );
  237.            
  238.             # Удаляем значение страницы, если есть
  239.            unset( $params[$this->index] );
  240.            
  241.             # Формируем запрос
  242.            $this->query = http_build_query( $params );
  243.         }
  244.        
  245.         /**
  246.         * Для получеия общего числа страниц
  247.         *
  248.         * @return число страниц
  249.         */
  250.         private function amount()
  251.         {
  252.             # Делим и возвращаем
  253.            return
  254.                 ceil( $this->total / $this->limit );
  255.         }
  256.     }
  257. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement