当前位置:首页 > PHP教程 > php分页 > 列表

非常好用的Zend Framework分页类

发布:smiling 来源: PHP粉丝网  添加日期:2021-03-02 15:38:13 浏览: 评论:0 

这篇文章主要介绍了非常好用的Zend Framework分页类,包含控制层、模型层、视图层及分页源码,Css部分请自由发挥,需要的朋友可以参考下。

在这里和大家分享一个非常好用的 Zend Framework 分页类,具体效果可见本站的分页效果, CSS样式可根据个人设计感进行更变。

这里我会举例演示如何使用该类, 如下:

IndexController.php, 在 Action 中写入如下代码:

  1. protected  $_curPage = 1;      //默认第一页 
  2. const PERPAGENUM     = 4;      //每页显示条目数 
  3.  
  4. public function indexAction() 
  5. {   
  6.     // $this->_blogModel 已实例化 blog Model 
  7.     // $rows -> 获得到所展示数据的总条目数 
  8.     $rows = $this->_blogModel->getTotalRows(); 
  9.       
  10.     if($pageNum = $this->getRequest()->getParam('page')) { 
  11.         //如果有值传入,覆盖初始的第一页 
  12.         $this->_curPage = $pageNum
  13.     } 
  14.       
  15.     //把数据表中的数据传到前端 
  16.     $this->view->blogInfo = $this->_blogModel->getBlogInfo( 
  17.                                 self::PERPAGENUM, ($this->_curPage-1)*self::PERPAGENUM 
  18.                             ); 
  19.     //实例化分页类,并传到前端 
  20.     $this->view->pagebar = $this->displayPageBar($rows); 
  21.  
  22. private function displayPageBar($totalRows
  23.     $Pager = new Zend_Pagination($totalRows,self::PERPAGENUM); 
  24.     return $Pager->getNavigation(); 

models/Blog.php,写入如下代码:

  1. public function getBlogInfo($perPageNum = NULL, $limit = NULL) 
  2.     return $this->fetchAll('1 = 1''blog_id desc'$perPageNum$limit
  3.                 ->toArray(); 
  4.  
  5. public function getTotalRows($where = '1=1'
  6.     return $this->fetchAll($where)->count(); 

index.phtml, 写入如下代码:

  1. <div class="page"
  2.     <!--?php echo $this--->pagebar; ?> 
  3. </div> 

到这里,就可以看见效果了, 如想追求更好的页面效果, 请根据个人喜好修改分页类,这里就不作详细示例,代码如下:

  1. class Zend_Pagination 
  2.     private $_navigationItemCount = 6;        //导航栏显示导航总页数 
  3.     private $_pageSize            = null;     //每页项目数 
  4.     private $_align               = "right";  //导航栏显示位置 
  5.     private $_itemCount           = null;     //总项目数 
  6.     private $_pageCount           = null;     //总页数 
  7.     private $_currentPage         = null;     //当前页 
  8.     private $_front               = null;     //前端控制器 
  9.     private $_PageParaName        = "page";   //页面参数名称 
  10.  
  11.     private $_firstPageString     = "|<<";    //导航栏中第一页显示的字符 
  12.     private $_nextPageString      = ">>";     //导航栏中前一页显示的字符 
  13.     private $_previousPageString  = "<<";     //导航栏中后一页显示的字符 
  14.     private $_lastPageString      = ">>|";    //导航栏中最后一页显示的字符 
  15.     private $_splitString         = " | ";    //页数字间的间隔符 
  16.  
  17.     public function __construct($itemCount$pageSize
  18.     { 
  19.         if (!is_numeric($itemCount) || (!is_numeric($pageSize))) { 
  20.             throw new Exception("Pagination Error:not Number"); 
  21.         } 
  22.         $this->_itemCount = $itemCount
  23.         $this->_pageSize  = $pageSize
  24.         $this->_front     = Zend_Controller_Front::getInstance(); 
  25.  
  26.         $this->_pageCount = ceil($itemCount/$pageSize);   //总页数 
  27.         $page = $this->_front->getRequest()->getParam($this->_PageParaName); 
  28.           
  29.         if (emptyempty($page) || (!is_numeric($page))) {   
  30.             //为空或不是数字,设置当前页为1 
  31.             $this->_currentPage = 1; 
  32.         } else { 
  33.             if ($page < 1) { 
  34.                 $page = 1; 
  35.             } 
  36.             if ($page > $this->_pageCount) { 
  37.                 $page = $this->_pageCount; 
  38.             } 
  39.             $this->_currentPage = $page
  40.         } 
  41.     } 
  42.  
  43.     public function getCurrentPage() 
  44.     { 
  45.         return $this->_currentPage; 
  46.     } 
  47.  
  48.     public function getNavigation() 
  49.     { 
  50.         $navigation = '<div style="text-align:'.$this->_align.';" class="pagecss">'
  51.           
  52.         //当前页处于第几栏分页 
  53.         $pageCote      = ceil($this->_currentPage / ($this->_navigationItemCount - 1)) - 1;   
  54.         //总分页栏 
  55.         $pageCoteCount = ceil($this->_pageCount / ($this->_navigationItemCount - 1)); 
  56.         //分页栏中起始页 
  57.         $pageStart     = $pageCote * ($this->_navigationItemCount -1) + 1;  
  58.         //分页栏中终止页       
  59.         $pageEnd       = $pageStart + $this->_navigationItemCount - 1;                       
  60.           
  61.         if($this->_pageCount < $pageEnd) { 
  62.             $pageEnd   = $this->_pageCount; 
  63.         } 
  64.           
  65.         $navigation .= "总共: {$this->_itemCount} 条 共 {$this->_pageCount} 页\n  "
  66.           
  67.         if($pageCote > 0) {           //首页导航 
  68.             $navigation .= '<a href="'.$this->createHref(1) 
  69.                            ." \"="">$this->_firstPageString</a> "
  70.         } 
  71.         if($this->_currentPage != 1) {       //上一页导航 
  72.             $navigation .= '<a href="'.$this->createHref($this->_currentPage-1); 
  73.             $navigation .= " \"="">$this->_previousPageString</a> "
  74.         }else
  75.             $navigation .= $this->_previousPageString . ' '
  76.         } 
  77.          
  78.         while ($pageStart <= $pageEnd)      //构造数字导航区 
  79.         { 
  80.             if ($pageStart == $this->_currentPage) { 
  81.                 $navigation .= "<b>$pageStart</b>" . $this->_splitString; 
  82.             } else { 
  83.                 $navigation .= '<a href="'.$this->createHref($pageStart
  84.                                ." \"="">$pageStart</a>" 
  85.                                . $this->_splitString; 
  86.             } 
  87.             $pageStart++; 
  88.         } 
  89.           
  90.         if($this->_currentPage != $this->_pageCount) {   //下一页导航 
  91.             $navigation .= ' <a href="' 
  92.                            . $this->createHref($this->_currentPage+1) 
  93.                            . " \"="">$this->_nextPageString</a> "
  94.         }else
  95.             $navigation .= $this->_nextPageString; 
  96.         } 
  97.          
  98.         if ($pageCote < $pageCoteCount-1) {               //未页导航 
  99.             $navigation .= '<a href="' 
  100.                            . $this->createHref($this->_pageCount) 
  101.                            . " \"="">$this->_lastPageString</a> "
  102.         } 
  103.  
  104.         $navigation .= ' 到 <select onchange="window.location=\' ' 
  105.                        . $this->createHref() 
  106.                        . '\'+this.options[this.selectedIndex].value;">'
  107.           
  108.         for ($i=1;$i<=$this->_pageCount;$i++){ 
  109.             if ($this->getCurrentPage()==$i){ 
  110.                $selected = "selected"
  111.             } else { 
  112.                $selected = ""
  113.             } 
  114.             $navigation .= '<option value=" . $i . " '="" .="" $selected="">' 
  115.                            . $i 
  116.                            . '</option>'
  117.         } 
  118.         $navigation .= '</select>'
  119.         $navigation .= " 页</div>"
  120.         return $navigation
  121.     } 
  122.  
  123.     public function getNavigationItemCount() 
  124.     { 
  125.         return $this->_navigationItemCount; 
  126.     } 
  127.  
  128.     public function setNavigationItemCoun($navigationCount
  129.     { 
  130.         if(is_numeric($navigationCount)) { 
  131.             $this->_navigationItemCount = $navigationCount
  132.         } 
  133.     } 
  134.  
  135.     public function setFirstPageString($firstPageString
  136.     { 
  137.         $this->_firstPageString = $firstPageString
  138.     } 
  139.  
  140.     public function setPreviousPageString($previousPageString
  141.     { 
  142.         $this->_previousPageString = $previousPageString
  143.     } 
  144.  
  145.     public function setNextPageString($nextPageString
  146.     { 
  147.         $this->_nextPageString = $nextPageString
  148.     } 
  149.  
  150.     public function setLastPageString($lastPageString
  151.     { 
  152.         $this->_lastPageString = $lastPageString
  153.     } 
  154.  
  155.     public function setAlign($align
  156.     { 
  157.         $align = strtolower($align); 
  158.         if ($align == "center") { 
  159.             $this->_align = "center"
  160.         } elseif ($align == "right") { 
  161.             $this->_align = "right"
  162.         } else { 
  163.             $this->_align = "left"
  164.         } 
  165.     } 
  166.      
  167.     public function setPageParamName($pageParamName
  168.     { 
  169.         $this->_PageParaName = $pageParamName
  170.     } 
  171.  
  172.     public function getPageParamName() 
  173.     { 
  174.         return $this->_PageParaName; 
  175.     } 
  176.  
  177.     private function createHref($targetPage = null) 
  178.     { 
  179.         $params     = $this->_front->getRequest()->getParams(); 
  180.         $module     = $params["module"]; 
  181.         $controller = $params["controller"]; 
  182.         $action     = $params["action"]; 
  183.  
  184.         $targetUrl = $this->_front->getBaseUrl() 
  185.                      . "/$module/$controller/$action"
  186.                        
  187.         foreach ($params as $key => $value
  188.         { 
  189.             if($key != "controller" && $key != "module" 
  190.                && $key != "action" && $key != $this->_PageParaName) { 
  191.                 $targetUrl .= "/$key/$value"
  192.             } 
  193.         } 
  194.         if (isset($targetPage)) {                //指定目标页 
  195.             $targetUrl .= "/$this->_PageParaName/$targetPage"
  196.         } else { 
  197.             $targetUrl .= "/$this->_PageParaName/"
  198.         } 
  199.         return $targetUrl
  200.     } 

这里再简单回顾下 Mysql 中的 limit offset

假设数据库表 blog 存在 13 条数据。

语句1:select * from blog limit 9, 4

语句2:select * from blog limit 4 offset 9

语句1和2均返回表 blog 的第 10、11、12、13 行

语句1中的 9 表示从表的第十行开始, 返回 4 行

语句2中的 4 表示返回 4 行,offset 9 表示从表的第十行开始

如下语句显示分页效果:

  1. 语句3:select * from blog limit ($this->_curPage - 1)* self::PERPAGENUM, self::PERPAGENUM; 
  2. 语句4:select * from blog limit self::PERPAGENUM offset ($this->_curPage - 1) * self::PERPAGENUM; 

Tags: Zend Framework

分享到: