封装Uchome分页方法

May 8, 2009 – 11:37 pm

    昨天晚上没事可干,躺在床上抱着小黑看uchome的源代码,边调试边看,发现uchome的分页方法很巧妙,正好手痒,就把这个方法改装成一个类,改装完毕后,再完善一下,使之可以支持symfony。记录在这里了。

  1. <?php
  2. /*
  3. *@author  he luan
  4. *@package  分页类,参考uchome开发,支持symfony项目
  5. */
  6.  
  7. class page
  8. {
  9.   public $projectType = "";//判断项目类型,默认为普通项目,'sf'代表symfony项目使用
  10.   public $totalCount;//记录总条数
  11.   public $numPerPage;//每页显示数量
  12.   public $currentPage;//当前页码
  13.   public $pageUrl;//分页链接url
  14.  
  15.   function __construct()
  16.     {
  17.     /*
  18.      *以下配置在一个项目里是统一的,所以放在构造函数里。
  19.      *如果是symfony项目,可以读取app.yml。
  20.     */
  21.     $this->page = 5;//页码长度,假如当前设置是5,则表示只显示5个页码,多了用省略号代替。
  22.     $this->offSet = 2;//偏移量,例如第9页,前面显示7、8页,后面显示10、11页,页码长度取决于上面的配置,前后多了的用省略号代替
  23.     $this->maxPages = 50;//页面显示最大页码数量,并不把实际最大页面数量呈现在网页上
  24.   }
  25.  
  26.   /*
  27.    *@package  生成分页HTML主程序
  28.    *
  29.    *@param  $totalCount  总信息条数
  30.    *@param  $numPerPage  每页显示数量
  31.    *@param  $currentPage  当前页码
  32.    *@param  $pageUrl  分页链接
  33.   */
  34.   public function generatePage()
  35.     {
  36.     $totalCount = $this->totalCount;
  37.     $numPerPage = $this->numPerPage;
  38.     $currentPage = $this->currentPage;
  39.     $pageUrl = $this->pageUrl;
  40.     $outPageHTML = "";//初始化输出HTML代码
  41.     $pageUrl .= strpos($pageUrl,'?')?'&':'?';
  42.     $realpages = 1;//初始化分页数量
  43.    
  44.     if ($totalCount > $numPerPage)//只有在总页码大于2的情况下,才输出分页HTML代码
  45.         {
  46.       $realpages = ceil($totalCount / $numPerPage);
  47.       $pages = ($this->maxPages < $realpages)?$this->maxPages:$realpages;//算出总页码数
  48.      
  49.       if ($this->page > $pages)
  50.             {
  51.         /*
  52.          *如果总页码数小于页码长度,
  53.          *起始页码从1开始,末页就是总页码数
  54.         */
  55.         $from = 1;
  56.         $to = $pages;
  57.       }
  58.             else
  59.             {
  60.         /*
  61.          *如果总页码数大于页码长度,
  62.          *起始页码 = 当前页码 - 偏移量,即向前取偏移量个页码,
  63.          *末页 = 起始页 + 页码长度 - 1,即向后取偏移量个页码。
  64.         */
  65.         $from = $currentPage - $this->offSet;
  66.         $to = $from + $this->page - 1;
  67.        
  68.         if ($from < 1)
  69.                 {
  70.           $to = $currentPage + 1 - $from;
  71.           $from = 1;
  72.           if ($to - $from < $this->page)
  73.                     {
  74.             $to = $this->page;
  75.           }
  76.         }
  77.                 elseif ($to > $pages)
  78.                 {
  79.           $from = $pages - $this->page + 1;
  80.           $to = $pages;
  81.         }
  82.       }
  83.       /*
  84.        *开始输出分页HTML代码
  85.       */
  86.       if ($currentPage - $this->offSet > 1 && $pages > $this->page)
  87.       {
  88.         /*
  89.          *满足条件1:如果当前页码减去偏移量大于1,例如偏移量是2,例如当前页码是5,5-2=3>1;
  90.          *满足条件2:如果总页码数大于构造函数中的配置数,即可以显示省略号
  91.          *
  92.          *构建出的HTML代码就是先显示第一页,然后显示省略号
  93.         */
  94.         if ($this->projectType == 'sf')
  95.         {
  96.           $outPageHTML .= '<span class="paeg_num">'.link_to('1',$pageUrl.'page=1').'</span><span class="paeg_par">...</span>';
  97.         }
  98.         else
  99.         {
  100.           $outPageHTML .= '<span class="paeg_num"><a href="'.$pageUrl.'page=1">1</a></span><span class="paeg_par">...</span>';
  101.         }
  102.       }
  103.       if ($currentPage > 1)
  104.       {
  105.         /*
  106.          *如果当前页码不是第一页,那么构造出来的HTML代码应该包含一个“上一页”的链接
  107.         */
  108.         if ($this->projectType == 'sf')
  109.         {
  110.           $outPageHTML .= '<span class=paeg_par>'.link_to('上一页',$pageUrl.'page='.($currentPage - 1)).'</span>';
  111.         }
  112.         else
  113.         {
  114.           $outPageHTML .= '<span class=paeg_par><a href="'.$pageUrl.'page='.($currentPage - 1).'">上一页</a></span>';
  115.         }
  116.       }
  117.           for($i = $from; $i <= $to; $i++)
  118.             {
  119.         /*
  120.          *根据上面起始页数和结束页数,构建分页HTML代码
  121.         */
  122.         if ($this->projectType == 'sf')
  123.         {
  124.           $outPageHTML .= ($i == $currentPage) ? '<span class="paeg_cur">'.$currentPage.'</span>' :'<span class="paeg_num">'.link_to($i,$pageUrl.'page='.$i).'</span>';
  125.         }
  126.               else
  127.         {
  128.           $outPageHTML .= ($i == $currentPage) ? '<span class="paeg_cur">'.$currentPage.'</span>' :'<span class="paeg_num"><a href="'.$pageUrl.'page='.$i.'">'.$i.'</a></span>';
  129.         }
  130.           }
  131.       /*
  132.        *当前页不是最后一页,显示一个“下一页”链接,
  133.        *末页数小于总页数,显示省略号然后再显示最后一页的链接。
  134.       */
  135.       if ($this->projectType == 'sf')
  136.       {
  137.         if ($currentPage < $pages)
  138.         {
  139.           $outPageHTML .= '<span class="paeg_par">'.link_to('下一页',$pageUrl.'page='.($currentPage + 1)).'</span>';
  140.         }
  141.         if ($to < $pages)
  142.         {
  143.           $outPageHTML .= '<span class="paeg_par">...</span><span class="paeg_num">'.link_to($pages,$pageUrl.'page='.$pages).'</span>';
  144.         }
  145.       }
  146.           else
  147.       {
  148.         if ($currentPage < $pages)
  149.         {
  150.           $outPageHTML .= '<span class="paeg_par"><a href="'.$pageUrl.'page='.($currentPage + 1).'">下一页</a></span>';
  151.         }
  152.         if ($to < $pages)
  153.         {
  154.           $outPageHTML .= '<span class="paeg_par">...</span><span class="paeg_num"><a href="'.$pageUrl.'page='.$pages.'">'.$pages.'</a></span>';
  155.         }
  156.       }
  157.     }
  158.     return $outPageHTML;
  159.   }
  160. }
  161.  
  162. /************************ 例子 ****************************/
  163. $page = new page();
  164. $page->totalCount = 100;
  165. $page->numPerPage = 5;
  166. $page->currentPage = 9;
  167. $page->pageUrl = 'index.php';
  168. echo $page->generatePage();
  169. /**********************************************************/
  1. One Response to “封装Uchome分页方法”

  2. 阿平真能干

    By 云的彼端 on Jul 24, 2009

Post a Comment