[组件]Zend_Paginator 山寨版翻译(翻译到基础用法)
|

|
[组件]Zend_Paginator 山寨版翻译(翻译到基础用法)
本帖最后由 七月十五 于 2009-5-16 15:21 编辑
(注:英文的看起来速度太慢了,所以简单的翻译下,当然是业余山寨版的,Just fucking Google it,翻译不对的地方大家一起修正)
第31章Zend_Paginator
目录
31.1. 导言
31.2. 用法
31.2.1. Paginating数据收集
31.2.2. 渲染网页视图脚本
31.2.2.1. 分页控件例子
31.2.2.2. 分页标签的一些说明(自己理解的)
31.3. 配置
31.4. 高级用法
31.4.1. 自定义数据源适配器
31.4.2. 自定义滚动风格
31.4.3. 缓存功能
31.1. 导言
Zend_Paginator是一种灵活的组成部分paginating收集数据和提交数据给用户。
主要设计目标Zend_Paginator如下:
Paginate任意数据,不仅关系数据库
只取回结果集的结果,需要显示
不要强迫用户坚持只有一个方式显示的数据或渲染分页控件
Zend_Paginator与其他Zend Framework的组件松散的耦合,使用户谁愿意用它独立Zend_View , Zend_Db等可以这样做
31.2. 用法
31.2.1. Paginating 数据收集
为了把数据结果在页面上分页, Zend_Paginator必须有一个通用的方式获取数据。出于这个原因,所有的数据访问是通过数据源适配器。一些适配器与Zend Framework的默认:
表31.1 Zend_Paginator的适配器
适配器描述 | Array | 使用一个 PHP 数组 | | DbSelect | 使用一个 Zend_Db_Select 对象实例, 它会返回一个数组 | | DbTableSelect | 使用一个 Zend_Db_Table_Select 对象实例, 将返回Zend_Db_Table_Rowset_Abstract对象实例. 这提供了额外的信息的结果集,如列名 | | Iterator | 使用一个 Iterator 对象实例 | | Null | 不要使用Zend_Paginator来管理数据分页。您仍然可以利用分页控制功能。 |
注意:不是每一个匹配选择某一行的查询, DbSelect和DbTableSelect适配器只检索最小的数据量所需的显示当前页面。
由于这一原因,第二个查询是动态生成的,以确定总人数的匹配行。不过,可以直接供应计数或计数查询自己。见setRowCount ( )方法在DbSelect适配器以获取更多信息。
要创建一个实例Zend_Paginator ,您必须提供一个适配器的构造:
$paginator = new Zend_Paginator(new Zend_Paginator_Adapter_Array($array));
为方便起见,您可以利用static factory() 方法的适配器包装与Zend框架:
$paginator = Zend_Paginator::factory($array);
注意:为了避免零适配器(the Null adapter),以代替数据收集您必须提供一个项目计数其构造。
虽然在技术上这样的实例可在此状态下,在您的控制器动作,您需要告诉paginator什么页码用户要求。这使他事先通过编配页码数据。
$paginator->setCurrentPageNumber($page);
最简单的方法来追踪这个值是通过一个网址。虽然我们建议您使用Zend_Controller_Router_Interface兼容的路由器来处理,它不是一个要求。
下面是一个示例路线您可能使用的问题配置文件:
routes.example.route = articles/:articleName/:page
routes.example.defaults.controller = articles
routes.example.defaults.action = view
routes.example.defaults.page = 1
routes.example.reqs.articleName = \w+
routes.example.reqs.page = \d+
上述路线(和使用Zend Framework的MVC模式的组成部分) ,您可以设定当前页数成这样:
$paginator->setCurrentPageNumber($this->_getParam('page'));
还有其他可供选择;更多关于它们的参考配置。
最后,您需要指定paginator实例化您的view。如果您使用Zend_View行动与ViewRenderer助手,下面的工作:
$this->view->paginator = $paginator;
31.2.2 渲染网页视图脚本
认为脚本是用来提供网页项目(如果您使用的是Zend_Paginator这样做) ,并显示分页控制。
由于Zend_Paginator执行声压级接口(the SPL interface)IteratorAggregate ,循环您的项目,并展示他们的很简单
<html>
<body>
<h1>Example</h1>
<?php if (count($this->paginator)): ?>
<ul>
<?php foreach ($this->paginator as $item): ?>
<li><?= $item; ?></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
<?= $this->paginationControl($this->paginator,
'Sliding',
'my_pagination_control.phtml'); ?>
</body>
</html>
声明认为助手呼吁接近尾声。 PaginationControl接受多达4个参数: the paginator instance, a scrolling style, a view partial,以及一系列其他参数。
第二和第三个参数是非常重要的。而鉴于部分是用来确定如何分页控制应该看看,滚动式是用来控制它应如何行事。the view partial 是搜索分页控制的一个形式,类似下面:
[attach]66[/attach]
会发生什么事当用户点击“下一页”链接了几次?那么,任何数量的事情可能发生。目前的网页数目可以留在中间您通过点击(就像在Yahoo ! ),也可以提前结束页面范围,然后再次出现在左边当用户点击“下一步”一个更多的时间。网页数量甚至可能扩大和合同的用户预付款(或“scrolls” )通过他们(因为他们对谷歌)【原句是The page numbers might even expand and contract as the user advances (or "scrolls") through them (as they do on Google).
】 。
有四个滚动风格包装与Zend框架:
表 31.2. Zend_Paginator的滚动样式
| 滚动样式 | 描述 | | All | 回报的每一页。这是有益的下拉菜单分页控件与相对较少的网页。在这种情况下,你想要的所有网页,提供给用户一次。 | | Elastic | 象谷歌一样滚动式的,可扩大和合同作为用户通过网页卷轴。 | | Jumping | 用户浏览通过,页码进步的结尾某一范围内,然后开始再次开始新的范围。 | | Sliding | 雅虎!样滚动风格,当前位置的网页数量为中心的网页范围,或尽可能接近。这是默认的风格。 |
第四个也是最后一个参数是一个可选的保留关联数组更多的变量,你要提供你的看法部分(可通过 via $this) 。举例来说,这些价值可能包括额外的URL参数分页链接。
通过设置the default view partial, default scrolling style, and view instance,您可以完全消除the calls to PaginationControl:
Zend_Paginator::setDefaultScrollingStyle('Sliding');
Zend_View_Helper_PaginationControl::setDefaultViewPartial(
'my_pagination_control.phtml'
);
$paginator->setView($view);
当所有这些值设定,可以使分页控制在您的视图脚本用简单的回声声明:
<?= $this->paginator; ?>
注意
当然,也可以与其他使用Zend_Paginator模板引擎。例如,您可能会与Smarty做到以下几点:
$smarty->assign('pages', $paginator->getPages());
然后,您可以访问paginator值从模板象这样:
{$pages.pageCount}
31.2.2.1 分页控件例子
下面的分页控件例子有望帮助您开始:
搜索分页
[php]<!--
See http://developer.yahoo.com/ypatt ... rn=searchpagination
-->
<?php if ($this->pageCount): ?>
<div class="paginationControl">
<!-- Previous page link -->
<?php if (isset($this->previous)): ?>
<a href="<?= $this->url(array('page' => $this->previous)); ?>">
< Previous
</a> |
<?php else: ?>
<span class="disabled">< Previous</span> |
<?php endif; ?>
<!-- Numbered page links -->
<?php foreach ($this->pagesInRange as $page): ?>
<?php if ($page != $this->current): ?>
<a href="<?= $this->url(array('page' => $page)); ?>">
<?= $page; ?>
</a> |
<?php else: ?>
<?= $page; ?> |
<?php endif; ?>
<?php endforeach; ?>
<!-- Next page link -->
<?php if (isset($this->next)): ?>
<a href="<?= $this->url(array('page' => $this->next)); ?>">
Next >
</a>
<?php else: ?>
<span class="disabled">Next ></span>
<?php endif; ?>
</div>
<?php endif; ?>[/php]
项目页码
[php]<!--
See http://developer.yahoo.com/ypatt ... tern=itempagination
-->
<?php if ($this->pageCount): ?>
<div class="paginationControl">
<?= $this->firstItemNumber; ?> - <?= $this->lastItemNumber; ?>
of <?= $this->totalItemCount; ?>
<!-- First page link -->
<?php if (isset($this->previous)): ?>
<a href="<?= $this->url(array('page' => $this->first)); ?>">
First
</a> |
<?php else: ?>
<span class="disabled">First</span> |
<?php endif; ?>
<!-- Previous page link -->
<?php if (isset($this->previous)): ?>
<a href="<?= $this->url(array('page' => $this->previous)); ?>">
< Previous
</a> |
<?php else: ?>
<span class="disabled">< Previous</span> |
<?php endif; ?>
<!-- Next page link -->
<?php if (isset($this->next)): ?>
<a href="<?= $this->url(array('page' => $this->next)); ?>">
Next >
</a> |
<?php else: ?>
<span class="disabled">Next ></span> |
<?php endif; ?>
<!-- Last page link -->
<?php if (isset($this->next)): ?>
<a href="<?= $this->url(array('page' => $this->last)); ?>">
Last
</a>
<?php else: ?>
<span class="disabled">Last</span>
<?php endif; ?>
</div>
<?php endif; ?>
[/php]
下拉式分页
[php]<?php if ($this->pageCount): ?>
<select id="paginationControl" size="1">
<?php foreach ($this->pagesInRange as $page): ?>
<?php $selected = ($page == $this->current) ? ' selected="selected"' : ''; ?>
<option value="<?= $this->url(array('page' => $page)); ?>"<?= $selected ?>>
<?= $page; ?>
</option>
<?php endforeach; ?>
</select>
<?php endif; ?>
<script type="text/javascript"
src="http://ajax.googleapis.com/ajax/libs/prototype/1.6.0.2/prototype.js">
</script>
<script type="text/javascript">
$('paginationControl').observe('change', function() {
window.location = this.options[this.selectedIndex].value;
})
</script>
[/php]
31.2.2.2. 属性清单
下面的选项可以控制分页查看partials :
表31.3 可查看的分页属性
| 属性 | 类型 | 描述 | | first | integer | 第一页编号(即1 ) | | firstItemNumber | integer | 绝对数量上的第一个项目此页 | | firstPageInRange | integer | 第一页的范围传回的滚动式 | | current | integer | 当前页码 | | currentItemCount | integer | 此页项目数量 | | itemCountPerPage | integer | 提供给每一页的最大的项目数量 | | last | integer | 最后一页编号 | | lastItemNumber | integer | 绝对数量上的最后一个项目此页 | | lastPageInRange | integer | 最后一页的范围传回的滚动式 | | next | integer | 下一页 | | pageCount | integer | 总页数 | | pagesInRange | array | 滚动式返回的页数组(Array of pages returned by the scrolling style ) | | previous | integer | 前一页 | | totalItemCount | integer | 项目总数 |
31.3. 配置
Zend_Paginator有几个配置方法,可称为:
表31.4 配置方法Zend_Paginator
| 方法 | 描述 | | setCurrentPageNumber | 设定当前页面数量(默认是1 ) 。 | | setItemCountPerPage | 设定网页上显示项目的最大数量(默认10 ) 。 | | setPageRange | 设置要显示的项目数量在分页控制(默认10 ) 。注意:在大多数情况下,这一数字将坚持到底,但滚动风格可以选择只把它作为一项准则或开始价值(例如,弹性(Elastic)) 。
| | setView | 为了渲染便利,设定the view instance
|
|
|
|
泛团网 haofine.com 精品团购每一天
|
|
|
|
|
|
 
|
2#
发表于 2009-2-26 09:06
| 只看该作者
ZendFramework的文档已经和PHP的文档一样了,N久都没有被翻译过了,许多地方都过时了
我就有点纳闷了,PHPChina自称Zend的中国官方,为什么对翻译文档这种事就一点都不积极呢??但是却对举办这个PHP培训,那个PHP培训却来那么来劲呢?我分析的原因就是money,翻译手册又没利可图,但是搞培训就不一样了。
我感觉与其搞这个培训那个培训的,不如把文档好好翻译下对中国的PHPer更有好处,也对PHP在中国的发展更有好处。
当然了,我对翻译文档也没什么贡献,大家可能说我没资格说这种话,但是我就是要把心里话说出来,爱咋咋地!! |
|
|
|
|
|
|
|
|

|
3#
发表于 2009-2-26 09:22
| 只看该作者
| so nb Just fucking Google it 只靠google |
|
|
|
|
|
|
|
|
 

|
4#
发表于 2009-2-26 10:29
| 只看该作者
原帖由 ivan820819 于 2009-2-26 09:06 发表 
ZendFramework的文档已经和PHP的文档一样了,N久都没有被翻译过了,许多地方都过时了
我就有点纳闷了,PHPChina自称Zend的中国官方,为什么对翻译文档这种事就一点都不积极呢??但是却对举办这个PHP培训,那个PH ...
有钱的出钱,没钱的出力。
程序员出脑力~ |
|
|
|
|
|
|
|
|

|
5#
发表于 2009-2-26 11:24
| 只看该作者
原帖由 ivan820819 于 2009-2-26 09:06 发表 
ZendFramework的文档已经和PHP的文档一样了,N久都没有被翻译过了,许多地方都过时了
我就有点纳闷了,PHPChina自称Zend的中国官方,为什么对翻译文档这种事就一点都不积极呢??但是却对举办这个PHP培训,那个PH ...
曾记得早年间,在phpx的时候,学术气氛很浓啊!
phpchina在这方面做的真的很差,我现在订阅博客都在博客园,可那是个.NET的技术社区。
你看phpchina上,除了几位大牛不定期的出现一下,有分量的文章真少。 |
|
|
|
|
|
|
|
|
 

|
6#
发表于 2009-2-26 15:54
| 只看该作者
| 楼上的,你以为这里是CSDN或者javaeye啊~ |
|
|
|
|
|
|
|
|

|
7#
发表于 2009-2-26 16:16
| 只看该作者
关键是能让参与翻译的人得到了什么
每个人的价值取向有一定的差异
短期和长期价值取向又不一定一样
周围的氛围也造成一定的影响
万事开头难,坚持下去就更难 |
|
|
|
|
|
|
|
|

|
8#
发表于 2009-2-26 16:19
| 只看该作者
有力的或许无心
有心的可能无力
力量分散,拧不起来 |
|
|
|
|
|
|
|
|

|
9#
发表于 2009-2-26 17:41
| 只看该作者
原帖由 yoursjzz 于 2009-2-26 15:54 发表 
楼上的,你以为这里是CSDN或者javaeye啊~
我不知道为什么你这样说,但是好像CSDN和微软,javaeye和SUN 都没什么关系吧!
而phpchina和zend却有着培训协议。
有这个先天条件,为什么社区却不火呢。
看不到什么高技术含量的东西呢! |
|
|
|
|
|
|
|
|
 
|
10#
发表于 2009-2-26 19:17
| 只看该作者
| phpchina 已经变成娱乐论坛了,每天80%+的发帖都在水区,很强大。。。。 |
|
|
|
|
|
|
|