分页类升级 页码太多 撑破页面如何解决【附方法】

#1 xoYu

当你的内容过多 比如有几十上百个页码 撑破页面是必然的
原分页类很好用 唯一的不足就是这个

下面提供解决方法:
spController.php里的分页类
增加2行代码搞定 并不影响原有功能

$this->pageData = array(
                                "total_count" => $total_count,                                 // 总记录数
                                "page_size"   => $pageSize,                                    // 分页大小
                                "total_page"  => $total_page,                                  // 总页数
                                "first_page"  => 1,                                            // 第一页
                                "prev_page"   => ( ( 1 == $page ) ? 1 : ($page - 1) ),         // 上一页
                                "next_page"   => ( ( $page == $total_page ) ? $total_page : ($page + 1)),     // 下一页
                                "last_page"   => $total_page,                                  // 最后一页
                                "current_page"=> $page,                                        // 当前页
                                "mid_pages"   => array(),                                           // 中间显示数字页码 防止页码过多撑破页面
                                "all_pages"   => array()                                           // 全部页码
                        );
                        //for($i=1; $i <= $total_page; $i++)$this->pageData['all_pages'][] = $i;
                        $this->pageData['mid_pages'] = array_slice($this->pageData['all_pages'],($page - 2) < 1 ? 0 : ($page - 3),5);


红色部分为添加的。绿色部分为原有代码可注释可保留。

模板中
原来 :<{foreach from=$pager.all_pages item=thepage}>
现在 :<{foreach from=$pager.mid_pages item=thepage}>

2013-02-26 11:04:45

#2 coolhpy

我也是这个思路,,不过,我没直接修改 spController,而是继承spModel之后再写了个 getPager 方法。。这样做可以方便以后框架升级~ :lol

BTW,绿色那行不能注释吧,不然你 array_slice 就去不到值了啊~

我的代码:

        /**
         * 获取分页数据
         * @param        integer        $length        如果页面较多时,最多显示的数字链接个数。最少:3,默认:5
         * @return        [array, '']
         */
        public function getPager($length=5) {
                $pager = $this->spPager()->getPager();
                if ($pager) {
                        if ($length < 3) $length = 3;
                        if ($pager['total_page'] > $length) {
                                $start = $pager['current_page'] - ($length / 2);
                                if ($start < 0) $start = 0;
                                $pager['show_pages'] = array_slice($pager['all_pages'], $start, $length);
                        } else {
                                $pager['show_pages'] = $pager['all_pages'];
                        }
                }
                return $pager;
        }

2013-02-26 11:42:16

#3 jake

论坛搜索一下,之前就有关于这个的一些很好的解决方案。可以实现像dz论坛那种页码

2013-02-26 13:43:18

#4 xoYu

coolhpy 发表于 2013-2-26 11:42
我也是这个思路,,不过,我没直接修改 spController,而是继承spModel之后再写了个 getPager 方法。。这样 ...
大意了 确实不能注释 注释之后 后面的数组内页没值了{:soso_e113:}

2013-02-26 18:01:13

#5 xoYu

jake 发表于 2013-2-26 13:43
论坛搜索一下,之前就有关于这个的一些很好的解决方案。可以实现像dz论坛那种页码 ...
我再找找 之前没找到。

2013-02-26 18:02:21

#6 lhabc

好提议!

2013-03-26 09:04:21

#7 土蚕

直接修改模板中的代码即可
<{foreach from=$$pager.all_pages item=thepage}>
    <{if $$thepage <= $$pager.current_page+2 &&  $$thepage >= $$pager.current_page-2}>
        <{if $$thepage != $$pager.current_page}>
                <{$$thepage}>
        <{else}>
                <{$$thepage}>
        <{/if}>
        <{/if}>
<{/foreach}>

2013-08-14 00:56:25

#8 xoYu

土蚕 发表于 2013-8-14 00:56
直接修改模板中的代码即可
这个解决方案好 不用可变变量也是一样的效果

2013-11-08 16:02:23

#9 jake

xoYu 发表于 2013-2-26 18:02
我再找找 之前没找到。
刚刚帮你搜索到了,http://www.speedphp.com/forum.php?mod=viewthread&tid=743

2013-11-08 16:11:31

#10 xoYu

jake 发表于 2013-11-8 16:11
刚刚帮你搜索到了,http://www.speedphp.com/forum.php?mod=viewthread&tid=743
两个方法都是在模板里限制,基本一样。

jake能做个开放平台登录的示例么?

2013-11-08 16:15:32

#11 jake

开放平台登录,是什么?

2013-11-08 16:39:29

#12 xoYu

jake 发表于 2013-11-8 16:39
开放平台登录,是什么?
就是qq 微博登录。我单独写没问题 封装就不行。

2013-11-10 21:10:58

#13 jake

xoYu 发表于 2013-11-10 21:10
就是qq 微博登录。我单独写没问题 封装就不行。
嗯,QQ,微博登录,之前SAE上面的SP应用不少是这样的,初用可以用伪静态作为回调会简单些。

2013-11-10 21:26:20