1

ユーザーにアクセスを許可したい多くのレコードを保持する MySQL テーブルがあります。テーブル全体をページにダンプしたくないので、一度に 25 レコードに分割する必要があるため、ページ インデックスが必要です。他のページで見たことがあるかもしれませんが、ページの下部では次のようになっています。

< 1 2 3 4 5 6 7 8 9 >

たとえば、ユーザーが「4」リンクをクリックすると、ページが更新され、オフセットが移動します (4 ページ x 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 ページ (存在する場合) のみを表示する動的ソリューションです。

私は車輪を再発明していると感じているので、これを実装するエレガントで再利用可能な方法を見た人はいますか? どんな助けでも大歓迎です。

4

4 に答える 4

2

Zend Frameworkは有用なコレクションになりつつあり、一見の価値があるZend_Paginatorクラスが含まれています。フレームワークから他のクラスを使用することに時間を投資したい場合にのみ、学習曲線が少しあり、それだけの価値があるかもしれません.

ただし、自分でロールするのはそれほど難しくありません。COUNT(*) クエリを使用してレコードの総数を取得し、LIMIT 句を使用して結果のページを取得します。

たとえば、1 ページあたり 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";
于 2009-02-05T12:16:35.440 に答える
0

これは、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;
    }
}

}

于 2009-02-05T13:47:05.413 に答える