您的位置:首页 > 编程语言 > PHP开发

zend framework 分页显示 Zend_Paginator的使用

2014-08-19 16:42 295 查看
zend framework 提供了一个分页类Zend_Paginator,Zend_Paginator强大的地方在自动分页和导航面板。 构造Zend_Paginator需要提供一个adapter,在手册上提供了五种选择 Adapter:Array,Zend_Db_Select,Zend_Db_Table_Select,Iterator,Null。

如果我们从数据库取得数据,在分页可以使用 Zend_DB_Select或则Zend_Db_Table_Select。

class Draft extends Zend_Db_Table_Abstract
{
protected $_name = 'draft';
protected $_primary = 'id';
}

$draft = new Draft();
$select = $draft->select(); //Zend_DB_Select对象
$select->order("id desc"); //设置Zend_DB_Select对象的属性
$paginator = new Zend_Paginator(new Zend_Paginator_Adapter_DbTableSelect($select));
$paginator->setItemCountPerPage($this->page->per); //设置每页的条数
$paginator->setPageRange($this->page->range); //设置导航栏显示页码的个数
$paginator->setCurrentPageNumber(0); //设置当前页码
echo count($paginator)."<br>";//页面数
foreach ($paginator as $items) {
echo $items->id;//轮训取出内容
}


通常的使用方法是将paginator传递给view, $this->view->items = $paginator。在view页面中使用如下的代码:

<?php
if(count($this->items)>1)
{
echo $this->paginationControl($this->items,'Sliding','partials/pagination-control.phtml');
}

?>
<?php foreach ($this->itmes as $item) {
echo "<div class='draftlist'>";
$content = $item['content'];//轮训取出每一条内容
echo "</div>";
}?>


$this->paginationControl($paginator,'Sliding','pagination.phtml');会加载一个类 Zend_Paginator_ScrollingStyle_Sliding。导航栏的样式如图:





标签页的总数为5个,标签页会自动移动到合适的位置上,并且会判断首页、末页、上一页、下一页链接是否生效。判断当前页号在导航条的位置是调用了Zend_Paginator的_createPages()方法,其中用了一些数学方法计算,感兴趣的可以简单推算一下。

如果这样使用Paginator已经非常方便了,但是有一个问题:

select就必须查询全部数据。

因为我们只需要当前分页里面的数据,所以查询全部数据显然是浪费空间的。

重新写一个分页类当然可以,如果还想用Zend提供的类,作者想到一个方法,用较少空间,用Array构造Paginator。代码如下

controller:
class Draft extends Zend_Db_Table_Abstract
{
protected $_name = 'draft';
protected $_primary = 'id';
}

$draft = new Draft();
$db = $draft->getAdapter();
$query = "select count(*) from draft";
$total = $db->fetchOne($query);

$begin = $pageNum*$perPage;
$select->limit($perPage,$begin);
$array = $db->fetchAll($select);

$paginator = new Zend_Paginator(new Zend_Paginator_Adapter_Array(range(1,$total)));
$paginator->setItemCountPerPage($this->page->per); //设置每页的条数
$paginator->setPageRange($this->page->range); //设置导航栏显示页码的个数
$paginator->setCurrentPageNumber(0); //设置当前页码

$this->view->items = $paginator;
$this->view->array = $array
}
view:
<?php
if(count($this->items)>1)
{
echo $this->paginationControl($this->items,'Sliding','partials/pagination-control.phtml');
}
?>
<?php foreach ($this->array as $item) {
echo "<div class='draftlist'>";
$content = $item['content'];//轮训取出每一条内容
echo "</div>";
}?>


经过这样的修改,即可以使用导航条,每次取出的数据也仅仅是当前页面的数据,只是生成了一个数组对Paginator进行初始化。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐