当天新闻记录不断增加的时候,必然导致新闻列表不的加长以致用户不能在一屏内显示完所有内容,致使用户需要不停的拉动滚动条来获取更多的内容,这样无形之中给用户浏览新闻添加了不少障碍;因此对数据进行分页将是必然。之前做过网站的都应该知道分页样式及功能的实现有多种方法,分页可以根据不同的需要进行定制,但有一个缺点就是开发者基本上都需要自已写一个分页类库来加以调用。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
~~~
- 序言
- 第1章 Zend Framework2 简介
- 1.1 Zend Framework2 简介
- 1.2 下载安装
- 1.3 搭建开发环境
- 第2章 创建ZF2项目
- 2.1 新建一个项目
- 2.2 配置网站
- 2.3 伪静态 .htaccess文件
- 2.4 添加启动/入口文件
- 2.5 添加全局配置文件
- 2.6 添加自动加载文件 init_autoloader.php
- 2.7 IndexController 控制器
- 第3章 创建模块文件
- 3.1 Module 文件
- 3.2 module.config 文件
- 3.2.1 router 路由配置
- 3.2.2 controllers控制器配置
- 3.2.3 view_manager 视图管理器
- 3.2.4 service_manager 服务管理器
- 3.2.5 translator 翻译器
- 3.2.6 navigation 导航条
- 第4章 创建控制器
- 4.1 控制器简介
- 4.2 新建控制器
- 4.3 添加控制器的Action
- 第5章 创建视图模板
- 5.1 创建模板
- 5.2 模板配置
- 5.3 编写布局和错误异常模板
- 5.4 编写Action 对应的模板文件
- 5.5 访问 IndexAction
- 第6章 创建模型
- 6.1 ORM 对象映射法
- 6.2 使用分页导航
- 6.3 自定模型
- 6.4 章节总结
- 第7章 实例应用
- 7.1 建立Album 模块
- 7.2 添加模块文件
- 7.3 添加模块配置文件
- 7.4 创建数据表 album
- 7.5 添加模型文件
- 7.6 添加表单 AlbumForm
- 7.7 添加控制器 AlbumController
- 7.8 添加模板文件
- 第8章 用户认证
- 8.1 建立数据表
- 8.2 新建认证类
- 8.3 引用认证类
- 第9章 结束语