非常好用的Zend Framework分页类
在这里和大家分享一个非常好用的ZendFramework分页类
 
具体效果可见本站的分页效果,CSS样式可根据个人设计感进行更变。
 
这里我会举例演示如何使用该类,如下:
 
IndexController.php,在Action中写入如下代码:
protected $_curPage=1;     //默认第一页
constPERPAGENUM    =4;     //每页显示条目数
 
publicfunctionindexAction()
{  
    //$this->_blogModel已实例化blogModel
    //$rows->获得到所展示数据的总条目数
    $rows=$this->_blogModel->getTotalRows();
     
    if($pageNum=$this->getRequest()->getParam('page')){
        //如果有值传入,覆盖初始的第一页
        $this->_curPage=$pageNum;
    }
     
    //把数据表中的数据传到前端
    $this->view->blogInfo=$this->_blogModel->getBlogInfo(
                                self::PERPAGENUM,($this->_curPage-1)*self::PERPAGENUM
                            );
    //实例化分页类,并传到前端
    $this->view->pagebar=$this->displayPageBar($rows);
}
 
privatefunctiondisplayPageBar($totalRows)
{
    $Pager=newZend_Pagination($totalRows,self::PERPAGENUM);
    return$Pager->getNavigation();
}
models/Blog.php,写入如下代码:
publicfunctiongetBlogInfo($perPageNum=NULL,$limit=NULL)
{
    return$this->fetchAll('1=1','blog_iddesc',$perPageNum,$limit)
                ->toArray();
}
 
publicfunctiongetTotalRows($where='1=1')
{
    return$this->fetchAll($where)->count();
}
index.phtml,写入如下代码:
<divclass="page">
    <!--?phpecho$this--->pagebar;?>
</div>
到这里,就可以看见效果了,如想追求更好的页面效果,请根据个人喜好修改分页类,这里就不作详细示例
classZend_Pagination
{
    private$_navigationItemCount=6;       //导航栏显示导航总页数
    private$_pageSize           =null;    //每页项目数
    private$_align              ="right"; //导航栏显示位置
    private$_itemCount          =null;    //总项目数
    private$_pageCount          =null;    //总页数
    private$_currentPage        =null;    //当前页
    private$_front              =null;    //前端控制器
    private$_PageParaName       ="page";  //页面参数名称
 
    private$_firstPageString    ="|<<";   //导航栏中第一页显示的字符
    private$_nextPageString     =">>";    //导航栏中前一页显示的字符
    private$_previousPageString ="<<";    //导航栏中后一页显示的字符
    private$_lastPageString     =">>|";   //导航栏中最后一页显示的字符
    private$_splitString        ="|";   //页数字间的间隔符
 
    publicfunction__construct($itemCount,$pageSize)
    {
        if(!is_numeric($itemCount)||(!is_numeric($pageSize))){
            thrownewException("PaginationError:notNumber");
        }
        $this->_itemCount=$itemCount;
        $this->_pageSize =$pageSize;
        $this->_front    =Zend_Controller_Front::getInstance();
 
        $this->_pageCount=ceil($itemCount/$pageSize);  //总页数
        $page=$this->_front->getRequest()->getParam($this->_PageParaName);
         
        if(empty($page)||(!is_numeric($page))){  
            //为空或不是数字,设置当前页为1
            $this->_currentPage=1;
        }else{
            if($page<1){
                $page=1;
            }
            if($page>$this->_pageCount){
                $page=$this->_pageCount;
            }
            $this->_currentPage=$page;
        }
    }
 
    publicfunctiongetCurrentPage()
    {
        return$this->_currentPage;
    }
 
    publicfunctiongetNavigation()
    {
        $navigation='<divstyle="text-align:'.$this->_align.';"class="pagecss">';
         
        //当前页处于第几栏分页
        $pageCote     =ceil($this->_currentPage/($this->_navigationItemCount-1))-1;  
        //总分页栏
        $pageCoteCount=ceil($this->_pageCount/($this->_navigationItemCount-1));
        //分页栏中起始页
        $pageStart    =$pageCote*($this->_navigationItemCount-1)+1; 
        //分页栏中终止页      
        $pageEnd      =$pageStart+$this->_navigationItemCount-1;                      
         
        if($this->_pageCount<$pageEnd){
            $pageEnd  =$this->_pageCount;
        }
         
        $navigation.="总共:{$this->_itemCount}条共{$this->_pageCount}页\n ";
         
        if($pageCote>0){          //首页导航
            $navigation.='<ahref="'.$this->createHref(1)
                           ."\"="">$this->_firstPageString</a>";
        }
        if($this->_currentPage!=1){      //上一页导航
            $navigation.='<ahref="'.$this->createHref($this->_currentPage-1);
            $navigation.="\"="">$this->_previousPageString</a>";
        }else{
            $navigation.=$this->_previousPageString.' ';
        }
        
        while($pageStart<=$pageEnd)     //构造数字导航区
        {
            if($pageStart==$this->_currentPage){
                $navigation.="<b>$pageStart</b>".$this->_splitString;
            }else{
                $navigation.='<ahref="'.$this->createHref($pageStart)
                               ."\"="">$pageStart</a>"
                               .$this->_splitString;
            }
            $pageStart++;
        }
         
        if($this->_currentPage!=$this->_pageCount){  //下一页导航
            $navigation.='<ahref="'
                           .$this->createHref($this->_currentPage+1)
                           ."\"="">$this->_nextPageString</a>";
        }else{
            $navigation.=$this->_nextPageString;
        }
        
        if($pageCote<$pageCoteCount-1){              //未页导航
            $navigation.='<ahref="'
                           .$this->createHref($this->_pageCount)
                           ."\"="">$this->_lastPageString</a>";
        }
 
        $navigation.=' 到<selectonchange="window.location=\''
                       .$this->createHref()
                       .'\'+this.options[this.selectedIndex].value;">';
         
        for($i=1;$i<=$this->_pageCount;$i++){
            if($this->getCurrentPage()==$i){
               $selected="selected";
            }else{
               $selected="";
            }
            $navigation.='<optionvalue=".$i."'="".=""$selected="">'
                           .$i
                           .'</option>';
        }
        $navigation.='</select>';
        $navigation.="页</div>";
        return$navigation;
    }
 
    publicfunctiongetNavigationItemCount()
    {
        return$this->_navigationItemCount;
    }
 
    publicfunctionsetNavigationItemCoun($navigationCount)
    {
        if(is_numeric($navigationCount)){
            $this->_navigationItemCount=$navigationCount;
        }
    }
 
    publicfunctionsetFirstPageString($firstPageString)
    {
        $this->_firstPageString=$firstPageString;
    }
 
    publicfunctionsetPreviousPageString($previousPageString)
    {
        $this->_previousPageString=$previousPageString;
    }
 
    publicfunctionsetNextPageString($nextPageString)
    {
        $this->_nextPageString=$nextPageString;
    }
 
    publicfunctionsetLastPageString($lastPageString)
    {
        $this->_lastPageString=$lastPageString;
    }
 
    publicfunctionsetAlign($align)
    {
        $align=strtolower($align);
        if($align=="center"){
            $this->_align="center";
        }elseif($align=="right"){
            $this->_align="right";
        }else{
            $this->_align="left";
        }
    }
    
    publicfunctionsetPageParamName($pageParamName)
    {
        $this->_PageParaName=$pageParamName;
    }
 
    publicfunctiongetPageParamName()
    {
        return$this->_PageParaName;
    }
 
    privatefunctioncreateHref($targetPage=null)
    {
        $params    =$this->_front->getRequest()->getParams();
        $module    =$params["module"];
        $controller=$params["controller"];
        $action    =$params["action"];
 
        $targetUrl=$this->_front->getBaseUrl()
                     ."/$module/$controller/$action";
                      
        foreach($paramsas$key=>$value)
        {
            if($key!="controller"&&$key!="module"
               &&$key!="action"&&$key!=$this->_PageParaName){
                $targetUrl.="/$key/$value";
            }
        }
        if(isset($targetPage)){               //指定目标页
            $targetUrl.="/$this->_PageParaName/$targetPage";
        }else{
            $targetUrl.="/$this->_PageParaName/";
        }
        return$targetUrl;
    }
}
这里再简单回顾下Mysql中的limitoffset
 
假设数据库表blog存在13条数据。
语句1:select*frombloglimit9,4
语句2:select*frombloglimit4offset9
//语句1和2均返回表blog的第10、11、12、13行
//语句1中的9表示从表的第十行开始,返回4行
//语句2中的4表示返回4行,offset9表示从表的第十行开始
如下语句显示分页效果:
语句3:select*frombloglimit($this->_curPage-1)*self::PERPAGENUM,self::PERPAGENUM;
语句4:select*frombloglimitself::PERPAGENUMoffset($this->_curPage-1)*self::PERPAGENUM;