zoukankan      html  css  js  c++  java
  • discuz分页函数的分析

    discuz的分页函数

    这个分页函数是discuz中的,感觉这个分页函数相当经典,而且看到好多其他程序的分页效果也是用的这个函数。读完这个分页函数后给我的感觉是这个分页 函数做的太全面了,作者考虑的太全面了,在用的同时也给我们写程序树立了个榜样,multi这个函数确实被很多程序用到。而且Discuz!的很多处理机 制也被很多程序作者引用了。
    下面请看blankyao分析的Discuz!分页函数代码:复制PHP内容到剪贴板PHP代码://先看下几个参数吧    
    //$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 + 1 - $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 > 1 && $pages > $page ? '<a href="'.$mpurl.'page=1" class="first"'.$ajaxtarget.'>1 ...</a>' :'').    
    ($curpage > 1 && !$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"   /></kbd>' : '');    

    $multipage = $multipage ? '<div class="pages">'.(!$simple ? '<em> '.$num.' </em>' : '').$multipage.'</div>' : '';    
    }    
    $maxpage = $realpages;    
    return $multipage;    
    }

     

    函数:

     

     

     

    function multi($num, $perpage, $curpage, $mpurl) {

            $multipage = '';

            $mpurl .= strpos($mpurl, '?') ? '&amp;' : '?';

            if($num > $perpage) {

                    $page = 10;

                    $offset = 5;

                    $pages = @ceil($num / $perpage);

                    if($page > $pages) {

                            $from = 1;

                            $to = $pages;

                    } else {

                            $from = $curpage - $offset;

                            $to = $curpage + $page - $offset - 1;

                            if($from < 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;

                                    }

                            }

                    }

     

                    $multipage = ($curpage - $offset > 1 && $pages > $page ? '<a href="'.$mpurl.'page=1">第一页</a> ' : '').($curpage > 1 ? '<a href="'.$mpurl.'page='.($curpage - 1).'">上一页</a> ' : '');

                    for($i = $from; $i <= $to; $i++) {

                            $multipage .= $i == $curpage ? $i.' ' : '<a href="'.$mpurl.'page='.$i.'">['.$i.']</a> ';

                    }

                    $multipage .= ($curpage < $pages ? '<a href="'.$mpurl.'page='.($curpage + 1).'">下一页</a>' : '').($to < $pages ? ' <a href="'.$mpurl.'page='.$pages.'">最后一页</a>' : '');

                    $multipage = $multipage ? '共'.$pages.'页: '.$multipage : '';

            }

            return $multipage;

    }

     

     

     

     

    用法:

    $pagesize = 10;   // 每页记录数

    $query = mysql_query("SELECT count(*) FROM table");

    $row = mysql_fetch_array($query);

    $amount = $row[0];   // 查询记录总数

    $pagecount = $amount ? (($amount < $pagesize) ? 1 : (($amount % $pagesize) ? ((int)($amount / $pagesize) + 1) : ($amount / $pagesize))) : 0;   // 计算总页数

    $page = !empty($_GET['page']) ? max(1, intval($_GET['page'])) : 1;

    $page = $page > $pagecount ? 1 : $page;   // 取得当前页值

    $startlimit = ($page - 1) * $pagesize;   // 查询起始的偏移量

    $result=mysql_query("SELECT * FROM table order by id desc LIMIT {$startlimit}, {$pagesize}");   // 查询记录集

     

    while( $row = mysql_fetch_array($result) )

    {

    //你要显示的格式。

    }

     

    输出分页:

    $multipage = multi($amount, $pagesize, $page, 'index.php?action=listadmin');   // 显示分页

    echo $multipage;

  • 相关阅读:
    SpringBoot系列之切换log4j日志框架
    SpringBoot系列之日志框架使用教程
    SpringBoot系列之集成logback实现日志打印(篇二)
    源码学习系列之SpringBoot自动配置(篇二)
    SpringBoot系列之@Conditional注解用法简介
    7.Maven命令
    6.Maven构建过程的各个环节
    5.Maven坐标
    4.用IntelliJ IDEA 创建Maven Web
    3.用IntelliJ IDEA 创建Maven
  • 原文地址:https://www.cnblogs.com/codelifewangwen/p/2986360.html
Copyright © 2011-2022 走看看