请选择 进入手机版 | 继续访问电脑版

SpeedPHP框架

 找回密码
 成为新用户

QQ登录

只需一步,快速开始

查看: 11371|回复: 11

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

[复制链接]
发表于 2010-6-30 18:11:09 | 显示全部楼层 |阅读模式
这个是修改过的函数,样子如下:





  1. <?php
  2. spAddViewFunction('pager', '__template_pager');
  3. function __template_pager($params){
  4.      if(!isset($params['pager']) || empty($params['pager']))return '';
  5.      $args = array();
  6.      foreach($params as $k => $v)if(!in_array($k, array('c', 'a', 'pager', 'myclass', 'mypage')))$args[$k] = $v;
  7.      $pagerhandle = isset($params['pager']['mypage']) ? $params['pager']['mypage'] : 'p';
  8.      $html = "<div class=\"{$params['myclass']}\">";
  9.      $curpage = $params['pager']['current_page'];
  10.      $totalpage = $params['pager']['total_page'];
  11.    
  12.      if($curpage != $params['pager']['first_page']){
  13.          $url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $params['pager']['first_page']));
  14.          $html .= "<a href=\"{$url}\">首页</a>";
  15.          }
  16.      if($curpage != $params['pager']['prev_page']){
  17.          $url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $params['pager']['prev_page']));
  18.          $html .= "<a href=\"{$url}\">前页</a>";
  19.          }
  20.      $startpage = 1;
  21.      $endpage = 9;
  22.      if ($curpage > 4){
  23.          $startpage = $curpage-4;
  24.          $endpage = $curpage + 4;
  25.          }
  26.      if ($endpage > $totalpage){
  27.          $startpage = $totalpage-8;
  28.          $endpage = $totalpage;
  29.          }
  30.      if ($startpage < 1) $startpage = 1;
  31.      for($p = $startpage;$p <= $endpage;$p++){
  32.          if($p == $curpage){
  33.              $html .= "<span class=\"current\">{$p}</span>";
  34.              }else{
  35.              $url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $p));
  36.              $html .= "<a href=\"$url\">{$p}</a>";
  37.              }
  38.          }
  39.    
  40.      if($curpage != $params['pager']['next_page']){
  41.          $url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $params['pager']['next_page']));
  42.          $html .= "<a href=\"$url\">下页</a>";
  43.          }
  44.      if($curpage != $params['pager']['last_page']){
  45.          $url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $params['pager']['last_page']));
  46.          $html .= "<a href=\"$url\">末页</a>";
  47.          }
  48.      $html .= '</div>';
  49.      return $html;
  50.      }
  51. ?>
复制代码

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?成为新用户

x
发表于 2010-7-1 08:24:44 | 显示全部楼层
我也写了个分页大家看看

  1. <?php
  2. class page extends spModel
  3. {
  4.         function pageturn($pager,$location)
  5.         {
  6.                                //$location  要跳转的页面   ||$pager  调用时从数据库读出的页码
  7.                 //dump($pager);
  8.                 $pagesize = $pager[page_size]; //页容量
  9.                 $pagecode = ''; //定义变量,存放分页生成的HTML
  10.                 $page = $pager[current_page]; // 起始页(当前页)
  11.                 $total = $pager[total_count]; //总条数
  12.                 if(!$total) return array(); //总记录数为零返回空数组
  13.                 $totalpage = $pager[total_page]; //总分页
  14.                  
  15.                 //处理页码合法性
  16.                 if($page < 1) $page = 1;
  17.                 if($page > $totalpage) $page = $totalpage;
  18.                
  19.                 //计算查询偏移量
  20.                 $offset = $pagesize*($page-1);
  21.                
  22.                 //页码范围计算
  23.                 $init = 1;//起始页码数
  24.                 $max = $totalpage;//结束页码数
  25.                 $pagelen = 10;        //当前应显示页码个数

  26.                 $pageoffset = ceil(($pagelen-1)/2);//页码个数左右偏移量
  27.                
  28.                 //生成html
  29.                 $pagecode='<div class="page">';
  30.                 //如果是第一页,则不显示第一页和上一页的连接
  31.                 if($page!=1)
  32.                 {
  33.                         $pagecode.="<a href=\"".$location."&page=1\" style=\"text-decoration:none\"> 首页 </a>";//第一页
  34.                         $pagecode.="<a href=\"".$location."&page=".($page-1)."\" style=\"text-decoration:none\"> 上一页 </a>";//上一页
  35.                 }
  36.                
  37.                
  38.                 //分页数大于页码个数时可以偏移
  39.                 if($totalpage > $pagelen)
  40.                 {
  41.                         //如果当前页小于等于左偏移
  42.                         if($page <= $pageoffset)
  43.                         {
  44.                                 $init = 1;
  45.                                 $max = $pagelen;
  46.                         }
  47.                         else
  48.                         {//如果当前页大于左偏移
  49.                         //如果当前页码右偏移超出最大分页数
  50.                                 if($page+$pageoffset >= $totalpage+1)
  51.                                         $init = $totalpage-$pagelen+1;
  52.                                 else
  53.                                 {
  54.                                         //左右偏移都存在时的计算
  55.                                         $init = $page-$pageoffset;
  56.                                         $max = $page+$pageoffset;
  57.                                 }
  58.                         }
  59.                 }
  60.                
  61.                 //生成html
  62.                 for($i = $init;$i <= $max;$i++)
  63.                 {
  64.                         if($i == $page)
  65.                                 $pagecode.= '<span style="padding-left:5px; color:#0000FF; padding-right:2px; color:#bf0000;">'.$i.'</span>';
  66.                         else
  67.                                 $pagecode.= "<a href=\"".$location."&page={$i}\" style=\"padding-left:2px; color:#0033ff; margin:2px; text-decoration:none\">$i</a>";
  68.                 }
  69.                
  70.                
  71.                
  72.                 //显示下一页和尾页
  73.                 if($page!=$totalpage)
  74.                 {
  75.                         $pagecode.= "<a href=\"".$location."&page=".($page+1)."\" style=\"text-decoration:none\"> 下一页 </a>";//下一页
  76.                         $pagecode.= "<a href=\"".$location."&page={$totalpage}\" style=\"text-decoration:none\"> 尾页 </a>";//最后一页
  77.                 }
  78.                
  79.                 //显示当前第几页和一共有多少页
  80.                 $pagecode.="<a style=\"margin-left:10px;\">共".$pager[total_count]." 条记录</a>".",";
  81.                 $pagecode.= "<a>当前第<span style=\"padding-left:5px; color:#bf0000; border:solid 1px #929292; margin:2px; padding-right:5px;\">".$page."</span>页</a>".",";
  82.                 $pagecode.= "<a>共<span style=\"padding-left:5px; color:#bf0000; border:solid 1px #929292; margin:2px; padding-right:5px;\">".$pager[total_page]."</span>页</a>";
  83.                 $pagecode.= "<a>(每页".$pager[page_size]."条记录)</a>";
  84.                 $pagecode.= '</div>';
  85.                 return  $pagecode;
  86.         }
  87. }
  88. ?>
复制代码
发表于 2010-7-4 22:06:00 | 显示全部楼层
你这个很不利于PHP代码与HTML代码的分离呀,共用性能不高。
发表于 2010-7-5 08:46:45 | 显示全部楼层
这个是php代码与html代码分离的,在代码页实例化page类,然后调用pageturn这个函数就OK了, 在模板页替换就行了
 楼主| 发表于 2010-7-5 20:24:00 | 显示全部楼层
回复 4# hkbaby

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

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

既然是框架就像语言一样,还是不可能满足用户所有的要求,所以如果用户扩展了系统的的功能(譬如spPager),还可以使用原来的语法,我觉得更能体现OOP的思想。
发表于 2010-7-6 09:24:59 | 显示全部楼层
那有没有更好的例子,代码与html分开的分页写法   要实现左右偏移的{:3_48:}
发表于 2010-7-6 10:04:03 | 显示全部楼层
直接在模板的函数内进行修改即可,其实所谓的“左右偏移”非常的简单,只要在我原来的__template_pager函数内,在

  1.         foreach( $params['pager']['all_pages'] as $p ){
  2.                 if( $p == $params['pager']['current_page'] ){
  3.                         $html .= "<span class=\"current\">{$p}</span>";
  4.                 }else{
  5.                         $url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $p));
  6.                         $html .= "<a href=\"$url\">{$p}</a>";
  7.                 }
  8.         }
复制代码
中再加上一个判断,就可以令页码可以聚焦在当前页的附近,而不会显示比当前页远的页码了。比如说:

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

  2.         foreach( $params['pager']['all_pages'] as $p ){
  3.                 if( $p == $params['pager']['current_page'] ){
  4.                         $html .= "<span class=\"current\">{$p}</span>";
  5.                 }else{
  6.                         if( ($params['pager']['current_page'] < $offset && $p < $offset ) ||
  7.                                 ($params['pager']['current_page'] > $params['pager']['last_page'] - $offset && $p > $params['pager']['last_page'] - $offset ) ||
  8.                                 ( $p < $params['pager']['current_page'] + $offset && $p > $params['pager']['current_page'] - $offset )
  9.                          ){
  10.                                 $url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $p));
  11.                                 $html .= "<a href=\"$url\">{$p}</a>";
  12.                         }
  13.                 }
  14.         }
复制代码
发表于 2010-7-6 10:05:45 | 显示全部楼层
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-7-6 10:28:31 | 显示全部楼层
哦   好的  {:2_31:}
发表于 2010-7-6 11:15:55 | 显示全部楼层
functions.php这文件是不是放在
  1. require(SP_PATH."/SpeedPHP.php");
  2. require(SP_PATH."/functions.php");
复制代码
这里的吗?
  1. $this->results = spClass('某表')->spPager($this->spArgs('p',1),2)->findAll();
  2. $this->pager = spClass('某表')->spPager()->getPager();
复制代码
那样式不出来,是不是我的路径放错了?    jake大哥指点下
您需要登录后才可以回帖 登录 | 成为新用户

本版积分规则

手机浏览|简版|中文PHP框架|开源协议|SpeedPHP.com ( 粤ICP备08008671号

GMT+8, 2021-10-21 14:03

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表