PHP. Разбиение на страницы
PHP

Если вы занимаетесь разработкой интернет магазинов, каталогов, досок объявлений — то наверняка сталкивались с проблемой постраничного вывода информации. Проще говоря с пагинацией. Представленная ниже функция помогает решить эту задачу. В данной реализации используется враппер MySQLi под названием goDB. Но вы без труда сможете переделать под собственные нужды, главное понимать принцип работы.

Он очень простой: передаем в функцию необходимые параметры, такие как сам SQL запрос, данные для запроса (если используются плейсхолдеры), количество записей на страницу и номер страницы.

Сначала запрашиваются все записи по переданному запросу, чтобы определить количество строк. Затем вычисляется количество страниц. Далее идут условия и проверки. Их не буду описывать, сами смотрите код.

Функция возвращает массив:

Array
(
    ['sql']=>'SELECT...', //Модифицированный
    ['pageline']=>array()  //Линейка с номерами страниц
)

Функция дописывает к исходному запросу LIMIT и возвращает его. Так же возвращается массив с номерами страниц для вывода на экран. Он имеет следующий вид:

Array
(
    [0] => 1
    [1] => 0
    [2] => 3
    [3] => 4
    [4] => 5
    [5] => -6
    [6] => 7
    [7] => 8
    [8] => 9
    [9] => 0
    [10] => 17
)

Текущая страница идет с отрицательным значением. В данном случае -6.
В качестве разделителя используется 0. Его можно преобразовать в любой символ при выводе. Например в «…»

Вот сам код функции:

function _paginator($sql, $sqldata, $pagetodisplay, $rowonpage)
    {
        global $db; //идентификатор соединения с MySQL
        $countofrows = $db->query($sql, $sqldata, 'num');
        $totalpages = ceil($countofrows/$rowonpage); //Общее коичество страниц в результате запроса
        
        if($countofrows <= $rowonpage) //Если не более одной страницы
            $pageline = NULL;
        elseif($totalpages < $pagetodisplay) //Если запрошенная страница больше, чем можно отобразить.
            $pageline = FALSE;
        else 
        {
            $start = ($pagetodisplay-1)*$rowonpage;
            $sql .= " LIMIT $start, $rowonpage";
            
            if($totalpages <= 9) //Если страниц меньше или 9.
            {
                for($i=1; $i<=$totalpages; $i++)
                {
                    if($pagetodisplay == $i)
                        $pageline[]=$i*(-1);
                    else
                        $pageline[]=$i;
                }
            }
            elseif($pagetodisplay > 5 && $pagetodisplay <= $totalpages-5) //промежуток между первой и последней
            {
                $pageline=array(1,0);
                for($i=$pagetodisplay-3;  $i<=$pagetodisplay+3; $i++)
                {
                    if($pagetodisplay == $i)
                        $pageline[]=$i*(-1);
                    else
                        $pageline[]=$i;
                }
                $pageline[]=0;
                $pageline[]=$totalpages;
            }
            elseif($pagetodisplay <= 5 && $totalpages > 9) //промежуток от начала
            {
                for($i=1; $i<=7; $i++)
                {
                    if($pagetodisplay == $i)
                        $pageline[]=$i*(-1);
                    else
                        $pageline[]=$i;
                }
                $pageline[]=0;
                $pageline[]=$totalpages;
            }
            elseif($pagetodisplay > 5 && $pagetodisplay > $totalpages-5)
            {
                $pageline=array(1,0);
                for($i=$totalpages-6; $i<=$totalpages; $i++)
                {
                    if($pagetodisplay == $i)
                        $pageline[]=$i*(-1);
                    else
                        $pageline[]=$i;
                }
            }
            
        }
        return(array('sql' => $sql, 'pageline' => $pageline));
    }

Добавить комментарий