喜悦国际村 
» 游客:  注册 | 登录 | 搜索 | 统计 | 喜悦证交所 | 帮助

RSS 订阅当前论坛  

[北京]代朋友公司招聘PHP高级程序员多名

上一主题 下一主题
     
标题: [原创] 一个分页函数  
 
三不像
新手上路
Rank: 1



UID 123064
精华 0
积分 3
帖子 1
金钱 3 喜悦币
威望 0
人脉 0
阅读权限 10
注册 2008-5-13
状态 离线
一个分页函数

关于分页,我认为程序员该做的是把页码交出来就行了,样式之类的交给美工去做。
一个函数足矣。
即简单,又方便加样式。

<?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 $strPageVar 'page' ,  $bGetQueryString true )
{
    
$aPageDatas = array() ;
    ( 
$intThisPage intval$_REQUEST[$strPageVar] ) ) > $aPageDatas[thispage] = $intThisPage $aPageDatas[thispage] = $intThisPage ;
    if ( 
$intTotal || $intShowNum )
    {
        
$intOffset   ;
        
$aPageDatas[maxpage]  = $aPageDatas[prepage] = $aPageDatas[nextpage] = ;
        return 
$aPageDatas ;
    }
    
$aPageDatas[offset]   = $intShowNum * ( $intThisPage ) ; 
    
$aPageDatas[maxpage]  = ceil $intTotal $intShowNum ) ;
    
$aPageDatas[prepage]  = $intThisPage $intThisPage ;
    
$aPageDatas[nextpage] = $intThisPage == $aPageDatas[maxpage] ? $aPageDatas[maxpage]  : $intThisPage ;
    if ( 
$intDistance 
    {
        
$arrPageBar = array() ;
        
$intSPage = ( $intThisPage $intDistance ) < : ( $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 ) ? $intThisPage - ( $intDistance ) : ;
        
$aPageDatas[nextgroup] = $intThisPage < ( $aPageDatas[maxpage] - $intDistance ) ? $intThisPage $intDistance $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个记录
$arrPageDatas Pager $intCount $intShowNum ) ;
$intOffset $arrPageDatas['offset'] ;//Mysql常用的offset就可以这样取得了:
?>
用法2    如果你想用自己定义的变量,比如用'pnum',那就这样:

<?php
$arrPageDatas 
Pager $intCount $intShowNum 'pnum' ) ;
?>
用法3    如果你认为不需要分页数组,可以省资愿,那就这样:

<?php
$arrPageDatas 
Pager $intCount $intShowNum ) ;
?>
用法4    如果你想改变分页码长度,那就这样:

<?php
// 这大概会出现30个页码
$arrPageDatas Pager $intCount $intShowNum 15) ;
?>
用法5    如果你想自行设置Query String,那就这样:

<?php
$arrPageDatas 
Pager $intCount $intShowNum '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 编辑 ]


 附件: 您所在的用户组无法下载或查看附件
2008-5-13 04:09 PM#1
查看资料  发短消息  顶部
     


  可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题 | 开通个人空间  


 




Powered by Discuz! 6.1.0  © 2001-2010 Comsenz Inc.
Processed in 0.038462 second(s), 6 queries

(冀ICP备05009913号) 管理员:sadly 邮箱/MSN: sadly@phpx.com QQ:824008(长隐) 清除 Cookies - - Archiver - WAP