Убрать page=1 из пагинации

340
06 июня 2017, 01:07

Сделал пагинацию на основе кода нарытого на просторах интернета, так-как такая реализация больше всего мне подходит, помогите сделать так чтобы при переходе на первую страницу переходило не на site.com/category?page=1, а на site.com/category.

Вот оригинал класса:

<?php 
/*
* Класс для генерации постраничной навигации
*/
class Pagination
{
    /**
    * 
    * @var Активных ссылок навигации на страницу.
    * Т.е. ссылок, помимо текущей (активной) ссылки и ссылок влево-вправо.
    * 
    */
    private $max = 6;
    /**
    * 
    * @var Ключ для GET, в который пишется номер страницы
    * 
    */
    private $index = 'page';
    /**
    * 
    * @var Текущий GET-запрос
    * 
    */
    private $query;
    /**
    * 
    * @var Текущая страница
    * 
    */
    private $current_page;
    /**
    * 
    * @var Общее количество записей
    * 
    */
    private $total; 
    /**
    * 
    * @var Записей на страницу
    * 
    */
    private $limit;
    /**
    * Запуск необходимых данных для навигации
    * @param integer $total - общее количество записей
    * @param integer $limit - количество записей на страницу
    * 
    * @return
    */
    public function __construct( $total, $limit )
    {
        # Устанавливаем общее количество записей
        $this->total  = $total;
        # Устанавливаем количество записей на страницу
        $this->limit  = $limit;
        # Устанавливаем количество страниц
        $this->amount = $this->amount();
        # Вызываем метод установки текущей страницы
        $this->setCurrentPage();
        # Вызываем метод установки текущего GET-запроса
        $this->setQueryString();
    }
    /**
    *  Для вывода ссылок
    * 
    * @return HTML-код со ссылками навигации
    */
    public function get()
    {
        # Для записи ссылок
        $pagination = null;
        # Получаем ограничения для цикла
        $limits = $this->limits();
        # Генерируем ссылки
        for($page=$limits[0]; $page<=$limits[1]; $page++)
        {
            # Формируем статус ссылки
            $status = $page == $this->current_page ? 'active' : null;
            # Заносим ссылку
            $pagination .= $this->generateHtml($page, null, null, $status);
        }
        # Если текущая страница не первая
        if($this->current_page > 1){
            # Создаём ссылку "Предыдущая"
            $pagination = $this->generateHtml($this->current_page - 1, '<', 'Предыдущая') . $pagination;
            # Создаём ссылку "Первая"
            $pagination = $this->generateHtml(1, '<<', 'Первая') . $pagination;
        }
        # Если текущая страница не первая
        if($this->current_page < $this->amount){
            # Создаём ссылку "Следующая"
            $pagination .= $this->generateHtml($this->current_page + 1, '>', 'Следующая');  
            # Создаём ссылку "Следующая"
            $pagination .= $this->generateHtml($this->amount, '>>', 'Последняя');  
        }
        # Оборачиваем ссылки
        $pagination = '<ul class="pagination">'. $pagination .'</ul>';
        # Возвращаем ссылки
        return $pagination;
    }
    /**
    * Для получения, откуда начинать выборку
    * 
    * @return integer
    */
    public function skip(){
        return 
            $this->current_page * $this->limit - $this->limit;
    }
    /**
    * Для получение ограничения выборки
    * 
    * @return integer
    */
    public function take(){
        # Получаем, откуда начинаем
        $skip = $this->skip();
        # Возвращаем ограницение
        return
            $skip + $this->limit > $this->total ? $this->total - $skip : $this->limit;
    }
    /**
    * Для генерации HTML-кода ссылки
    * @param string $query - текущий GET-запрос
    * @param integer $page - номер страницы
    * 
    * @return
    */
    private function generateHtml( $page, $text=null, $title=null, $status=null ){
        # Если текст ссылки не указан
        if( is_null($text) )
            # Указываем, что текст - цифра страницы
            $text = $page;
        # Формируем ссылку
        $query = $this->index .'='. $page;
        # Формируем строку запроса (после вопроса)
        $query = $this->query ? $this->query .'&'. $query : $query;
        # Формируем статус ссылки
        $status = $status ? 'class="'. $status .'"' : null;
        # Формируем HTML код ссылки и возвращаем
        return 
            '<li '. $status .'><a href="?'. $query .'" title="'. $title .'">'. $text .'</a></li>';
    }
    /**
    *  Для получения, откуда стартовать вывод ссылок
    * 
    * @return массив с началом и концом отсчёта
    */
    private function limits()
    {
        # Вычисляем ссылки слева (чтобы активная ссылка была посередине)
        $left = $this->current_page - round($this->max / 2, 0, PHP_ROUND_HALF_DOWN);
        # Вычисляем начало отсчёта
        $start = $left > 0 ? $left : 1;               
        # Если впереди есть как минимум $this->max страниц
        if($start + $this->max <= $this->amount)
            # Назначаем конец цикла вперёд на $this->max страниц или просто на минимум
            $end = $start >= 1 ? $start + $this->max : $this->max;
        else{
            # Конец - общее количество страниц
            $end = $this->amount;
            # Начало - минус $this->max от конца
            $start = $this->amount - $this->max > 0 ? $this->amount - $this->max : 1;
        }
        # Возвращаем
        return [$start, $end];
    }
    /**
    * Для установки текущей страницы
    * 
    * @return
    */
    private function setCurrentPage()
    {
        # Получаем номер страницы
        $this->current_page = isset($_GET[$this->index]) ? (int) $_GET[$this->index] : 1;
        # Если текущая страница боле нуля
        if($this->current_page > 0)
        {
            # Если текунщая страница меньше общего количества страниц
            if($this->current_page > $this->amount)
                # Устанавливаем страницу на последнюю
                $this->current_page = $this->amount;
        }
        else
            # Устанавливаем страницу на первую
            $this->current_page = 1;
    }
    /**
    * Для получения и установки текущего GET-запроса
    * 
    * @return
    */
    private function setQueryString(){
        # Получаем параметры текущего запроса
        $query = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_QUERY );
        # Разбираем строку запроса
        parse_str( $query, $params );
        # Удаляем значение страницы, если есть
        unset( $params[$this->index] );
        # Формируем запрос
        $this->query = http_build_query( $params );
    }
    /**
    * Для получеия общего числа страниц
    * 
    * @return число страниц
    */
    private function amount()
    {
        # Делим и возвращаем
        return
            ceil( $this->total / $this->limit );
    }
} 
Answer 1

Для первой части вопроса изменим следующую функцию вот таким образом. И если у нас первая страница то в запросе не получим ?page=1.

private function generateHtml( $page, $text=null, $title=null, $status=null ){
    //А это поможет что бы не было первой страницы если она активна
    if(!is_null($status))
       return '';
    # Если текст ссылки не указан
    if( is_null($text) )
        # Указываем, что текст - цифра страницы
        $text = $page;
    # Формируем ссылку
    $query = '';
    if($page > 1){
        $query = $this->index .'='. $page;
    }

    # Формируем строку запроса (после вопроса)
    $query = $this->query ? $this->query .'&'. $query : $query;
    $query = ($page > 1) ? '?'.$query : $this->query;
    # Формируем статус ссылки
    $status = $status ? 'class="'. $status .'"' : null;
    # Формируем HTML код ссылки и возвращаем
    return 
        '<li '. $status .'><a href="'. $query .'" title="'. $title .'">'. $text .'</a></li>';
}

Изменил вот эту строку:

$query = $this->index .'='. $page;

Таким образом:

$query = '';
if($page > 1){
    $query = $this->index .'='. $page;
}

То есть если страница первая то для запроса pagination нечего не ставим.

А это поможет что бы при активной первой странице ее не было видно

//А это поможет что бы не было первой страницы если она активна
    if(!is_null($status))
       return '';
Answer 2

Спасибо Razmik Galstyan, и Visman, при их помощи удалось устранить недочеты класса, убрать page=1, плюс ко всему избавился от ссылки на активной кнопке. Привожу функцию в которой сделал изменения:

    private function generateHtml($page, $text = null, $title = null, $status = null) {
    # Если текст ссылки не указан
    if(is_null($text))
        # Указываем, что текст - цифра страницы
        $text = $page;
    if(!is_null($status)) {
        $query = false;
    }
    else {
        $query = $page > 1 ? $this->index.'/page/'.$page : '';
        $link = 'href="'.$query.'"';
    }
    # Формируем статус ссылки
    $status = $status ? 'class="'.$status.'"' : null;
    # Формируем HTML код ссылки и возвращаем
    return '<li '.$status.'><a '.$link.'  title="'.$title.'">'.$text.'</a></li>';
}

Код не финальный, привел это чтобы в контексте было понятно.

READ ALSO
Как спарсить ajax через curl

Как спарсить ajax через curl

Всем привет! стоит задача спарсить страницу: https://halykbankkz/presscenter/novosti

302
Удаление файлов через Cron php

Удаление файлов через Cron php

Есть такой скрипт

275
PHP imap_open ошибка Connection refused

PHP imap_open ошибка Connection refused

Пытаюсь подключиться к почтовому серверу для получения писем

265
PHP выводит единицу

PHP выводит единицу

Почему этот файл выводит единицу в созданном файле

241