我改写的24个分页函数,请大家看看

#1 azwl

这个是修改过的函数,样子如下:

14.jpg

28.jpg

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')))$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 .= "前页";
         }
     $startpage = 1;
     $endpage = 9;
     if ($curpage > 4){
         $startpage = $curpage-4;
         $endpage = $curpage + 4;
         }
     if ($endpage > $totalpage){
         $startpage = $totalpage-8;
         $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-06-30 18:11:09

#2 hkbaby

我也写了个分页大家看看

class page extends spModel
{
        function pageturn($pager,$location)
        {
                               //$location  要跳转的页面   ||$pager  调用时从数据库读出的页码
                //dump($pager);
                $pagesize = $pager[page_size]; //页容量
                $pagecode = ''; //定义变量,存放分页生成的HTML
                $page = $pager[current_page]; // 起始页(当前页)
                $total = $pager[total_count]; //总条数
                if(!$total) return array(); //总记录数为零返回空数组
                $totalpage = $pager[total_page]; //总分页
                 
                //处理页码合法性
                if($page < 1) $page = 1;
                if($page > $totalpage) $page = $totalpage;
               
                //计算查询偏移量
                $offset = $pagesize*($page-1);
               
                //页码范围计算
                $init = 1;//起始页码数
                $max = $totalpage;//结束页码数
                $pagelen = 10;        //当前应显示页码个数

                $pageoffset = ceil(($pagelen-1)/2);//页码个数左右偏移量
               
                //生成html
                $pagecode='
';
                //如果是第一页,则不显示第一页和上一页的连接
                if($page!=1)
                {
                        $pagecode.=" 首页 ";//第一页
                        $pagecode.=" 上一页 ";//上一页
                }
               
               
                //分页数大于页码个数时可以偏移
                if($totalpage > $pagelen)
                {
                        //如果当前页小于等于左偏移
                        if($page <= $pageoffset)
                        {
                                $init = 1;
                                $max = $pagelen;
                        }
                        else
                        {//如果当前页大于左偏移
                        //如果当前页码右偏移超出最大分页数
                                if($page+$pageoffset >= $totalpage+1)
                                        $init = $totalpage-$pagelen+1;
                                else
                                {
                                        //左右偏移都存在时的计算
                                        $init = $page-$pageoffset;
                                        $max = $page+$pageoffset;
                                }
                        }
                }
               
                //生成html
                for($i = $init;$i <= $max;$i++)
                {
                        if($i == $page)
                                $pagecode.= ''.$i.'';
                        else
                                $pagecode.= "$i";
                }
               
               
               
                //显示下一页和尾页
                if($page!=$totalpage)
                {
                        $pagecode.= " 下一页 ";//下一页
                        $pagecode.= " 尾页 ";//最后一页
                }
               
                //显示当前第几页和一共有多少页
                $pagecode.="共".$pager[total_count]." 条记录".",";
                $pagecode.= "当前第".$page."".",";
                $pagecode.= "".$pager[total_page]."";
                $pagecode.= "(每页".$pager[page_size]."条记录)";
                $pagecode.= '
';
                return  $pagecode;
        }
}
?>

2010-07-01 08:24:44

#3 凌风

你这个很不利于PHP代码与HTML代码的分离呀,共用性能不高。

2010-07-04 22:06:00

#4 hkbaby

这个是php代码与html代码分离的,在代码页实例化page类,然后调用pageturn这个函数就OK了, 在模板页替换就行了

2010-07-05 08:46:45

#5 azwl

回复 4 hkbaby

我觉得继承于spModel不是很合适,应该继承于spPager。

关于这个问题我向jake问过http://speedphp.com/bbs/thread-697-1-2.html

既然是框架就像语言一样,还是不可能满足用户所有的要求,所以如果用户扩展了系统的的功能(譬如spPager),还可以使用原来的语法,我觉得更能体现OOP的思想。

2010-07-05 20:24:00

#6 hkbaby

那有没有更好的例子,代码与html分开的分页写法   要实现左右偏移的{:3_48:}

2010-07-06 09:24:59

#7 jake

直接在模板的函数内进行修改即可,其实所谓的“左右偏移”非常的简单,只要在我原来的__template_pager函数内,在

        foreach( $params['pager']['all_pages'] as $p ){
                if( $p == $params['pager']['current_page'] ){
                        $html .= "{$p}";
                }else{
                        $url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $p));
                        $html .= "{$p}";
                }
        }
中再加上一个判断,就可以令页码可以聚焦在当前页的附近,而不会显示比当前页远的页码了。比如说:

$offset = $params['offset'] ? $params['offset'] : 3; // 可以在<{pager}>内用offset=x来调整

        foreach( $params['pager']['all_pages'] as $p ){
                if( $p == $params['pager']['current_page'] ){
                        $html .= "{$p}";
                }else{
                        if( ($params['pager']['current_page'] < $offset && $p < $offset ) ||
                                ($params['pager']['current_page'] > $params['pager']['last_page'] - $offset && $p > $params['pager']['last_page'] - $offset ) ||
                                ( $p < $params['pager']['current_page'] + $offset && $p > $params['pager']['current_page'] - $offset )
                         ){
                                $url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $p));
                                $html .= "{$p}";
                        }
                }
        }

2010-07-06 10:04:03

#8 jake

if( ($params['pager']['current_page'] < $offset && $p < $offset ) ||
                                ($params['pager']['current_page'] > $params['pager']['last_page'] - $offset && $p > $params['pager']['last_page'] - $offset ) ||
                                ( $p < $params['pager']['current_page'] + $offset && $p > $params['pager']['current_page'] - $offset )
                         )
判断:页码是否在左侧 or 页面是否在中间和在offset范围内 or 页码是否在右侧

2010-07-06 10:05:45

#9 hkbaby

哦   好的  {:2_31:}

2010-07-06 10:28:31

#10 hkbaby

functions.php这文件是不是放在
require(SP_PATH."/SpeedPHP.php");
require(SP_PATH."/functions.php");
这里的吗?
$this->results = spClass('某表')->spPager($this->spArgs('p',1),2)->findAll();
$this->pager = spClass('某表')->spPager()->getPager();
那样式不出来,是不是我的路径放错了?    jake大哥指点下

2010-07-06 11:15:55

#11 汽车人变形

谢谢大家分享,这帖子太有用了。

2011-10-14 16:30:20

#12 w_x_h521

学习了!收藏

2014-01-14 16:06:59