【加例子】模板中使用分页的函数 + 24个分页样式

#1 jake

这是spPager产生的分页数据在模板中显示的函数,使用方式已经简化,而且配合24个分页样式可以轻易做出漂亮的分页功能。

----------------


更新:已经加入了整套示范的例子代码。24分页效果例子代码.zip


使用例子代码的时候:1. 导入压缩包中的guestbook.sql到数据库中。2. 配置index.php中speedphp框架的路径(压缩包内没有带框架)。3. 访问显示OK。


---------------

可以先打开压缩包看看“预览看看.html”文件,挺好的分页样式。

看看图:
pagers.jpg


用法:

1. 在index.php内
require(SP_PATH.'/SpeedPHP.php');
require(压缩包内的functions.php文件);
spRun();


2. 控制器内


// 某表的记录数务必在3条以上,否则没有分页效果
$this->results = spClass('某表')->spPager($this->spArgs('p',1),2)->findAll();
$this->pager = spClass('某表')->spPager()->getPager();


dump($this->results);


3. 模板内内引入CSS




4. 模板内显示分页,这里是yahoo2是其中一个样式名称,其他的样式名称直接看css文件

<{pager pager=$pager myclass="yahoo2" c="网址控制器" a="网址动作" arg1="第一个参数" ...}>

下载:

带模板函数实现的24个分页样式.rar

2010-06-17 18:03:04

#2 extinct

:L今天下午刚搞了个,没想到老大这里好东西真多

2010-06-17 18:08:47

#3 fenshenxia

一直关注 SpeedPHP 发展

2010-06-17 18:21:05

#4 emike

一直关注 SpeedPHP 发展

2010-06-18 09:36:22

#5 php

昨天刚把THINKPHP的分页搞过来,没想到Jake就发了专属分页函数···

2010-06-18 10:07:20

#6 zxczzz456

这个分页怎么用啊,我搞了好久都没搞好,哪位高人指教指教啊

2010-06-19 11:19:34

#7 jake

这个分页怎么用啊,我搞了好久都没搞好,哪位高人指教指教啊
zxczzz456 发表于 2010-6-19 11:19
你是怎么用的?有没有照上面说的步骤来做呢?页面如何显示呢?

2010-06-19 12:21:04

#8 zxczzz456

回复 7 jake


    我原本分页是用<{$thepage}>来显示的,可他把所有都显示了,不知道用<{pager pager=$pager myclass这个怎么写啊,麻烦下加QQ379539060

2010-06-19 12:50:10

#9 zxczzz456

我这样子写了显示不出来   

                      <{pager pager=$pager myclass="grayr" c=admin_hotel a=index types=$types}>
                    

2010-06-19 13:09:33

#10 xc1133250

没用啊....这个分页出不来

2010-06-19 14:37:52

#11 jake

没用啊....这个分页出不来
xc1133250 发表于 2010-6-19 14:37
上面的“用法”已经更新了,试试吧。

2010-06-19 21:56:32

#12 jake

稍微修改一下就可以显示当前的周围页面,而不是全部页码

http://speedphp.com/bbs/redirect.php?goto=findpost&ptid=705&pid=3410

2010-07-06 10:06:44

#13 hkbaby

这个分页怎么用的啊  functions.php文件是放在框架和配置文件同级目录吗?

2010-07-06 15:12:37

#14 kingtalc

我页码显示不出来 页数是哪的问题?

2010-07-06 15:56:12

#15 kingtalc

{ pager pager=$pager myclass="yahoo2" c="product" a="listAll" }

这部分未输出任何东西...

2010-07-06 16:05:38

#16 jake

http://speedphp.com/bbs/thread-726-1-1.html

2010-07-06 16:59:55

#17 hkbaby

function __template_pager($params)   这个$params值要从哪里来?

2010-07-07 09:11:56

#18 jake

function __template_pager($params)   这个$params值要从哪里来?
hkbaby 发表于 2010-7-7 09:11
<{pager c=main a=index pager=$pager}>红色部分都是$params的值

2010-07-07 09:58:46

#19 hkbaby

哦  谢谢jake{:3_52:}     这个我明白了  还有myclass="yahoo2"这个也是$params的值

2010-07-07 10:28:19

#20 project

import(APP_PATH.'/functions.php');
spRun();这个是什么意思啊   怎么这地方报错呢?

这  Fatal error: Call to undefined function spRun() in

2010-07-07 14:45:02

#21 azwl

回复 1 jake

对分页函数修改了一下,原因有:

1,原分页函数如果显示第一页或最后一页时,只显示右偏移或左偏移,不是很美观。
2。把循环中的判断语句移到循环外面,提高执行效率。
3。调整$offset的默认值为4(原来为200)


    spAddViewFunction('pager', '__template_pager');
function __template_pager($params){
     if(!isset($params['pager']) || empty($params['pager']))return '';
     $args = array();
     foreach($params as $k => $v)if(!in_array($k, array('c', 'a', 'pager', 'myclass', 'mypage', 'offset')))$args[$k] = $v;
     $pagerhandle = isset($params['pager']['mypage']) ? $params['pager']['mypage'] : 'p';
     $html = "
";
     $curpage = $params['pager']['current_page'];
     $totalpage = $params['pager']['total_page'];
     // 第一页
    if($curpage != $params['pager']['first_page']){
         $url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $params['pager']['first_page']));
         $html .= "首页";
         }
     // 前页
    if($curpage != $params['pager']['prev_page']){
         $url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $params['pager']['prev_page']));
         $html .= "前页";
         }
     // 中间数字页
    $offset = $params['offset'] ? $params['offset'] : 4;
     // 当前页的左右偏移值,默认为左右各4个页面。可以在<{pager}>内用offset=x来调整
    $startpage = 1;
     $endpage = $offset * 2 + 1;
     if ($curpage > $offset){
         $startpage = $curpage - $offset;
         $endpage = $curpage + $offset;
         }
     if ($endpage > $totalpage){
         $startpage = $totalpage - $offset * 2;
         $endpage = $totalpage;
         }
     if ($startpage < 1) $startpage = 1;
     for($p = $startpage;$p <= $endpage;$p++){
         if($p == $curpage){
             $html .= "{$p}";
             }else{
             $url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $p));
             $html .= "{$p}";
             }
         }
     // 下一页
    if($curpage != $params['pager']['next_page']){
         $url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $params['pager']['next_page']));
         $html .= "下页";
         }
     // 最后一页
    if($curpage != $params['pager']['last_page']){
         $url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $params['pager']['last_page']));
         $html .= "末页";
         }
     $html .= '
';
     return $html;
     }
?>

2010-07-08 10:42:43

#22 jake

1,原分页函数如果显示第一页或最后一页时,只显示右偏移或左偏移,不是很美观。

一般都是这样显示的,看看dz论坛的页码就知道了

2。把循环中的判断语句移到循环外面,提高执行效率。

没能看出来

3。调整$offset的默认值为4(原来为200)

原来的200是默认的情况不做偏移效果,毕竟偏移效果也不一定每个地方都要用到。

2010-07-08 11:33:07

#23 azwl

1,原分页函数如果显示第一页或最后一页时,只显示右偏移或左偏移,不是很美观。

一般都是这样显示的,看 ...
jake 发表于 2010-7-8 11:33
1,原分页函数如果显示第一页或最后一页时,只显示右偏移或左偏移,不是很美观。

一般都是这样显示的,看看dz论坛的页码就知道了
------》当然这个都是个人喜好。我只是我要是觉得两头只显示$offset页,而当前页在中间是显示$offset*2页,不太一致而已。

2。把循环中的判断语句移到循环外面,提高执行效率。

没能看出来
------》如果共有1000页,就要循环1000次而且在循环中要判断1000次,移到外面后循环次数最多执行$offset*2+1次且循环中不用判断。


3。调整$offset的默认值为4(原来为200)

原来的200是默认的情况不做偏移效果,毕竟偏移效果也不一定每个地方都要用到。
------》这个么。既然是做分页,一般就要用到偏移,总不会把所有页都显示在页面上吧。是否是我的理解有偏移:-)

2010-07-08 14:05:41

#24 jake

性能这块你说对了!的确先判断再循环是能够减少循环次数,虽然这种循环耗费不了资源,不过精准来说,还是能减少则需要减少。

这里建议azwl把你的代码替换了我发的那个例子,然后再发上来给大家共享共享吧(然后我改主贴),:handshake

2010-07-08 15:35:23

#25 hkbaby

为了美观我也该了下functions.php
spAddViewFunction('pager', '__template_pager');        //spAddViewFunction()将__template_pager注册到模板内使用,模板内通过pager可以调用该函数/方法
function __template_pager($params)
{
        if( !isset($params['pager']) || empty($params['pager']) )return '';
        $args = array();
        foreach( $params as $k => $v )if( !in_array($k, array('c','a','pager','myclass','mypage','offset')) )$args[$k] = $v;
        $pagerhandle = isset($params['pager']['mypage']) ? $params['pager']['mypage'] : 'page';

        $html = "
";
        if( $params['pager']['current_page'] != $params['pager']['first_page'] )
        {
                $url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $params['pager']['first_page']));
                $html .= "首页";
                $url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $params['pager']['prev_page']));
                $html .= "上一页";
        }else{
                $html .= "首页";
                $html .= "上一页";
        }

        $pagesize = $params[pager][page_size]; //页容量
        $page = $params[pager][current_page]; // 当前页
        $total = $params[pager][total_count]; //总条数
        $totalpage = $params[pager][total_page]; //总分页
        $init = $params['pager']['first_page'];//起始页码数
        $max = $totalpage;//结束页码数
        $pagelen = $params[pager][page_size];        //显示页码长度
        $pageoffset = ceil(($pagelen-1)/2);//页码个数左右偏移量
       
        //分页数大于页码个数时可以偏移
        if($totalpage > $pagelen)
        {
                //如果当前页小于等于左偏移
                if($params[pager][current_page] <= $pageoffset)
                {
                        $init = $params['pager']['first_page'];
                        $max = $pagelen;
                }
                else
                {//如果当前页大于左偏移
                //如果当前页码右偏移超出最大分页数
                        if($params[pager][current_page] + $pageoffset >= $totalpage + 1)
                                $init = $totalpage-$pagelen+1;
                        else
                        {
                                //左右偏移都存在时的计算
                                $init = $params[pager][current_page] - $pageoffset;
                                $max = $params[pager][current_page] + $pageoffset;
                        }
                }
        }
        //循环页码
        for($i = $init;$i <= $max;$i++)
        {
                if($i == $page)
                        $html.= ''.$i.'';
                else
                {
                        $url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $i));
                        $html.= "$i";
                }
        }
       
        if( $params['pager']['current_page'] != $params['pager']['last_page'] ){
                $url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $params['pager']['next_page']));
                $html .= "下一页";
                $url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $params['pager']['last_page']));
                $html .= "尾页";
        }else{
                $html .= "下一页";
                $html .= "尾页";
        }
        $html .="第{$params[pager][current_page]}页";
        $html .="共{$params[pager][total_page]}页";
        $html .= '
';
        return $html;
}
有哪里不足之处,请大家给我说下

2010-07-08 15:56:58

#26 jake

$pageoffset = ceil(($pagelen-1)/2);//页码个数左右偏移量

offset的值应该可以设置才对吧?不然页码也多偏移就越大,但是不能灵活地符合页面本身显示的长度啊

2010-07-08 17:46:01

#27 hkbaby

噢 ,  那我这里在设置一下
呵呵

2010-07-09 08:37:43

#28 billgame

呵呵。这里的老大经常来回复啊,不错。

2010-07-27 23:40:58

#29 vsxp

支持,不错的。

2010-07-29 09:34:58

#30 solo

<{pager pager=$pager myclass="yahoo2" c="网址控制器" a="网址动作" arg1="第一个参数" ...}>

如果参数不是固定的怎么办?比如分类搜索,有时是一个参数,有时是多个参数组合。怎么能把$_GET的参数带到分页里呢?

2010-08-11 10:49:10

#31 jake

如果参数不是固定的怎么办?比如分类搜索,有时是一个参数,有时是多个参数组合。怎么能把$_GET的参数带 ...
solo 发表于 2010-8-11 10:49
<{pager pager=$pager myclass="yahoo2" c="网址控制器" a="网址动作" arg1="第一个参数" arg2="第二个参数"  arg3="第三个参数"...}>

2010-08-11 12:09:34

#32 solo

jake 发表于 2010-8-11 12:09
我说的意思是参数不是固定的,也许是一个参数,也许是多个参数。

2010-08-12 10:55:58

#33 jake

我说的意思是参数不是固定的,也许是一个参数,也许是多个参数。
solo 发表于 2010-8-12 10:55
<{pager pager=$pager myclass="yahoo2" c="网址控制器" a="网址动作" arg1="第一个参数"}>

<{pager pager=$pager myclass="yahoo2" c="网址控制器" a="网址动作" haha="haha" abc='abc'}>


<{pager pager=$pager myclass="yahoo2" c="网址控制器" a="网址动作"}>


也就是无论多少个参数,无论参数是什么,都放到这里就可以,和spUrl在模板内的用法一样。

2010-08-12 11:19:49

#34 solo

也就是无论多少个参数,无论参数是什么,都放到这里就可以,和spUrl在模板内的用法一样。 ...
jake 发表于 2010-8-12 11:19
可能你没明白我的意思。
以这个论坛为例。
http://speedphp.com/bbs/forumdisplay.php?fid=5
这个是论坛的列表地址。

http://speedphp.com/bbs/forumdisplay.php?fid=5&filter=digest
这个是论坛的精华区。

http://speedphp.com/bbs/forumdisplay.php?fid=5&orderby=heats&filter=86400
这个是论坛一天内的帖子列表。

这三个地址都是同一个列表,只是后面的参数不同。参数不是固定的一个或是多个,而是可能只是其中的一个或是两个。

我用speedphp的分页如果做到这样的?
按你的说法<{pager pager=$pager myclass="yahoo2" c="网址控制器" a="网址动作" haha="haha" abc='abc'}>
我在里面把默认的参数都加上了,这样不能得到想要所有数据的列表。

2010-08-16 11:50:33

#35 jake

是的,如果是这类型的分页例子,的确是需要把全部的参数都放上去。

“这样不能得到想要所有数据的列表”,这种情况只能说明是你接收处理的时候,逻辑不够清晰。

比如说带搜索的GET关键字,那一定要比分类名等等有优先接收,这些参数在实际应用中都要处理好就行。

2010-08-16 12:01:41

#36 billgame

好东西,收藏了。

2010-09-30 18:12:59

#37 leboo

这分页真不错啊

2010-10-01 21:07:50

#38 helloniu

findSql方式分页可以使用这个吗?

2010-12-30 17:42:05

#39 elick

支持下 刚好需要这个

2011-01-18 14:28:50

#40 xiaoqiqi

完美,可以自定义很多种样式

2011-02-22 10:23:16

#41 南河三

感谢老大,省去了我们很多美术麻烦

2011-03-03 16:13:37

#42 diushi

好  找半天了   。。。赶紧使用一下

2011-09-23 14:43:37