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