【问题标题】:How to limit pages shown in pagination script如何限制分页脚本中显示的页面
【发布时间】:2011-12-23 00:15:23
【问题描述】:

我有一个分页脚本,我在下面发布了,问题是我有很多数据,所以我以一个巨大的页面列表结束,我想让它一次只显示 10 页,然后可能是最后 2像这样的页面:

上一个 1 2 3 4 5 6 7 8 9...24 25 下一个

无论如何我可以更改代码来执行此操作。下面是包含的分页脚本,如果需要,我可以包含脚本的其他部分。

<?php
//source unknown for logic of showPageNumbers()
//modified by drale.com - 1-19-2010
//added query_string reproduction and divs
//added showNext() and showPrev()

class Pagination 
{
    function getStartRow($page,$limit)
    {
        $startrow = $page * $limit - ($limit);
        return $startrow;
    }

    function showPageNumbers($totalrows,$page,$limit)
    {
        $query_string = $this->queryString();
        $pagination_links = null;

        /*
         * PAGINATION SCRIPT
         * seperates the list into pages
         */     
        $numofpages = $totalrows / $limit; 
        /* We divide our total amount of rows (for example 102) by the limit (25). This 
           will yield 4.08, which we can round down to 4. In the next few lines, we'll
           create 4 pages, and then check to see if we have extra rows remaining for 
           a 5th page. */

        for ($i = 1; $i <= $numofpages; $i++) {
            /* This for loop will add 1 to $i at the end of each pass until $i 
               is greater than $numofpages (4.08). */       
            if ($i == $page) {
                $pagination_links .= '<div class="page-link"><span>' . $i 
                                   . '</span></div> ';
            } else { 
                $pagination_links .= '<div class="page-link"><a href="?page=' . $i 
                    . '&' . $query_string . '">' . $i . '</a></div> '; 
            }

            /* This if statement will not make the current page number available 
               in link form. It will, however, make all other pages available 
               in link form. */
        }   // This ends the for loop

        if (($totalrows % $limit) != 0) {
        /* The above statement is the key to knowing if there are remainders, and it's 
        all because of the %. In PHP, C++, and other languages, the % is known as a 
        Modulus. It returns the remainder after dividing two numbers. If there is no 
        remainder, it returns zero. In our example, it will return 0.8 */

            if ($i == $page) {
                $pagination_links .= '<div class="page-link"><span>' . $i 
                                   . '</span></div> ';
            } else {
                $pagination_links .= '<div class="page-link"><a href="?page=' . $i 
                    . '&'.$query_string.'">'.$i.'</a></div> ';
            }
            /* This is the exact statement that turns pages into link 
               form that is used above */ 
        } // Ends the if statement 

        return $pagination_links;
    }

    //added by drale.com - 1-19-2010
    function showNext($totalrows,$page,$limit,$text="next &raquo;")
    {
        $next_link = null;
        $numofpages = $totalrows / $limit;

        if ($page < $numofpages) {
            $page++;
            $next_link = '<div class="page-link"><a href="?page=' . $page 
                       . '&'.$query_string.'">' . $text . '</a></div>';
        }

        return $next_link;
    }

    function showPrev($totalrows,$page,$limit,$text="&laquo; prev")
    {
        $next_link = null;
        $numofpages = $totalrows / $limit;

        if ($page > 1) {
            $page--;
            $prev_link = '<div class="page-link"><a href="?page=' . $page 
                . '&' . $query_string . '">'.$text.'</a></div>';
        }

        return $prev_link;
    }

    function queryString()
    {
        //matches up to 10 digits in page number
        $query_string = eregi_replace("page=[0-9]{0,10}&","",$_SERVER['QUERY_STRING']);
        return $query_string;
    }
} 
?>

【问题讨论】:

  • 恐怕还不止这些。例如,当您在 25 页的第 15 页时,您希望它如何表现,您应该在开头和结尾都剪掉几页,或者您希望它如何工作?
  • 对不起,我忘记了,如果您在第 15 页,请在开头剪掉一些内容,所以它会这样:上一个 7 8 9 10 11 12 13 14 15..24 25 下一个。谢谢

标签: php pagination


【解决方案1】:

未经测试,但这应该始终显示第 1 - 3 页和列表的最后 3 页。否则,它只会显示您当前所在页面的前 3 页和后 3 页。 (只要页数大于10)

$alwaysShowPages = array(1, 2, 3);

// dynamically add last 3 pages
for ($i = 3; $i >= 0; $i--) {
    $alwaysShowPages[] = $numofpages - $i;
}

for ($i = 1; $i <= $numofpages; $i++) {
    $showPageLink = true;

    if ($numofpages > 10 && !in_array($i, $alwaysShowPages)) {
        if (($i < $page && ($page - $i) > 3)
            || ($i > $page && ($i - $page) > 3)
        ) {
            $showPageLink = false;
        }
    }

    if ($showPageLink) {
        if ($i == $page) {
            $pagination_links .= '<div class="page-link"><span>'.$i.'</span></div> ';
        } else { 
            $pagination_links .= '<div class="page-link"><a href="?page='.$i.'&'.$query_string.'">'.$i.'</a></div> '; 
        }
    }
}

【讨论】:

  • 这个解决方案并不能完全满足他在澄清评论中的要求,但是我相信从用户的角度来看这个解决方案更有用。
  • 谢谢大家,这不是我想要的,但我认为这样会更好。有没有办法阻止它总是显示前 3 页而只显示前后 3 页。谢谢
  • 假设 $alwaysShowPages 之一是当前页面,只需使用如下内容: for($i = $currentPage -3; $i
  • 是的,他是对的,我的方法远非完美,但它至少可以达到快速和肮脏的风格。
【解决方案2】:

我有一个这样做的版本:

1 | 2 | 3 | 4 | 5 | 6 ... 554 | 555 | 556

1 | 2 | 3 | 4 | 5 | 6 ... 554 | 555 | 556

1 | 2 | 3 ... 278 | 279 | 280 ... 554 | 555 | 556

1 | 2 | 3 ... 415 | 416 | 417 ... 554 | 555 | 556

1 | 2 | 3 |第553章554 | 555 | 556

...实际上是在当前页面和下一个(或最后一个)链接组的第一个之间的链接。

我做到了,如果当前页面小于 5,则始终显示前 6 页。

但我将所有参数设为动态,因此您可以更改变量,例如: $end_links = 3; // 设置每端的链接数始终显示 $center_links; // 包括当前页面在内的链接数在中心显示“浮动”

我花了好几个小时才完成,这很可悲。哦,好吧。

只是经常使用数组,并弄清楚如何向其中添加正确的值。这是简单的数学和逻辑,真的。

【讨论】:

  • 对于那么多页面,“对数”页面导航方案会更合适。 See here.
  • 您的答案似乎有太多的链接。我的方法肯定需要一些调整。但我试图达到的结果是模仿一次猜测 1 到 n 之间数字的最有效过程。第一个你猜 n/2。然后你猜 n/2 + n/4 或 n/2 - n/4。然后是 n/2 +/- n/4 +/- n/8。等“蝴蝶”方法。
  • 巴特尔,看看你的第一行:你是如何到达第 200 页的?对于“蝴蝶”方法,您至少需要 5 个链接:假设 n 个页面,当前页面 = p,所需链接为 1, p/2, p , (p+n)/2, n。但这不是用户对分页链接的期望,并且可能会让大多数人感到困惑,他们希望看到一个 range 的链接可供选择。我的方法既提供了范围,又提供了“蝴蝶”选择(如您所说)的能力。
  • Buttle,您当然可以调整我的方法以显示更少的链接。一种方法可能是从 10 的幂变为 2 的幂(例如)。但最简单的方法可能是仅在当前页面周围“加密”链接,而不是在端点周围。我可能会考虑将该选项添加到我的代码中!另请注意,当然,当总页数较少时,我的方法确实会显示较少的链接!
猜你喜欢
  • 2020-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-16
  • 1970-01-01
  • 2018-04-19
  • 2014-10-14
  • 2018-10-13
相关资源
最近更新 更多