我改写的24个分页函数,请大家看看
发布于:2022-01-17 09:50:54
#1 azwl
这个是修改过的函数,样子如下:
spAddViewFunction('pager', '__template_pager');
function __template_pager($params){
if(!isset($params['pager']) || empty($params['pager']))return '';
$args = array();
foreach($params as $k => $v)if(!in_array($k, array('c', 'a', 'pager', 'myclass', 'mypage')))$args[$k] = $v;
$pagerhandle = isset($params['pager']['mypage']) ? $params['pager']['mypage'] : 'p';
$html = "";
$curpage = $params['pager']['current_page'];
$totalpage = $params['pager']['total_page'];
if($curpage != $params['pager']['first_page']){
$url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $params['pager']['first_page']));
$html .= "
首页";
}
if($curpage != $params['pager']['prev_page']){
$url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $params['pager']['prev_page']));
$html .= "
前页";
}
$startpage = 1;
$endpage = 9;
if ($curpage > 4){
$startpage = $curpage-4;
$endpage = $curpage + 4;
}
if ($endpage > $totalpage){
$startpage = $totalpage-8;
$endpage = $totalpage;
}
if ($startpage < 1) $startpage = 1;
for($p = $startpage;$p <= $endpage;$p++){
if($p == $curpage){
$html .= "
{$p}";
}else{
$url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $p));
$html .= "
{$p}";
}
}
if($curpage != $params['pager']['next_page']){
$url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $params['pager']['next_page']));
$html .= "
下页";
}
if($curpage != $params['pager']['last_page']){
$url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $params['pager']['last_page']));
$html .= "
末页";
}
$html .= '
';
return $html;
}
?>
2010-06-30 18:11:09
#2 hkbaby
我也写了个分页大家看看
class page extends spModel
{
function pageturn($pager,$location)
{
//$location 要跳转的页面 ||$pager 调用时从数据库读出的页码
//dump($pager);
$pagesize = $pager[page_size]; //页容量
$pagecode = ''; //定义变量,存放分页生成的HTML
$page = $pager[current_page]; // 起始页(当前页)
$total = $pager[total_count]; //总条数
if(!$total) return array(); //总记录数为零返回空数组
$totalpage = $pager[total_page]; //总分页
//处理页码合法性
if($page < 1) $page = 1;
if($page > $totalpage) $page = $totalpage;
//计算查询偏移量
$offset = $pagesize*($page-1);
//页码范围计算
$init = 1;//起始页码数
$max = $totalpage;//结束页码数
$pagelen = 10; //当前应显示页码个数
$pageoffset = ceil(($pagelen-1)/2);//页码个数左右偏移量
//生成html
$pagecode='';
//如果是第一页,则不显示第一页和上一页的连接
if($page!=1)
{
$pagecode.="
首页 ";//第一页
$pagecode.="
上一页 ";//上一页
}
//分页数大于页码个数时可以偏移
if($totalpage > $pagelen)
{
//如果当前页小于等于左偏移
if($page <= $pageoffset)
{
$init = 1;
$max = $pagelen;
}
else
{//如果当前页大于左偏移
//如果当前页码右偏移超出最大分页数
if($page+$pageoffset >= $totalpage+1)
$init = $totalpage-$pagelen+1;
else
{
//左右偏移都存在时的计算
$init = $page-$pageoffset;
$max = $page+$pageoffset;
}
}
}
//生成html
for($i = $init;$i <= $max;$i++)
{
if($i == $page)
$pagecode.= '
'.$i.'';
else
$pagecode.= "
$i";
}
//显示下一页和尾页
if($page!=$totalpage)
{
$pagecode.= "
下一页 ";//下一页
$pagecode.= "
尾页 ";//最后一页
}
//显示当前第几页和一共有多少页
$pagecode.="
共".$pager[total_count]." 条记录".",";
$pagecode.= "
当前第".$page."页".",";
$pagecode.= "
共".$pager[total_page]."页";
$pagecode.= "
(每页".$pager[page_size]."条记录)";
$pagecode.= '
';
return $pagecode;
}
}
?>
2010-07-01 08:24:44
#3 凌风
你这个很不利于PHP代码与HTML代码的分离呀,共用性能不高。
2010-07-04 22:06:00
#4 hkbaby
这个是php代码与html代码分离的,在代码页实例化page类,然后调用pageturn这个函数就OK了, 在模板页替换就行了
2010-07-05 08:46:45
#5 azwl
回复 4 hkbaby 我觉得继承于spModel不是很合适,应该继承于spPager。
关于这个问题我向jake问过
http://speedphp.com/bbs/thread-697-1-2.html既然是框架就像语言一样,还是不可能满足用户所有的要求,所以如果用户扩展了系统的的功能(譬如spPager),还可以使用原来的语法,我觉得更能体现OOP的思想。
2010-07-05 20:24:00
#6 hkbaby
那有没有更好的例子,代码与html分开的分页写法 要实现左右偏移的{:3_48:}
2010-07-06 09:24:59
#7 jake
直接在模板的函数内进行修改即可,其实所谓的“左右偏移”非常的简单,只要在我原来的__template_pager函数内,在
foreach( $params['pager']['all_pages'] as $p ){
if( $p == $params['pager']['current_page'] ){
$html .= "{$p}";
}else{
$url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $p));
$html .= "{$p}";
}
}
中再加上一个判断,就可以令页码可以聚焦在当前页的附近,而不会显示比当前页远的页码了。比如说:
$offset = $params['offset'] ? $params['offset'] : 3; // 可以在<{pager}>内用offset=x来调整
foreach( $params['pager']['all_pages'] as $p ){
if( $p == $params['pager']['current_page'] ){
$html .= "{$p}";
}else{
if( ($params['pager']['current_page'] < $offset && $p < $offset ) ||
($params['pager']['current_page'] > $params['pager']['last_page'] - $offset && $p > $params['pager']['last_page'] - $offset ) ||
( $p < $params['pager']['current_page'] + $offset && $p > $params['pager']['current_page'] - $offset )
){
$url = spUrl($params['c'], $params['a'], $args + array($pagerhandle => $p));
$html .= "{$p}";
}
}
}
2010-07-06 10:04:03
#8 jake
if( ($params['pager']['current_page'] < $offset && $p < $offset ) ||
($params['pager']['current_page'] > $params['pager']['last_page'] - $offset && $p > $params['pager']['last_page'] - $offset ) ||
( $p < $params['pager']['current_page'] + $offset && $p > $params['pager']['current_page'] - $offset )
)
判断:页码是否在左侧 or 页面是否在中间和在offset范围内 or 页码是否在右侧
2010-07-06 10:05:45
#9 hkbaby
哦 好的 {:2_31:}
2010-07-06 10:28:31
#10 hkbaby
functions.php这文件是不是放在
require(SP_PATH."/SpeedPHP.php");
require(SP_PATH."/functions.php");
这里的吗?
$this->results = spClass('某表')->spPager($this->spArgs('p',1),2)->findAll();
$this->pager = spClass('某表')->spPager()->getPager();
那样式不出来,是不是我的路径放错了? jake大哥指点下
2010-07-06 11:15:55
#11 汽车人变形
谢谢大家分享,这帖子太有用了。
2011-10-14 16:30:20
#12 w_x_h521
学习了!收藏
2014-01-14 16:06:59