Discuz的分页函数multi

发布人:blankyao  时间:2007-10-26 23:16  来源: 本站原创  查看: 967次   TAG: Discuz  multi  分页函数 

这个分页函数是discuz中的,感觉这个分页函数相当经典,而且看到好多其他程序的分页效果也是用的这个函数。读完这个分页函数后给我的感觉是这个分页函数做的太全面了,作者考虑的太全面了,在用的同时也给我们写程序树立了个榜样,multi这个函数确实被很多程序用到。而且Discuz!的很多处理机制也被很多程序作者引用了。


下面请看blankyao分析的Discuz!分页函数代码:


//先看下几个参数吧    
//$num 为总共的条数  比如说这个分类下共有15篇文章    
// $perpage为每页要显示的条数    
//$curpage为当前的页数    
//$mpurl为url的除去表示页数变量的一部分,    
//$page为$multipage这个字符串中要显示的表示页数的变量个数    
//$maxpages为最大的页数值  此函数最后有一句$maxpage = $realpages;    
function multi($num$perpage$curpage$mpurl$maxpages 0$page 10$autogoto TRUE$simple FALSE
) {    
    global 
$maxpage
;    
    
$ajaxtarget = !emptyempty($_GET['ajaxtarget']) ? " ajaxtarget=\"".dhtmlspecialchars($_GET['ajaxtarget'])."\" " ''
;    
   
    
$multipage ''
;    
    
$mpurl .= strpos($mpurl'?') ? '&' '?'
;    
    
$realpages 1
;    
     
//判断总条数是否大于设置的每页要显示的条数    
    
if($num $perpage
) {    
    
//设置在$multipage中当前页数之前还要输出几个页数    
        
$offset 2
;    
   
        
$realpages = @ceil($num $perpage
);    
    
//总共的页数(不知道$maxpages的意思),这里假设是15条    
        
$pages $maxpages && $maxpages $realpages $maxpages $realpages
;    
    
//如果总页数小于multipage中要输出的页数$page,则只输出到实际页数为止      
        
if($page $pages
) {    
            
$from 1
;    
            
$to $pages
;    
    
//如果大于的话,就要输出$page个页数(我们假设的的15条就符合这个条件)    
        
} else {    
            
$from $curpage $offset
;    
            
$to $from $page 1
;    
            
//假设curpage为4,目前为止,from为2,to为11    
            //下面假设curpage为1    
          
            
if($from 1
) {    
                
$to $curpage $from;****不明白***
)    
                $from 
1
;    
                
//目前为止from为1,to为3    
                
if($to $from $page
) {    
                    
//因为这里的前提条件是总条数大于page,所以,如果$to-$from小于page的话显然达不到目的,应把$to设置为$page    
                    
$to $page
;    
                }
//目前为止 from为1 ,to为10    
            
} elseif($to $pages) {
//to是不可以大于总页数的    
                
$from $pages $page 1
;    
                
$to $pages
;    
            }    
          
        }    
   
        
$multipage = ($curpage $offset && $pages $page '<a href="'.$mpurl.'page=1" class="first"'.$ajaxtarget.'>1 ...</a>' ''
).    
            (
$curpage && !$simple '<a href="'.$mpurl.'page='.($curpage 1).'" class="prev"'.$ajaxtarget.'>&#8249;&#8249;</a>' ''
);    
        for(
$i $from$i <= $to$i
++) {    
            
$multipage .= $i == $curpage '<strong>'.$i.'</strong>' 
:    
                
'<a href="'.$mpurl.'page='.$i.($ajaxtarget && $i == $pages && $autogoto '#' '').'"'.$ajaxtarget.'>'.$i.'</a>'
;    
        }    
   
        
$multipage .= ($curpage $pages && !$simple '<a href="'.$mpurl.'page='.($curpage 1).'" class="next"'.$ajaxtarget.'>&#8250;&#8250;</a>' ''
).    
            (
$to $pages '<a href="'.$mpurl.'page='.$pages.'" class="last"'.$ajaxtarget.'>... '.$realpages.'</a>' ''
).    
            (!
$simple && $pages $page && !$ajaxtarget '<kbd><input type="text" name="custompage" size="3" onkeydown="if(event.keyCode==13) {window.location=\''.$mpurl.'page=\'+this.value; return false;}" /></kbd>' ''
);    
   
        
$multipage $multipage '<div class="pages">'.(!$simple '<em> '.$num.' </em>' '').$multipage.'</div>' ''
;    
    }    
    
$maxpage $realpages
;    
    return 
$multipage
;    
}


大家也可以顺便看下我自己修改自Discuz!的分页函数,实际上也就没修改什么,就是修改了个输出的html代码。:)


if($num $perpage) {
    
$page 11
;
    
$offset 5
;

    
$realpages = @ceil($num $perpage
);
    
$pages $maxpages && $maxpages $realpages $maxpages $realpages
;

    if(
$page $pages
) {
        
$from 1
;
        
$to $pages
;
    } else {
        
$from $curpage $offset
;
        
$to $from $page 1
;
        if(
$from 1
) {
            
$to $curpage $from
;
            
$from 1
;
            if(
$to $from $page
) {
                
$to $page
;
            }
        } elseif(
$to $pages
) {
            
$from $pages $page 1
;
            
$to $pages
;
        }
    }
        
$multipage['left'] = $curpage '<a href="'.$mpurl.($curpage 1).'.html">上一页</a> ' ''
;
        
$multipage['right'] = ''
;
    for(
$i $from$i <= $to$i
++) {
        
$multipage['left'] .= $i $curpage '<a href="'.$mpurl.$i.'.html">'.$i.'</a> ' ''
;
        
$multipage['right'] .= $i $curpage '<a href="'.$mpurl.$i.'.html">'.$i.'</a> ' ''
;
    }

        
$multipage['right'] .= $curpage $realpages '<a href="'.$mpurl.($curpage 1).'.html">下一页</a> ' ''
;
}


$multipage['left']和$multipage['right']是分别放在左右两边的,个人自我感觉良好。


更新下,下面是从网上找的分析段落:
$from   =   $curpage   -   $offset;     //新的开始页码   
  
$to   =   $curpage   +   $page   -   $offset   -   1;   //新的结束页码   
  
if($from   <   1)   {     //如果新的开始页码小于1   ,则新的开始页码为1,结束页码后移,保持从开始到结束有一个固定页码数   
      
$to   =   $curpage   +   1   -   $from;   
      
$from   =   1;             
      if((
$to   -   $from)   <   $page   &&   ($to   -   $from)   <   $pages)   {   
            
to   =   $page;     //   如果从开始到结束的页码数小于一定量,重新给结束页赋值   
      
}   
  }   elseif(
$to   >   $pages)   {   //如果结束页大于最大页码,结束为最大页码,开始页码前移   
      
$from   =   $curpage   -   $pages   +   $to;   
      
$to   =   $pages;   
      if((
$to   -   $from)   <   $page   &&   ($to   -   $from)   <   $pages)   {   
            
$from   =   $pages   -   $page   +   1;   如果从开始到结束的页码数小于一定量,重新给开始页赋值   
  
}


下面还有一段


if($from   <   1){   
      
$to   =   $curpage   +   1   -   $from;   //重点这句   
      //这里的$from=$curpage   -   $offset   
      //$to为什么要等于$curpage   +   1   -   $from   呢?   
      //这里的$to的值永远是$offset+1   
      //为什么不直接给$to一个常量或什么呢?   
  
}   
  if(
$to   >   $pages){   
      
$from   =   $curpage   -   $totalpage   +   $to;//重点这句   
      //这句话就彻底没弄明白。。当前页   -   总页数   +     $to   
      //这里的$to=   $curpage(当前页)   +   $page   -   $offset   -   1   
  
}


欢迎大家就此去论坛讨论Discuz!分页函数

本月热门