• php分页类及其实现原理


      1 /**
      2  *
      3  * 实现思路:分页显示拆分  :  1...上页 12 13 14 15 [16] 17 18 19 20 ...100 下页
      4  *
      5  * function htmlPart1() : 上页
      6  * function htmlPart2() : 1...
      7  * function htmlPart3() : 12 13 14 15 [16] 17 18 19 20
      8  * function htmlPart4() : ...100
      9  * function htmlPart5() : 下页
     10  *
     11  * @param int $allCount     记录总数目
     12  * @param int $eachPage     每页数目
     13  * @param int $showCount    显示数目
     14  * @param int $thenPage     当前页(页面传值)
     15  * @param string $urlPrefix Url前缀
     16  * @param string $urlSuffix Url后缀
     17  *
     18  * Author : intval@163.com
     19  * Date   : 2013.05.04
     20  *
     21  */
     22 class zPage {
     23 
     24     /** 只可内部调用 */
     25     private $allCount;  /** 总数(非总页数) */
     26     private $eachPage;  /** 每页数(分页数) */
     27     private $showCount; /** 显示数(显示多少页数) */
     28     private $urlPrefix; /** 页码前缀(例如:?page=) */
     29     private $urlSuffix; /** 页码后缀缀(例如:&type=1) */
     30     private $startHide; /** 计算前部需要出现符号(...)的最小值 */
     31     private $endHide;   /** 计算尾部需要出现符号(...)的最小值 */
     32     private $arrTxt = array(' ', ' '); // array('上页', '上页')
     33 
     34     /** 可外部调用 */
     35     public $allPage;    /** 总页数 */
     36     public $thenPage;   /** 当前页 */
     37 
     38     public function __construct($allCount, $eachPage, $showCount, $thenPage, $urlPrefix = '?page=', $urlSuffix = '') {
     39 
     40         $this->allCount = intval($allCount);
     41         $this->eachPage = intval($eachPage);
     42         $this->showCount = intval($showCount);
     43         $this->urlPrefix = trim($urlPrefix);
     44         $this->urlSuffix = trim($urlSuffix);
     45 
     46         /** 计算总页数 */
     47         $this->allPage = ceil($this->allCount / $this->eachPage);
     48 
     49         /** 使当前页的数值合法化 */
     50         $this->thenPage = max(intval($thenPage), 1);
     51         $this->thenPage >= $this->allPage AND $this->thenPage = $this->allPage;
     52 
     53         /** 计算前部和尾部需要出现符号(...)的最小值 */
     54         $this->startHide = ceil($this->showCount / 2);
     55         $this->endHide = $this->allPage - $this->startHide;
     56     }
     57 
     58     public function parseUrl($char = '') {
     59 
     60         $val = $char;
     61         ($char === 'prev') AND $val = $this->thenPage - 1;
     62         ($char === 'next') AND $val = $this->thenPage + 1;
     63         ($char === '') AND $val = $this->allPage;
     64         return $this->urlPrefix . $val . $this->urlSuffix;
     65     }
     66 
     67     public function htmlPart1() {
     68 
     69         $html = '';
     70         $this->thenPage > $this->startHide AND $html = '<a class="prev" href="' . $this->parseUrl('prev') . '" title="上一页">' . $this->arrTxt[0] . '</a>' . PHP_EOL;
     71         return $html;
     72     }
     73 
     74     public function htmlPart2() {
     75 
     76         $dot = '';
     77         $this->thenPage > $this->startHide AND $dot = ' ...';
     78 
     79         $html = '<a href="' . $this->parseUrl(1) . '">1'. $dot .'</a>' . PHP_EOL;
     80         $this->thenPage == 1 AND $html = '<span>1</span>' . PHP_EOL;
     81 
     82         return $html;
     83     }
     84 
     85     public function htmlPart3() {
     86 
     87         $html = '';
     88 
     89         if ($this->thenPage <= $this->startHide) {
     90 
     91             /**
     92              * 第一种情况:[1] 2 3 4 5 6 7 8 9 10 ...100 下页
     93              * 即:当前部在 不需要出现...的 范围之内
     94              */
     95             for ($i = 2, $n = $this->showCount; $i < $n; $i++) {
     96                 $html .= (($i == $this->thenPage) ? '<span>' . $this->thenPage . '</span>' : '<a href="' . $this->parseUrl($i) . '">' . $i . '</a>') . PHP_EOL;
     97             }
     98 
     99         } elseif ($this->thenPage >= $this->endHide) {
    100 
    101             /**
    102              * 第二种情况:上页 1..92 93 94 95 96 97 98 [99] 100
    103              * 即:当尾部在 不需要出现...的 范围之内
    104              */
    105             $len = $this->showCount - 2;
    106             $i = $this->allPage - $len;
    107             $n = $this->allPage;
    108             for ($i; $i < $n; $i++) {
    109                 $html .= (($i == $this->thenPage) ? '<span>' . $this->thenPage . '</span>' : '<a href="' . $this->parseUrl($i) . '">' . $i . '</a>') . PHP_EOL;
    110             }
    111 
    112         } else {
    113 
    114             /**
    115              * 第三种情况:上页 1..12 13 14 15 [16] 17 18 19 20 ...100 下页
    116              * 即:当前后都在 需要出现...的 范围之内
    117              */
    118             $len = $this->showCount - 2;    // 此处减去2,是说明头尾各占去一个数字(1, x)
    119             $offset = ceil($len / 2) - 1;   // 对剩下的数目平分,得出平分数
    120             $i = $this->thenPage - $offset; // 循环开始:当前页向前偏移平分数
    121             $n = $this->thenPage + $offset; // 循环结束:当前页向后偏移平分数
    122             for ($i; $i <= $n; $i++) {
    123                 $html .= (($i == $this->thenPage) ? '<span>' . $this->thenPage . '</span>' : '<a href="' . $this->parseUrl($i) . '">' . $i . '</a>') . PHP_EOL;
    124             }
    125         }
    126 
    127         return $html;
    128     }
    129 
    130     public function htmlPart4() {
    131 
    132         $dot = '';
    133         $this->thenPage < $this->endHide AND $dot = '... ';
    134 
    135         $html = '<a href="' . $this->parseUrl() . '">' . $dot . $this->allPage . '</a>' . PHP_EOL;
    136         $this->thenPage == $this->allPage AND $html = '<span>' . $this->allPage . '</span>' . PHP_EOL;
    137 
    138         return $html;
    139     }
    140 
    141     public function htmlPart5() {
    142 
    143         $html = '';
    144         $this->thenPage < $this->endHide AND $html = '<a class="next" href="' . $this->parseUrl('next') . '" title="下一页">' . $this->arrTxt[1] . '</a>' . PHP_EOL;
    145         return $html;
    146     }
    147 
    148     public function html() {
    149 
    150         $pageHtml = '';
    151 
    152         /** 总页数未达到显示页码数,则全部显示 */
    153         if ($this->allPage <= $this->showCount) {
    154             for ($i = 1; $i <= $this->allPage; $i++) {
    155                 $pageHtml .= ($i == $this->thenPage) ? '<span>' . $this->thenPage . '</span>' . PHP_EOL : '<a href="' . $this->parseUrl($i) . '">' . $i . '</a>' . PHP_EOL;
    156             }
    157         } else {
    158             $pageHtml = $this->htmlPart2() . $this->htmlPart1() . $this->htmlPart3() . $this->htmlPart4() . $this->htmlPart5();
    159         }
    160 
    161         return $pageHtml;
    162     }
    163 }
    164 
    165 // 调用例子
    166 $getPage = isset($_GET['page']) ? intval($_GET['page']) : 0;
    167 $getPage = max($getPage, 1);
    168 $zPage = new zPage(1100, 10, 11, $getPage, '?page=', '&type=1');
    169 echo $zPage->html();
  • 相关阅读:
    winform 单选框, 图像控件,图像列表,状态栏,定时器,绘图
    学习资料链接,csdn博客
    c# 基本控件,窗口程序
    Gmap.net 怎么导入离线地图
    修改MFC主窗口界面标题和图标的方法
    vc6.0缓冲区
    vc6.0编译出错,删除多余的文件,清空重新编译
    Tomcat插件与Jetty插件在MyEclipse中的配置
    div里面的内容超出自身高度时,显示省略号
    aptana studio 3 自动换行(无需插件)
  • 原文地址:https://www.cnblogs.com/intval/p/3574180.html
Copyright © 2020-2023  润新知