关于分页,我认为程序员该做的是把页码交出来就行了,样式之类的交给美工去做。
一个函数足矣。
即简单,又方便加样式。
<?php
/*
函数: Pager
作者: Sam Teng <[email]samteng@live.com[/email]>
作用:通过记录总数,每页显示数取得offset,总页数,前一页与后一页以及分页纯数字的页数数组,不带任何链接
返回值: 数组
$aPageDatas['offset'] offset
$aPageDatas['thispage'] 当前页
$aPageDatas['maxpage'] 总页数
$aPageDatas['prepage'] 上一页
$aPageDatas['nextpage'] 下一页
$aPageDatas['pagebar'] 分页数组
$aPageDatas['pregroup'] 上一组页码
$aPageDatas['nextgroup'] 下一组页码
$aPageDatas['querystring'] QUERY_STRING
参数说明:
$intTotal 记录总数
$intShowNum 每页显示数
$intDistance 分页数组最大最小值与当前页的差值,当0或false的时候,不构建分页数组
$strPageVar 分页变量名,在地址档中如abc.php?page=123,即是page,默认是'page'
$bGetQueryString 是否读取Query String, 默认读取
*/
function Pager ( $intTotal , $intShowNum , $intDistance = 5 , $strPageVar = 'page' , $bGetQueryString = true )
{
$aPageDatas = array() ;
( $intThisPage = intval( $_REQUEST[$strPageVar] ) ) > 1 ? $aPageDatas[thispage] = $intThisPage : $aPageDatas[thispage] = $intThisPage = 1 ;
if ( $intTotal < 1 || $intShowNum < 1 )
{
$intOffset = 0 ;
$aPageDatas[maxpage] = $aPageDatas[prepage] = $aPageDatas[nextpage] = 1 ;
return $aPageDatas ;
}
$aPageDatas[offset] = $intShowNum * ( $intThisPage - 1 ) ;
$aPageDatas[maxpage] = ceil ( $intTotal / $intShowNum ) ;
$aPageDatas[prepage] = $intThisPage < 2 ? 1 : $intThisPage - 1 ;
$aPageDatas[nextpage] = $intThisPage == $aPageDatas[maxpage] ? $aPageDatas[maxpage] : $intThisPage + 1 ;
if ( $intDistance )
{
$arrPageBar = array() ;
$intSPage = ( $intThisPage - $intDistance ) < 1 ? 1 : ( $intThisPage - $intDistance ) ;
$intEPage = ( $intThisPage + $intDistance ) > $aPageDatas[maxpage] ? $aPageDatas[maxpage] : ( $intThisPage + $intDistance ) ;
$arrPageBar = array ( ) ;
for ( $i = $intSPage ; $i <= $intEPage ; $i++ )
{
$arrPageBar[] = $i ;
}
$aPageDatas[pagebar] = $arrPageBar ;
$aPageDatas[pregroup] = $intThisPage > ( $intDistance + 1 ) ? $intThisPage - ( $intDistance + 1 ) : 0 ;
$aPageDatas[nextgroup] = $intThisPage < ( $aPageDatas[maxpage] - 1 - $intDistance ) ? $intThisPage + $intDistance + 1 : $aPageDatas[maxpage] ;
}
if ( $bGetQueryString )
{
$strPagepattern = '/('.$strPageVar.'=d{0,})/' ;
preg_match_all( $strPagepattern, $_SERVER["QUERY_STRING"] , $arrResult );
$strQueryString = $arrResult[1][0] ? str_replace( "&".$arrResult[1][0] , "" , $_SERVER["QUERY_STRING"] ) : $_SERVER["QUERY_STRING"];
$strQueryString = str_replace( $arrResult[1][0] , "" , $strQueryString ) ;
if ( $strQueryString ) $aPageDatas[querystring] = $strQueryString . '&';
}
return $aPageDatas ;
}
?>
用法1 如果你习惯用page做变量,这样就可以了:
<?php
$intCount = 1000 ; //用你的办法取得记录总数,这里假设是1000
$intShowNum = 5 ; // 每页显示5个记录
$arrPageDatas = Pager ( $intCount , $intShowNum ) ;
$intOffset = $arrPageDatas['offset'] ;//Mysql常用的offset就可以这样取得了:
?>
用法2 如果你想用自己定义的变量,比如用'pnum',那就这样:
<?php
$arrPageDatas = Pager ( $intCount , $intShowNum , 5 , 'pnum' ) ;
?>
用法3 如果你认为不需要分页数组,可以省资愿,那就这样:
<?php
$arrPageDatas = Pager ( $intCount , $intShowNum , 0 ) ;
?>
用法4 如果你想改变分页码长度,那就这样:
<?php
// 这大概会出现30个页码
$arrPageDatas = Pager ( $intCount , $intShowNum , 15) ;
?>
用法5 如果你想自行设置Query String,那就这样:
<?php
$arrPageDatas = Pager ( $intCount , $intShowNum , 5 , 'page' , false ) ;
?>
那么你就可以在分页条里的链接自己设置变量了,比如(在模板里):
<?php
<a href="?abc=123&bcd=456&page={$prepage}">上一页</a>
?>
如果你不太记得返回的是什么东西,那可以这样:
<?php
$arrPageDatas = Pager ( $intCount , $intShowNum ) ;
//别告诉我prepage,nextpage,pagebar之类的分别代表什么也不知道
print_r( $arrPageDatas ) ;
?>
上面的都是程序里的处理,得到了分页的数字,那就要在模板里工作了。
总页数 显示及链接:
<?php
总页数:<a href="?{$querystring}page={$maxpage}">{$maxpage}</a>
?>
首页(第一页):
<?php
<a href="?{$querystring}page=1">首页</a>
?>
上一组页码,这里用'[...]',你可以改为自己想要的方式
<?php
{if $pregroup} <a href="?{$querystring}page={$pregroup}">[...]</a>{/if}
?>
上一页
<?php
<a href="?{$querystring}page={$prepage}">上一页</a>
?>
打印分页数组,并把当前页设为斜体(你可以改为自己想要的样式):
<?php
{loop $pagebar}
{if $thispage == $pagebar}
<a href="?{$querystring}page={$pagebar}"><b><i>{$pagebar}</i></b></a>
{else}
<a href="?{$querystring}page={$pagebar}">{$pagebar}</a>
{/if}
{/loop}
?>
当然,如果你是分页狂,分页数组达到几十个,按上面的方式是有点浪费资源的,你可以这样:
<?php
{loop $pagebar}
<a href="?{$querystring}page={$pagebar}"><span id='pn{$pagebar}'>{$pagebar}</span></a>
{/loop}
<script>
// 当前页突出效果
var ThisPN = document.getElementById( 'pn' + {$thispage}) ;
ThisPN.innerHTML = '<b><i{$thispage}</i></b>' ;
</script>
?>
下一组页码
<?php
{if $nextgroup< $maxpage }<a href="?{$querystring}page={$nextgroup}">[...]</a>{/if}
?>
下一页
<?php
<a href="?{$querystring}page={$nextpage}">下一页</a>
?>
跳转按扭
<?php
<input id="pageinput" type='text' size=3 name="page">
<input type="button" name="topage" value="GO" onclick="var pinput = document.getElementById('pageinput'); if (pinput.value)window.location='{$querystring}page='+pinput.value;">
?>
看附件吧。累。。。
细细去体会,希望对你有用。
[ 本帖最后由 三不像 于 2008-5-13 04:11 PM 编辑 ]