非常好用的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;