解决方案 »

  1.   

    转一个Laruence博客里的首先,要获取总页面数是多少:$total_page = ceil($total/$page_size);这样的写法是不是更简单一些呢?
    其次,我是这样想的, 这个需求最高的需求是要根据当前的页码,找出size个页码数来。
    那么就可以转化为: 根据当前的信息, 填充一个size个元素的数组。
    最终就可以简单的转化为:根据当前的信息,寻找出size个元素的数组的起始元素是什么?我们假设这个起始元素是:page_start;$page_start = 1;
    $half       = intval($size/2);
    $page_start = max(1, $page - $half);
    $page_end   = min($page_start + $size - 1, $total_page);
    $page_start = max(1, $page_end - $size + 1);这样写,是不是也很有技巧呢?最后就简单了, 根据起始页和结束页, 生成一个数组, 最后foreach这个数组,生成html代码:$page_numbers = range($page_start, $page_end);
    $nav_str = "";
    foreach($page_numbers as $num){
          //.......
    }源码:/**
     *A pagination generation class
     *@class  : Pagination
     *@version: 1.0.0
     *@author : huixinchen at baidu.com
     *@useage:
     *      $pagi                   =  new Pagination($url_prefix, $page_size, $mesgs_count, $pagination_size=10, array $conf);
     *  $navigation_str = $pagi->generate($current_page_number);
     */
    class Pagination{
            private $page, $total_page, $total, $page_size, $size;
            private $prev_str = "&lt", $next_str = "&gt";
            private $class, $selected_class = "selected", $prev_class="prev", $next_class="next",
                    $de_prev_class="de_prev", $de_next_class="de_next";
            private $url_prefix="", $split_char="?";
            private $para_name = "page", $target = "";
            public function Pagination($url_prefix, $page_size, $total, $size=10, $conf=array()){
                    $this->page       = 1;
                    $this->page_size  = $page_size;
                    $this->total      = $total;
                    $this->total_page = intval(ceil($total/$page_size));
                    $this->size               = $size;
                    if(!empty($conf)){
                            $configure = array("prev_str", "next_str", "class", "selected_class");
                            foreach($conf as $key => $val){
                                    if(in_array($key, $configure)){
                                            $this->$val = $val;
                                    }
                            }
                    }
                    $this->url_prefix = $url_prefix;
                    if(strstr($url_prefix, '?') !== false){
                            $this->url_prefix .= "&" . $this->para_name . "=";
                    }else{
                            $this->url_prefix .= "?" . $this->para_name . "=";
                    }
            }
     
            public function generate($page){
                    $this->page = $page;
                    if(isset($this->page[$page])){
                            return $this->page_str[$page];
                    }
                    $page_start = 1;
                    $half           = intval($this->size/2);
                    $page_start = max(1, $page - $half);
                    $page_end       = min($page_start + $this->size - 1, $this->total_page);
                    $page_start = max(1, $page_end - $this->size + 1);
     
                    $this->page_str[$page] = $this->build_nav_str($page_start, $page_end);
                    return $this->page_str[$page];
            }
     
            private function build_nav_str($page_start, $page_end){
                    $page_nums = range($page_start, $page_end);
                    $target    = $this->target? " target=\"{$this->target}\"" : "";
                    if($this->page == 1){
                            $page_str = <<<HTML
                            <span class="{$this->de_prev_class}"> {$this->prev_str} </span>
    HTML;
                    }else{
                            $page     = $this->page - 1;
                            $page_str = <<<HTML
                            <span class="{$this->prev_class}"> <a href="{$this->url_prefix}{$page}"{$this->target}>{$this->prev_str}</a></span>
    HTML;
                    }
                    foreach($page_nums as $p){
                            $page_str .= ($p == $this->page) ? <<<HTML
                            <span class="{$this->selected_class}">{$p}</span>
    HTML
                            : <<<HTML
                            <span class="{$this->class}"><a href="{$this->url_prefix}{$p}"{$this->target}>{$p}</a></span>
    HTML;
     
                    }
                    if($this->page == $this->total_page){
                            $page_str .= <<<HTML
                            <span class="{$this->de_next_class}"> {$this->next_str} </span>
    HTML;
                    }else{
                            $page      = $this->page + 1;
                            $page_str .= <<<HTML
                            <span class="{$this->next_class}"> <a href="{$this->url_prefix}{$page}"{$this->target}>{$this->next_str}</a></span>
    HTML;
                    }
                    return $page_str;
            }
     
            public function tidy_str(){
                    ;//void
            }
     
            public function __call($func_name, $arguments){
                    if(isset($this->$func_name)){
                            return $this->$func_name;
                    }
            }
     
            public function __destruct(){
                    unset($this->page_str);
                    unset($this);
            }
    }
      

  2.   

    class Pagination {
    private $total; //数据表中总记录数
    private $listRows; //每页显示行数
    private $limit;
    private $uri;
    private $pageNum; //页数
    private $config=array('header'=>"个记录", "prev"=>"上一页", "next"=>"下一页", "first"=>"首 页", "last"=>"尾 页");
    private $listNum=8;
    /*
     * $total 
     * $listRows
     */
    public function __construct($total, $listRows=10, $pa=""){
    $this->total=$total;  //信息总条数
    $this->listRows=$listRows;  //每页显示条数
    $this->uri=$this->getUri($pa);
    $this->page=!empty($_GET["page"]) ? $_GET["page"] : 1;
    $this->pageNum=ceil($this->total/$this->listRows);  //总页数
    $this->limit=$this->setLimit();
    } private function setLimit(){
    return "Limit ".($this->page-1)*$this->listRows.", {$this->listRows}";
    } private function getUri($pa){
    $url=$_SERVER["REQUEST_URI"].(strpos($_SERVER["REQUEST_URI"], '?')?'':"?").$pa; $parse=parse_url($url); if(isset($parse["query"])){
    parse_str($parse['query'],$params);
    unset($params["page"]);
    $url=$parse['path'].'?'.http_build_query($params);

    } return $url;
    } public function __get($args){
    if($args=="limit")
    return $this->limit;
    else
    return null;
    } private function start(){
    if($this->total==0)
    return 0;
    else
    return ($this->page-1)*$this->listRows+1;
    } private function end(){
    return min($this->page*$this->listRows,$this->total);
    } private function first(){
    if($this->page==1)
    $html.='';
    else
    $html.="&nbsp;<a href='javascript:setPage(\"{$this->uri}&page=1\")'>{$this->config["first"]}</a>&nbsp;"; return $html;
    } private function prev(){
    if($this->page==1)
    $html.='';
    else
    $html.="&nbsp;<a href='javascript:setPage(\"{$this->uri}&page=".($this->page-1)."\")'>{$this->config["prev"]}</a>&nbsp;"; return $html;
    } private function pageList(){
    $linkPage="";

    $inum=floor($this->listNum/2);

    for($i=$inum; $i>=1; $i--){
    $page=$this->page-$i; if($page<1)
    continue; $linkPage.="&nbsp;<a href='javascript:setPage(\"{$this->uri}&page={$page}\")'>{$page}</a>&nbsp;"; }

    $linkPage.="&nbsp;{$this->page}&nbsp;";
    for($i=1; $i<=$inum; $i++){
    $page=$this->page+$i;
    if($page<=$this->pageNum)
    $linkPage.="&nbsp;<a href='javascript:setPage(\"{$this->uri}&page={$page}\")'>{$page}</a>&nbsp;";
    else
    break;
    } return $linkPage;
    } private function next(){
    if($this->page==$this->pageNum)
    $html.='';
    else
    $html.="&nbsp;<a href='javascript:setPage(\"{$this->uri}&page=".($this->page+1)."\")'>{$this->config["next"]}</a>&nbsp;"; return $html;
    } private function last(){
    if($this->page==$this->pageNum)
    $html.='';
    else
    $html.="&nbsp;<a href='javascript:setPage(\"{$this->uri}&page=".($this->pageNum)."\")'>{$this->config["last"]}</a>&nbsp;"; return $html;
    } private function goPage(){
    return '&nbsp;<input type="text" onkeydown="javascript:if(event.keyCode==13){var page=(this.value>'.$this->pageNum.')?'.$this->pageNum.':this.value;setPage(\''.$this->uri.'&page=\'+page+\'\')}" value="'.$this->page.'" style="width:25px"><input type="button" value="GO" onclick="javascript:var page=(this.previousSibling.value>'.$this->pageNum.')?'.$this->pageNum.':this.previousSibling.value;setPage(\''.$this->uri.'&page=\'+page+\'\')">&nbsp;';
    }
    function fpage($display=array(0,1,2,3,4,5,6,7,8)){
    $html[0]="&nbsp;共有<b>{$this->total}</b>{$this->config["header"]}&nbsp;";
    $html[1]="&nbsp;每页显示<b>".($this->end()-$this->start()+1)."</b>条,本页<b>{$this->start()}-{$this->end()}</b>条&nbsp;";
    $html[2]="&nbsp;<b>{$this->page}/{$this->pageNum}</b>页&nbsp;";

    $html[3]=$this->first();
    $html[4]=$this->prev();
    $html[5]=$this->pageList();
    $html[6]=$this->next();
    $html[7]=$this->last();
    $html[8]=$this->goPage();
    $fpage='';
    foreach($display as $index){
    $fpage.=$html[$index];
    } return $fpage; }
    }