封装Uchome分页方法
May 8, 2009 – 11:37 pm昨天晚上没事可干,躺在床上抱着小黑看uchome的源代码,边调试边看,发现uchome的分页方法很巧妙,正好手痒,就把这个方法改装成一个类,改装完毕后,再完善一下,使之可以支持symfony。记录在这里了。
- <?php
- /*
- *@author he luan
- *@package 分页类,参考uchome开发,支持symfony项目
- */
- class page
- {
- public $projectType = "";//判断项目类型,默认为普通项目,'sf'代表symfony项目使用
- public $totalCount;//记录总条数
- public $numPerPage;//每页显示数量
- public $currentPage;//当前页码
- public $pageUrl;//分页链接url
- function __construct()
- {
- /*
- *以下配置在一个项目里是统一的,所以放在构造函数里。
- *如果是symfony项目,可以读取app.yml。
- */
- $this->page = 5;//页码长度,假如当前设置是5,则表示只显示5个页码,多了用省略号代替。
- $this->offSet = 2;//偏移量,例如第9页,前面显示7、8页,后面显示10、11页,页码长度取决于上面的配置,前后多了的用省略号代替
- $this->maxPages = 50;//页面显示最大页码数量,并不把实际最大页面数量呈现在网页上
- }
- /*
- *@package 生成分页HTML主程序
- *
- *@param $totalCount 总信息条数
- *@param $numPerPage 每页显示数量
- *@param $currentPage 当前页码
- *@param $pageUrl 分页链接
- */
- public function generatePage()
- {
- $totalCount = $this->totalCount;
- $numPerPage = $this->numPerPage;
- $currentPage = $this->currentPage;
- $pageUrl = $this->pageUrl;
- $outPageHTML = "";//初始化输出HTML代码
- $pageUrl .= strpos($pageUrl,'?')?'&':'?';
- $realpages = 1;//初始化分页数量
- if ($totalCount > $numPerPage)//只有在总页码大于2的情况下,才输出分页HTML代码
- {
- $realpages = ceil($totalCount / $numPerPage);
- $pages = ($this->maxPages < $realpages)?$this->maxPages:$realpages;//算出总页码数
- if ($this->page > $pages)
- {
- /*
- *如果总页码数小于页码长度,
- *起始页码从1开始,末页就是总页码数
- */
- $from = 1;
- $to = $pages;
- }
- else
- {
- /*
- *如果总页码数大于页码长度,
- *起始页码 = 当前页码 - 偏移量,即向前取偏移量个页码,
- *末页 = 起始页 + 页码长度 - 1,即向后取偏移量个页码。
- */
- $from = $currentPage - $this->offSet;
- $to = $from + $this->page - 1;
- if ($from < 1)
- {
- $to = $currentPage + 1 - $from;
- $from = 1;
- if ($to - $from < $this->page)
- {
- $to = $this->page;
- }
- }
- elseif ($to > $pages)
- {
- $from = $pages - $this->page + 1;
- $to = $pages;
- }
- }
- /*
- *开始输出分页HTML代码
- */
- if ($currentPage - $this->offSet > 1 && $pages > $this->page)
- {
- /*
- *满足条件1:如果当前页码减去偏移量大于1,例如偏移量是2,例如当前页码是5,5-2=3>1;
- *满足条件2:如果总页码数大于构造函数中的配置数,即可以显示省略号
- *
- *构建出的HTML代码就是先显示第一页,然后显示省略号
- */
- if ($this->projectType == 'sf')
- {
- $outPageHTML .= '<span class="paeg_num">'.link_to('1',$pageUrl.'page=1').'</span><span class="paeg_par">...</span>';
- }
- else
- {
- $outPageHTML .= '<span class="paeg_num"><a href="'.$pageUrl.'page=1">1</a></span><span class="paeg_par">...</span>';
- }
- }
- if ($currentPage > 1)
- {
- /*
- *如果当前页码不是第一页,那么构造出来的HTML代码应该包含一个“上一页”的链接
- */
- if ($this->projectType == 'sf')
- {
- $outPageHTML .= '<span class=paeg_par>'.link_to('上一页',$pageUrl.'page='.($currentPage - 1)).'</span>';
- }
- else
- {
- $outPageHTML .= '<span class=paeg_par><a href="'.$pageUrl.'page='.($currentPage - 1).'">上一页</a></span>';
- }
- }
- for($i = $from; $i <= $to; $i++)
- {
- /*
- *根据上面起始页数和结束页数,构建分页HTML代码
- */
- if ($this->projectType == 'sf')
- {
- $outPageHTML .= ($i == $currentPage) ? '<span class="paeg_cur">'.$currentPage.'</span>' :'<span class="paeg_num">'.link_to($i,$pageUrl.'page='.$i).'</span>';
- }
- else
- {
- $outPageHTML .= ($i == $currentPage) ? '<span class="paeg_cur">'.$currentPage.'</span>' :'<span class="paeg_num"><a href="'.$pageUrl.'page='.$i.'">'.$i.'</a></span>';
- }
- }
- /*
- *当前页不是最后一页,显示一个“下一页”链接,
- *末页数小于总页数,显示省略号然后再显示最后一页的链接。
- */
- if ($this->projectType == 'sf')
- {
- if ($currentPage < $pages)
- {
- $outPageHTML .= '<span class="paeg_par">'.link_to('下一页',$pageUrl.'page='.($currentPage + 1)).'</span>';
- }
- if ($to < $pages)
- {
- $outPageHTML .= '<span class="paeg_par">...</span><span class="paeg_num">'.link_to($pages,$pageUrl.'page='.$pages).'</span>';
- }
- }
- else
- {
- if ($currentPage < $pages)
- {
- $outPageHTML .= '<span class="paeg_par"><a href="'.$pageUrl.'page='.($currentPage + 1).'">下一页</a></span>';
- }
- if ($to < $pages)
- {
- $outPageHTML .= '<span class="paeg_par">...</span><span class="paeg_num"><a href="'.$pageUrl.'page='.$pages.'">'.$pages.'</a></span>';
- }
- }
- }
- return $outPageHTML;
- }
- }
- /************************ 例子 ****************************/
- $page = new page();
- $page->totalCount = 100;
- $page->numPerPage = 5;
- $page->currentPage = 9;
- $page->pageUrl = 'index.php';
- echo $page->generatePage();
- /**********************************************************/
One Response to “封装Uchome分页方法”
阿平真能干
By 云的彼端 on Jul 24, 2009