分页类的源码分析

林继 PHP 技术 6,461 共写了129个字 (2005-12-07 11:15:32) 没有评论 打印 扫描二维码 百度已收录

From:http://www.im286.com/viewthread.php?tid=1188679&extra=page%3D1

一个分页类的源码分析,添加了注释,帮助学习,添加的不好的地方欢迎指教

  1. <?
  2. /*
  3. $pagebar=new pagebar(
  4. array('URLGet'=>        //URLGET附属参数
  5. 'PageVar'=>                //Page的GET变量
  6. 'PageTemplate'=>        //翻页栏模板
  7. 'PageMax'=>                //每页最大行数
  8. 'NoPageHidden'=>        //无内容时是否分页栏
  9. 'P_Length'=>                //当前页之前显示的页码数目
  10. 'N_Length'=>                //当前页之后显示的页码数目
  11. 'DisableButtonHidden'=>        //隐藏失效的翻页链接
  12. ),$startno                //返回的当前页起始行
  13. );
  14. */
  15.  
  16. class pagebar {
  17. var $pagedata;
  18.  
  19. //初始化Pagebar
  20. function pagebar($data,&$startno) {
  21.        //获取用户提交的Pagebar参数(数组),参数保存到$this->pagedata
  22.        $this->pagedata=$data;
  23.        //根据参数返回给用户当前记录的起始行,用来执行Select的SQL语句
  24.        $startno=$_GET[$this->pagedata[PageVar]]*$this->pagedata[PageMax]+0;
  25. }
  26.  
  27. //处理Pagebar
  28. function process_pagebar($AllCount) {
  29.        //从参数中获取需要的变量
  30.        $PageNum=$this->pagedata[PageMax];
  31.        $url=$this->pagedata[URLGet];if ($url!='') $url.='&';
  32.        $url.="{$this->pagedata[PageVar]}=";
  33.        $p=$_GET[$this->pagedata[PageVar]];
  34.        $Content=$this->pagedata[Template];
  35.        //没有记录返回空
  36.        if ($AllCount==0 or $PageNum==0) {return '';}
  37.        //返回总页数
  38.        $count=$AllCount/$PageNum;
  39.        //如果总页数就一行
  40.        if ($count<=1) {
  41.                //如果不存在翻页则隐藏([NoPageHidden])参数存在那么返回空
  42.                if ($this->pagedata[NoPageHidden]) return "";
  43.                else return "<span title='当前共有".$AllCount."条记录'>[$AllCount]</span>";
  44.        }
  45.        //设置分页栏<select>元素
  46.        $psel="<select class=tplinp onchange="location.href='?{$url}'+this.value">";
  47.        for ($i=0;$i<$count;$i++) {
  48.                $psel.="<option value='$i' ";
  49.                if ($p==$i) {$psel.="selected";}
  50.                $psel.=">".($i+1)."</option>";
  51.        }$psel.="</select>";
  52.        //前页、下页,页号
  53.        $pp=$p-1;$np=$p+1;
  54.        //设置首页、前页、后页、尾页的链接头
  55.        $ppstr1="<a href='?{$url}0'>";if ($pp<0) {$ppstr1='';}
  56.        $ppstr="<a href='?{$url}$pp'>";if ($pp<0) {$ppstr='';}
  57.        $npstr="<a href='?{$url}$np'>";if ($np>=$count) {$npstr='';}
  58.        $npstr1="<a href='?{$url}".($i-1)."'>";if ($np>=$count) {$npstr1='';};
  59.        //获取分页栏,当前页页码显示的前后数
  60.        $j_s0=$this->pagedata[P_Length];$j_e0=$this->pagedata[N_Length];
  61.  
  62.        //获取分页栏模板中的 页码链接子模板(<page_num>)
  63.        preg_match ("#<page_num>.+?</page_num>#s", $Content, $pndata);$pndata=$pndata[1];
  64.        $e_pndata=explode("|",$pndata);
  65.  
  66.        //设置分页栏 页码链接 起始和终止页号
  67.        $j_s=$p-$j_s0;$j_e=$p+$j_e0;
  68.        if ($j_s<0) $j_s=0;
  69.        if ($j_e>$i) $j_e=$i;
  70.        //按照 页码链接子模版 内容设置 分页栏页码链接
  71.        for ($j=$j_s;$j<$j_e;$j++) {
  72.                if ($p==$j) {
  73.                        $epn=$e_pndata[0];
  74.                        $epn=str_replace ("#<num>#", ($j+1), $epn);
  75.                }
  76.                else {
  77.                        $epn=$e_pndata[1];
  78.                        $epn=str_replace ("<num>", ($j+1), $epn);
  79.                        $epn=str_replace ("<numlink>", "<a href='?$url$j'>", $epn);
  80.                        $epn=str_replace ("</numlink>", "</a>", $epn);
  81.                }
  82.                $pnstr.=$epn;
  83.        }
  84.        //把设置好的分页栏页码链接写回模板
  85.        $Content=preg_replace ("#<page_num>(.+?)</page_num>#s", $pnstr, $Content);
  86.        //无效链接如果设置了隐藏([DisableButtonHidden])那么进行隐藏
  87.        if ($this->pagedata[DisableButtonHidden]) {
  88.                if ($ppstr1=='') $Content=preg_replace ("#<page_first>.+?</page_first>#s", "", $Content);
  89.                if ($ppstr=='') $Content=preg_replace ("#<page_prev>.+?</page_prev>#s", "", $Content);
  90.                if ($npstr=='') $Content=preg_replace ("#<page_next>.+?</page_next>#s", "", $Content);
  91.                if ($npstr1=='') $Content=preg_replace ("#<page_last>.+?</page_last>#s", "", $Content);
  92.        }
  93.        //替换模板中首页、前页、后页、尾页为页码链接
  94.        $Content=preg_replace ("#<page_first>(.+?)</page_first>#s", "$ppstr11</a>", $Content);
  95.        $Content=preg_replace ("#<page_prev>(.+?)</page_prev>#s", "$ppstr1</a>", $Content);
  96.        $Content=preg_replace ("#<page_next>(.+?)</page_next>#s", "$npstr1</a>", $Content);
  97.        $Content=preg_replace ("#<page_last>(.+?)</page_last>#s", "$npstr11</a>", $Content);
  98.        //替换模板中<select>,总记录数,总页数
  99.        $Content=str_replace ("<page_select>", $psel, $Content);
  100.        $Content=str_replace ("<recordcount>", $AllCount, $Content);
  101.        $Content=str_replace ("<pagecount>", $i, $Content);
  102.        return $Content;
  103. }
  104.  
  105. //编译Pagebar
  106. function compile_pagebar($AllCount) {
  107.        //使用PHPSoMVC的模板类打开分页栏模板
  108.        $pagebar_tpl=new template($this->pagedata[PageTemplate]);
  109.        //编译分页栏模板
  110.        $this->pagedata[Template]=$pagebar_tpl->compile_template();
  111.        //分页栏模板未编译的部分,用处理Pagebar的函数进行处理
  112.        $page=$this->process_pagebar($AllCount);
  113.        return $page;
  114. }
  115.  
  116. }

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

< >