0

現在、機能が不足していますが、機能するページネーションスクリプトがあります。現時点では、[1] [...] 5, 6, 7 [..] [45] などの間に表示するフィルターがないため、$pages リストに数百ページが表示される可能性があります。 . これが私のコードです:

    /** Pagination **/
    $limit = 7;
    $query = "SELECT COUNT(*) FROM users";
    $result = $db->prepare($query);
    $result->execute();
    $pages_query = $result->fetchColumn(0);
        $count = number_format($pages_query);
        $pages = ceil($pages_query / $limit);
    $page = (isset($_GET['page'])) ? (int)$_GET['page'] : 1;
    $start = ($page - 1) * $limit;
    ob_start();
        echo("<span class='alignright'>");
        if ($pages >= 1 && $page <= $pages){
            if($page > 1){
                $next = ($page - 1);
                $link = "?page=$next";
                echo("<a class='paginate' href='$link'><i class='icon-caret-left'></i></a>");
            }
        for ($x=1; $x<=$pages; $x++){
            echo ($x == $page) ? "<strong style='font-weight: bold!important;'><a class='paginate' href='?page=$x'>$x</a></strong>" : "<a class='paginate' href='?page=$x'>$x</a>";
        }
        if($page < $pages){
            $next = ($page + 1);
            $link = "?page=$next";
            echo("<a class='paginate' href='$link'><i class='icon-caret-right'></i></a>");
        }
        echo("</span>");
        if($count > 0){
            echo("<span class='smalltext'>Page <strong class='half'>$page</strong> of $pages:</span>");
        } else {
            echo("<span class='smalltext'>There are <span class='half'>$count</span> results to display.</span>");
        }
    $pagintion = ob_get_clean();

(そこにあった他のジャンクから削除されましたが、それが一般的なフレームです。)基本的に、質問の上部で指定されているように、「ページ間」を下部に制限する方法を見つけようとしています。[<] [1] ... [4] [5] [6] ... [45] [>] それが理にかなっている場合。

4

3 に答える 3

0

クエリ自体で LIMIT を試すことができます

SELECT * FROM TABLE_NAME 制限 STARTING_RESULT_NUMBER、RESULTS_PER_PAGE

RESULTS_PER_PAGE は、表示するページあたりのアイテム数です STARTING_RESULT_NUMBER =(CURRENT_PAGE_NUMBER*RESULTS_PER_PAGE)

于 2013-07-11T13:04:14.523 に答える
0

[<] [1] ... [4] [5] [6] ... [45] [>]すべてのページ番号を表示するのではなく、ページのリストを次のように変更するには、forループを次のよう に置き換えることができます。

echo "<a class='paginate' href='?page=1'>1</a>";
if($page > 3) {echo "...";}
if($page > 2) {echo "<a class='paginate' href='?page=" . $x-1 . "'>" . $x-1 "</a>";}
if($page != 1 && $page != pages) {echo "<a class='paginate' href='?page=" . $x . "'>" . $x "</a>";}
if($page < $pages-1) {echo "<a class='paginate' href='?page=" . $x+1 . "'>" . $x+1 "</a>";}
if($page < $pages-2) {echo "...";}
if($pages >1) {echo "<a class='paginate' href='?page=1'>1</a>";}

最初のページ、最後のページ、現在のページ、直前と直後のページが表示されます。

于 2013-07-11T13:17:32.013 に答える
0

ページネーションに関する私の個人的な意味は、読みやすく、後で簡単に変更できるものでなければならないということです。あなたの例に基づいて、次のコードを入力しました。

$totalPages = 145; //the total amount of pages
$selectedPage = 40; //the selected page

$pages = array(); //the array which is gonna hold the pages we need to display
$offset = 3; //the number of pages to select around the selected page

$closePages = range($selectedPage - $offset, $selectedPage + $offset); //select the pages that are in $offset of the selected page

array_filter($closePages, function($x) { //filter the pages below 1 and above $totalPages
    return ($x <= $totalPages && $x >= 1 ? true : false ); 
});

array_push($pages, 1); //add the first page
array_push($pages, '...'); //add some dots

$pages = array_merge($pages, $closePages);

array_push($pages, '...'); //and again add some dots
array_push($pages, $totalPages); //add the last page

次に、foreach ループを使用してページを表示します。

foreach($pages as $page) {
    if (is_numeric($page)) {

        if ($page != $selectedPage) $content .= ' <a href="?page=' . $page . '">' . $page . '</a> ';
        else $content .= ' <a href="?page=' . $page . '"><strong>' . $page . '</strong></a> ';

    } else 
        $content .= '[...]';
}

この回答にコメントした後の説明:

$totalPages 変数はページ上のページの合計量である必要があり (あなたの例から)、$selectedPage は現時点で選択されているページです。

$totalPages = ceil($pages_query / $limit);
$selectedPage = isset($_GET['page']) ? $_GET['page'] : 1;
于 2013-07-11T13:19:13.153 に答える