Есть ли фрагмент общедоступного кода для создания индекса страницы с использованием PHP? - PullRequest
1 голос
/ 05 февраля 2009

У меня есть таблица MySQL, содержащая множество записей, к которым я хочу предоставить пользователю доступ. Я не хочу выводить всю таблицу на страницу, поэтому мне нужно разбить ее на 25 записей за раз, поэтому мне нужен индекс страницы. Вы, наверное, видели их на других страницах, они выглядят примерно так у основания страницы:

<1 2 3 4 <strong>5 6 7 8 9>

Например, когда пользователь щелкает ссылку «4», страница обновляется и смещение перемещается (4-я страница х 25 записей). Вот что у меня уже есть:

function CreatePageIndex($ItemsPerPage, $TotalNumberOfItems, $CurrentOffset, $URL, $URLArguments = array())
{
    foreach($URLArguments as $Key => $Value)
    {
        if($FirstIndexDone == false)
        {
            $URL .= sprintf("?%s=%s", $Key, $Value);
            $FirstIndexDone = true;
        }
        else
        {
            $URL .= sprintf("&%s=%s", $Key, $Value);
        }
    }

    Print("<div id=\"ResultsNavigation\">");
        Print("Page: ");
        Print("<span class=\"Links\">");
            $NumberOfPages = ceil($TotalNumberOfItems / $ItemsPerPage);
            for($x = 0; $x < $NumberOfPages; $x++)
            {
                if($x == $CurrentOffset / $ItemsPerPage)
                {
                    Print("<span class=\"Selected\">".($x + 1)." </span>");
                }
                else
                {
                    if(empty($URLArguments))
                    {
                        Print("<a href=\"".$URL."?Offset=".$x * $ItemsPerPage."\">".($x + 1)."</a> ");
                    }
                    else
                    {
                        Print("<a href=\"".$URL."&Offset=".$x * $ItemsPerPage."\">".($x + 1)."</a> ");
                    }
                }
            }
            Print("</span>");
            Print(" (".$TotalNumberOfItems." results)");
    Print("</div>");
}

Очевидно, что этот фрагмент кода не создает динамический индекс, он просто выводит весь индекс внизу страницы для каждой доступной страницы. Что мне нужно, так это динамическое решение, которое показывает только предыдущие 5 страниц и следующие 5 страниц (если они существуют) вместе с >> или чем-то еще, чтобы продвинуться на 5 или около того страниц.

Кто-нибудь видел элегантный и многократно используемый способ реализации этого, так как я чувствую, что заново изобретаю колесо? Любая помощь приветствуется.

Ответы [ 4 ]

2 голосов
/ 05 февраля 2009

Zend Framework становится полезной коллекцией и включает в себя класс Zend_Paginator , который, возможно, стоит посмотреть. Небольшая кривая обучения и может быть того стоит, если вы хотите потратить время на использование других классов из фреймворка.

Хотя не так уж и сложно накатить свой собственный. Получить общее количество записей с помощью запроса COUNT (*), а затем получить страницу результатов с предложением LIMIT.

Например, если вам нужно 20 элементов на странице, страница 1 будет иметь LIMIT 0,20, а страница 2 будет LIMIT 20,20, например

$count=getTotalItemCount();
$pagesize=20;

$totalpages=ceil($count/$pagesize);

$currentpage=isset($_GET['pg'])?intval($_GET['pg']):1;
$currentpage=min(max($currentpage, 1),$totalpages);

$offset=($currentpage-1)*$pagesize;

$limit="LIMIT $offset,$pagesize";
1 голос
/ 05 февраля 2009

Это называется пагинацией:

несколько примеров:

  1. Хороший без SQL
  2. Длинный учебник
  3. Другой учебник
  4. И еще
  5. И конечно .. Google
0 голосов
/ 05 февраля 2009

Вот старый класс, который я выкопал, который я использовал в PHP. Теперь я справляюсь с большей частью в Javascript. Объект берет массив (который вы используете для разбиения стека на страницы) и возвращает текущее представление. Это может стать утомительным на гигантских столах, так что имейте это в виду. Я обычно использую его для постраничного просмотра небольших наборов данных менее 1000 наименований. Также вы можете сгенерировать ваше меню переходов для вас.

class pagination {

function pageTotal($resultCount, $splitCount) {
    if (is_numeric($resultCount) && is_numeric($splitCount)) {
        if ($resultCount > $splitCount) {
            $pageAverage = (integer)$resultCount / $splitCount;
            $pageTotal = ceil($pageAverage);
            return $pageTotal;
        } else {
            return 1;
        }
    } else {
        return false;
    }
}

function pageTotalFromStack($resultArray, $splitCount) {
    if (is_numeric($splitCount) && is_array($resultStack)) {
        if (count($resultStack) > $splitCount) {
            $resultCount = count($resultStack);
            $pageAverage = (integer)$resultCount / $splitCount;
            $pageTotal = ceil($pageAverage);
            return $pageTotal;
        } else {
            return 1;
        }
    } else {
        return false;
    }
}

function makePaginationURL($preURL, $pageTotal, $selected=0, $linkAttr=0, $selectedAttr=0) {
    if (!empty($preURL) && $pageTotal >= 1) {
        $pageSeed = 1;
        $passFlag = 0;
        $regLink = '<a href="{url}&p={page}"';
            if (is_array($linkAttr)) $regLink .=  $this->setAttributes($linkAttr); //set attributes
        $regLink .= '>{page}</a>';

        $selLink = '<a href="{url}&p={page}"';
            if (is_array($selectedAttr)) $selLink .=  $this->setAttributes($selectedAttr); //set attributes
        $selLink .= '>{page}</a>';

        while($pageSeed <= $pageTotal) {
            if ($pageSeed == $selected) {
                $newPageLink = str_replace('{url}', $preURL, $selLink);
                $newPageLink = str_replace('{page}', $pageSeed, $newPageLink);
            } else {
                $newPageLink = str_replace('{url}', $preURL, $regLink);
                $newPageLink = str_replace('{page}', $pageSeed, $newPageLink);
            }
            if ($passFlag == 0) {
                $passFlag = 1;
                $linkStack = $newPageLink;
            } else {
                $linkStack .= ', ' . $newPageLink;
            }
            $pageSeed++;
        }
        return $linkStack;
    } else {
        return false;
    }
}

function splitPageArrayStack($stackArray, $chunkSize) {
    if (is_array($stackArray) && is_numeric($chunkSize)) {
        return $multiArray = array_chunk($stackArray, $chunkSize);
    } else {
        return false;
    }
}

}

0 голосов
/ 05 февраля 2009

Как насчет этого jQuery-плагина? Так что вся работа выполняется на стороне клиента.

http://plugins.jquery.com/project/pagination

demo: http://d -scribe.de / webtools / jquery-pagination / demo / demo_options.htm

...