开发WEB程序,最常见的页面之一就是列表页,而列表页中一定会有分页导航的功能,我们当然可以在页面中直接插入PHP代码,运算相关的信息,例如页数,总记录数,总页数,根据当前页的不同,可能显示的内容及样式都有所不同,这样做是达到目的了,可是带来的极大弊端有三点:1、代码的可读性大大降低;2、页面夹杂着这一大段运算分页逻辑的代码,以后代码维护的难度大大提高了;3、当多个列表页面用到这一分页导航时,无共用性。ps一句:本人写代码有两点原则:1、绝不做重复劳动,逻辑一样的功能块一定要单独隔离出来;2、做一件事最多只能第一次痛苦一下,再做这件事时一定不会再痛苦(因为在这期间我肯定要想出个办法解决让我痛苦的问题)。为此,我写了如下的分页导航处理类(PHP5):
/* 分页样式类的父类 */
class SplitStyle
{
public $Page; // 当前页数
public $RecsPerPage; // 每页记录数
public $CountOfRows; // 总记录数
public $CountOfPages; // 总页数
public $QueryUrl; // 带查询字符串的URL
/* 构造函数 */
function __construct($page, $recsPerPage, $countOfRows, $countOfPages, $queryUrl)
{
$this->Page = $page;
$this->RecsPerPage = $recsPerPage;
$this->CountOfRows = $countOfRows;
$this->CountOfPages = $countOfPages;
$this->QueryUrl = $queryUrl;
}
/* 运算相关分页信息 */
protected function OperateInfo()
{
/* 当前页数排错 */
if ($this->Page < 1)
$this->Page = 1;
if ($this->Page > $this->CountOfPages)
$this->Page = $this->CountOfPages;
}
/**
* 获取分页链接
* @index(int) 页数索引
* 返回分页链接URL(string)
*/
protected function GetHerf($index)
{
return $this->QueryUrl . "page=" . $index;
}
}
/* 常用分页样式类 */
class SplitStyleCommon extends SplitStyle
{
/* 输出分页HTML结果 */
public function OutputResult()
{
$this->OperateInfo(); // 运算相关分页信息
$result = ""; // 要输出的结果
/* 起始数字 */
$start = floor($this->Page / 10) * 10;
if ($start == 0)
$start = 1;
/* 结尾数字 */
if ($this->Page % 10 == 0)
$end = (ceil($this->Page / 10) + 1) * 10;
else
$end = ceil($this->Page / 10) * 10;
/* 结尾数字不能大于总页数 */
if ($end > $this->CountOfPages)
$end = $this->CountOfPages;
for ($i = $start; $i <= $end; $i++)
{
if ($i == $this->Page)
$result .= '<span>' . $i . '</span> ';
else
$result .= '<a href="' . $this->GetHerf($i) . '">' . $i . '</a> ';
}
echo $result;
}
}
说明:第一个类准备了最常见的分页信息,第二个类为扩展类,里面的OutputResult成员方法(这里省略了诸如每页记录数,总记录数,总页数的信息,这里强调的是分页逻辑)实现了一种很常见的数字分页(首次显示1到10页,点第10页则显示10到20页,以此类推),当分页逻辑或HTML结构不同时,很显然还可以再增加一个子类(假设它实现的是像Google那样的分页形式)。这样,我们在列表页中就只需调用该类就可以了,而具体的逻辑就由类去内部实现了。