6.2 使用分页导航

最后更新于:2022-04-01 00:41:05

当天新闻记录不断增加的时候,必然导致新闻列表不的加长以致用户不能在一屏内显示完所有内容,致使用户需要不停的拉动滚动条来获取更多的内容,这样无形之中给用户浏览新闻添加了不少障碍;因此对数据进行分页将是必然。之前做过网站的都应该知道分页样式及功能的实现有多种方法,分页可以根据不同的需要进行定制,但有一个缺点就是开发者基本上都需要自已写一个分页类库来加以调用。ZF2为了减少开发自已类库的麻烦ZF2类库本身就已经集成了分页的类库,ZF2提供的分页类库简单易用,开发都也可以根据需要重写分页类或对分类的CSS样式进行重新设定;接下来的内容将重点讲解ZF2分页类库的使用方法。 ### 6.2.1 修改模块配置文件 打开文件 `/module/Application/config/module.config.php`,对news 路由区段块进行修改,具体修改内容如下: ~~~ 'news'=>array( 'type'=>'segment', 'options'=>array( 'route'=>'/news[/][:action][[/:id][/page/:page]]', 'constraints'=>array( 'action'=>'[a-zA-Z]*', 'id'=>'[0-9]+', 'page'=>'[0-9]+', ), 'defaults'=>array( 'controller'=>'Application\Controller\News', 'action'=>'index' ), ), ) ~~~ 修改的地址: 'route'=>'/news[/][:action][/:id]' 修改为 'route'=>'/news[/][:action][[/:id][/page/:page]]' 此处修改的主要作用是为使用路由能匹配出/page/n 这样的分页链接路径 添加page'=>'[0-9]+' 路由正则区别规则 ### 6.2.2 修改模型文件 打开文件 `/module/Application/src/Model/NewsTable.php`,修改public function fetchAll(){}函数,具体内容如下: ~~~ public function fetchAll($paginated=false) { if($paginated){ $select = new Select('news'); $rs = new ResultSet(); $rs->setArrayObjectPrototype(new News()); $pageAdapter = new DbSelect($select,$this->tableGateway->getAdapter(),$rs); $paginator = new Paginator($pageAdapter); return $paginator; } $resultSet = $this->tableGateway->select(); return $resultSet; } ~~~ 代码解释: if($paginated){} 判断是否使用分页 $select = new Select('news'); 实例化一个 select ,对指定表进行操作 $rs = new ResultSet(); 实例化一个结果集,用来保存查询结果 $rs->setArrayObjectPrototype(new News()); 设置结果集的操作属性 $pageAdapter = new DbSelect($select,$this->tableGateway->getAdapter(),$rs); 实例化一个DbSelect,并通过数据网关及select来对数据库进行操作,并将最终结果传递到$rs结果集中 $paginator = new Paginator($pageAdapter); 实例化一个分页导航,并将DbSelect 传递过去 return $paginator; 返回分页导航实例 ### 6.2.3 修改控制器文件 打开文件 `/module/Application/src/Application/Controller/NewsController.php`,对`public function listAction(){}` 方法进行修改,具体内容如下: ~~~ public function listAction(){ $paginator = $this->getNewsTalbe()->fetchAll(true); $paginator->setCurrentPageNumber((int)$this->params()->fromRoute('page',1)); $paginator->setItemCountPerPage(5); return new ViewModel(array('paginator'=>$paginator)); } ~~~ 代码解释: $paginator = $this->getNewsTalbe()->fetchAll(true); 表示使用分页技术进行操作 $paginator->setCurrentPageNumber((int)$this->params()->fromRoute('page',1)); 设置当前页,如果不存在页面则默认设置为第一页 $paginator->setItemCountPerPage(5);设置每个分页将显示的记录行数 return new ViewModel(array('paginator'=>$paginator)); 将分页导航对象返回给模板调用 ### 6.2.4 添加分页导航模板 添加文件 `/module/Application/view/application/partial/parginator.phtml`, 具体内容如下: ~~~ <?php if ($this->pageCount): ?> <div class="pagination pagination-centered"> <ul> <!-- Previous page link --> <?php if (isset($this->previous)): ?> <li> <a href="<?php echo $this->url($this->route) . $this->action; ?>/page/<?php echo $this->previous;?>"><<</a> </li> <?php else: ?> <li class="disabled"> <a href="#"> << </a> </li> <?php endif; ?> <?php foreach ($this->pagesInRange as $page): ?> <?php if ($page != $this->current): ?> <li> <a href="<?php echo $this->url($this->route) . $this->action; ?>/page/<?php echo $page; ?>"> <?php echo $page; ?> </a> </li> <?php else: ?> <li class="active"> <a href="#"><?php echo $page; ?></a> </li> <?php endif; ?> <?php endforeach; ?> <?php if (isset($this->next)): ?> <li> <a href="<?php echo $this->url($this->route) . $this->action; ?>/page/<?php echo $this->next; ?>"> >> </a> </li> <?php else: ?> <li class="disabled"> <a href="#"> >> </a> </li> <?php endif; ?> </ul> </div> <?php endif; ?> ~~~ 代码解释: if ($this->pageCount) 判断分页数量决定是否显示分页导航 if (isset($this->previous)) 判断是否有上一页 <a href="<?php echo $this->url($this->route) . $this->action; ?>/page/<?php echo $this->previous;?>"><<</a>上一页链接 foreach ($this->pagesInRange as $page) 循环首页链接页码 <a href="<?php echo $this->url($this->route) . $this->action; ?>/page/<?php echo $page; ?>"><?php echo $page; ?></a>生成各页的导航链接 if (isset($this->next)) 判断是否有下一页 <a href="<?php echo $this->url($this->route) . $this->action; ?>/page/<?php echo $this->next; ?>">>></a>下一页链接 ### 6.2.4 修改新闻列表模板 打开文件 `/module/Appliction/view/application/news/list.phtml`,在此文件末尾添加收下内容: ~~~ <?php echo $this->paginationControl($this->paginator,'sliding',array('application/partial/paginator.phtml','News'),array('route'=>'news','action'=>'list')); ?> ~~~ 此内容的主要功能是将分页模板输出。 经过以上内容的添加修改整合后,现在可以通过 http://localhost/news/list 看到新的新闻列表页,与之前唯一的不同之处就是有分页导航条了,各个可能点击分页的页面数字对各个页面进行切换显示。结果如下: ~~~ header Title Content Add news First news This is the first news Edit Delete Second news This is the second news Edit Delete Third news This is the third news Edit Delete fourth news This is the fourth news Edit Delete Fifth news This is the fifth news Edit Delete << 1 2 >> footer ~~~
';