看到一个哥们写的UChome的分页,挺不错的拿过来借鉴一下。7dddd5eb
(引用:http://symfony.net.cn/)
昨天晚上没事可干,躺在床上抱着小黑看uchome的源代码,边调试边看,
发现uchome的分页方法很巧妙,正好手痒,就把这个方法改装成一个类,
改装完毕后,再完善一下,使之可以支持symfony。记录在这里了。
< ?php
/**@author he luan
*@package 分页类,参考uchome开发,支持symfony项目
*/
class page
{
//判断项目类型,默认为普通项目,'sf'代表symfony项目使用
public $projectType = "";
public $totalCount;//记录总条数
public $numPerPage;//每页显示数量
public $currentPage;//当前页码
public $pageUrl;//分页链接url
function __construct()
{
/**以下配置在一个项目里是统一的,所以放在构造函数里。
*如果是symfony项目,可以读取app.yml。
**/
//页码长度,假如当前设置是5,则表示只显示5个页码,多了用省略号代替。
$this->page = 5;
//sunqingli.cn
$this->offSet = 2;
//偏移量,例如第9页,前面显示7、8页,www.sunqingli.cn
//后面显示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;
//初始化输出HTML代码
$outPageHTML = "";
//sunqingli.cn
$pageUrl .= strpos($pageUrl,'?')?'&':'?';
$realpages = 1;//初始化分页数量
//只有在总页码大于2的情况下,才输出分页HTML代码
if ($totalCount > $numPerPage)
{
$realpages = ceil($totalCount / $numPerPage);
//算出总页码数
$pages = ($this->maxPages < $realpages)?$this->maxPages:$realpages;
//如果总页码数小于页码长度,起始页码从1开始,末页就是总页码数
if ($this->page > $pages)
{
$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; //www.sunqingli.cn
}
}
elseif ($to > $pages)
{
$from = $pages - $this->page + 1;
$to = $pages;
}
}
//开始输出分页HTML代码 www.sunqingli.cn
if ($currentPage - $this->offSet > 1 && $pages > $this->page)
{
//满足条件1:如果当前页码减去偏移量大于1,例如偏移量是2,例如当前页码是5,5-2=3>1;
//满足条件2:如果总页码数大于构造函数中的配置数,即可以显示省略号
//构建出的HTML代码就是先显示第一页,然后显示省略号
if ($this->projectType == 'sf')
{
$outPageHTML .= ''.link_to('1',$pageUrl.'page=1').'...';
}
else
{
$outPageHTML .= '1...';
}
}
if ($currentPage > 1)
{
//如果当前页码不是第一页,那么构造出来的HTML代码应该包含一个“上一页”的链接
if ($this->projectType == 'sf')
{
$outPageHTML .= ''.link_to('上一页',$pageUrl.'page='.($currentPage - 1)).'';
}
else
{
$outPageHTML .= '上一页';
}
}
//根据上面起始页数和结束页数,构建分页HTML代码
for($i = $from; $i < = $to; $i++)
{
if ($this->projectType == 'sf')
{
$outPageHTML .= ($i == $currentPage) ? ''.$currentPage.'' :''.link_to($i,$pageUrl.'page='.$i).'';
}
else
{
$outPageHTML .= ($i == $currentPage) ? ''.$currentPage.'' :''.$i.'';
}
}
//当前页不是最后一页,显示一个“下一页”链接,www.sunqingli.cn
//末页数小于总页数,显示省略号然后再显示最后一页的链接。
if ($this->projectType == 'sf')
{
if ($currentPage < $pages)
{
$outPageHTML .= ''.link_to('下一页',$pageUrl.'page='.($currentPage + 1)).'';
}
if ($to < $pages)
{
$outPageHTML .= '...'.link_to($pages,$pageUrl.'page='.$pages).'';
}
}
else
{
if ($currentPage < $pages)
{
$outPageHTML .= '下一页';
}
//www.sunqingli.cn
if ($to < $pages)
{
$outPageHTML .= '...'.$pages.'';
}
}
}
return $outPageHTML;
}
}
?> |
下面是使用上述类的例子:
< ?php /******** 例子 ********/ $page = new page(); $page->totalCount = 100; $page->numPerPage = 5; $page->currentPage = 9; $page->pageUrl = 'index.php'; echo $page->generatePage(); /***************************/ ?> |
更多Uchome的文章参见:
Comments