当前位置: 首页 > 文档资料 > FuelPHP 中文文档 >

Pagination - 类別

优质
小牛编辑
130浏览
2023-12-01

Pagination 类别能让你简单地为你显示的纪录设立分页。

如何使用 Pagination 类别的简单例子,你可以将它放进你控制器内的 action 方法。

如何使用查讯建立器来分页

$config = array(
	'pagination_url' => 'http://localhost/fuel/welcome/index/',
	'total_items'    => 10,
	'per_page'       => 5,
	'uri_segment'    => 3,
	// 或者,如果你偏好透过查询字串的分页
	//'uri_segment'    => 'page',
);

// 建立一个名为 'mypagination' 的实例
$pagination = Pagination::forge('mypagination', $config);

$data['example_data'] = DB::select('id', 'value')
				->from('pagination')
				->limit($pagination->per_page)
				->offset($pagination->offset)
				->execute()
				->as_array();

// 我们传递物件,当在检视中输出时它会被呈现
$data['pagination'] = $pagination;

// 回传检视
return \View::forge('welcome/index', $data);

如何使用 ORM 来分页

$config = array(
	'pagination_url' => 'http://localhost/fuel/posts/index/',
	'total_items'    => Model_Post::count(),
	'per_page'       => 10,
	'uri_segment'    => 3,
	// 或者,如果你偏好透过查询字串的分页
	//'uri_segment'    => 'page',
);

$pagination = Pagination::forge('mypagination', $config);

$data['example_data'] = Model_Post::query()
				->rows_offset($pagination->offset)
				->rows_limit($pagination->per_page)
				->get();

// 我们传递物件,当在检视中输出时它会被呈现
$data['pagination'] = $pagination;

// 回传检视
return \View::forge('posts/index', $data);

配置

你可以透过几种方法配置分页实例。你可以传递一个带有配置的阵列当你锻造(forge)实例, 或者你可以直接在该实例上更新特性。

可定义以下的配置设定:

参数类型预设描述
pagination_url字串
null
你有分页页面的 URL,如果为 null,Fuel 尝试从目前的 URL 检测。
uri_segment整数|字串
3
包含页码的 URI 分段(如果为整数)。包含页码的查询字串栏位(如果为字串)。
num_links整数
5
要显示的连结总数。
total_items整数
0
项目总数。通常这是一个 count() 查询的结果。
per_page整数
10
每页笔数。
current_page整数
null
如果 URI 不存在页码时要载入的页面。如果没给,预设是 1。
show_first布林
false
产生一个「到第一页」连结如果为 true 并且不在第一页。
show_last布林
false
产生一个「到最后一页」连结如果为 true 并且不在最后一页。
link_offset整数/浮点数
0.50
在分页区块中活跃连结的偏移,无论是 0 到 1 之间的小数点,或 0 到 100 之间的整数(百分比)。

连结偏移

预设情况下,Pagination 类别会尝试定位活跃连结(目前页面) 在分页区块中间。

你可以使用配置中的 link_offset 值来控制此行为。这个值可以定义为 0 到 1 之间的浮点数,或 1 到 100 之间的整数(像百分比)。预设情况下,这个值是设为 0.5 (= 50%)。 如果你让值变小,活跃连结会往左移动,如果你让值变大, 活跃连结会往右移动。

範例

让我们假设你有共 20 页可以显示。你已经设定 num_links 为 5,总共显示 5 页的连结, 而你显示上一页和下一页连结也是如此。你目前选择的是第 6 页。

  • 随着预设 0.5 的设定,会显示
    «  4  5  6  7  8  »
    , 保持选择的第 6 页恰好地在区块中间。
  • 当你变更设定为 0,Pagination 会始终试着让第一个连结为活跃连结。在这个情况下,
    «  6  7  8  9  10  »
    会被显示,让选择的第 6 页为区块中的第一个连结。
  • 如果你想变更设定为 1,Pagination 会始终试着让最后一个连结为活跃连结。在这个情况下,
    «  2  3  4  5  6  »
    会被显示。

你可以使用範围内的任何值,要逐步转移活跃焦点往左或右。很明显地,你显示愈多连结, 就可以愈精细切换焦点。

这只会在有足够页面可以这样做的时候适用。如果你只有 5 页可用,你想要显示 5 个连结,而第 3 页是目前页面,没有显示上一页和下一页连结,目前页面会在中间,不管 link_offset 的设定是什幺。根本没有足够的页面可用来移动目前页面连结往左或右。

样板化

每个 Pagination 实例使用一个样板来产生需要用来建立分页标记的 HTML。 你可以在 config/pagination.php 档案中储存你的标准样板。 在你做任何修改之前,从核心 config 文件夹複製到你的 app config 文件夹。 预设配置档案配有三个样板,FuelPHP 预设以及相容 Twitter Bootstrap v2 和 v3 的样板。

以下样板条目必须被定义:

wrapper字串
<div class="pagination">\n\t{pagination}\n</div>\n
将包裹产生的分页的标记。
first字串
<span class="first">\n\t{link}\n</span>\n
将被用来产生第一页的标记。
first-inactive字串将被用来产生第一页的标记,如果此页是第一页或唯一。
first-inactive-link字串将被用来产生第一页连结的标记,如果此页是第一页或唯一。
first-marker
&laquo;&laquo;
将被用来产生第一页标记的标记。
first-link字串
\t\t<a href="{uri}">{page}</a>\n
将被用来产生第一页连结的标记。
previous字串
<span class="previous">\n\t{link}\n</span>\n
将被用来产生上一页的标记。
previous-marker字串
&laquo;
将被用来产生上一页标记的标记。
previous-link字串
\t\t<a href="{uri}" rel="prev">{page}</a>\n
将被用来产生上一页连结的标记。
previous-inactive字串
<span class="previous-inactive">\n\t{link}\n</span>\n
将被用来为无效连结产生上一页的标记。
previous-inactive-link字串
\t\t<a href="{uri}" rel="prev">{page}</a>\n
将被用来为无效连结产生上一页连结的标记。
regular字串
<span>\n\t{link}\n</span>\n
将被用来产生其他页面的标记。
regular-link字串
\t\t<a href="{uri}">{page}</a>\n
将被用来产生其他页面连结的标记。
active字串
<span class="active">\n\t{link}\n</span>\n
将被用来产生目前页面的标记。
active-link字串
\t\t<a href="{uri}">{page}</a>\n
将被用来产生目前页面连结的标记。
next字串
<span class="next">\n\t{link}\n</span>\n
将被用来产生下一页的标记。
next-marker字串
&raquo;
将被用来产生下一页标记的标记。
next-link字串
\t\t<a href="{uri}" rel="next">{page}</a>\n
将被用来产生下一页连结的标记。
next-inactive字串
<span class="next-inactive">\n\t{link}\n</span>\n
将被用来为无效连结产生下一页的标记。
next-inactive-link字串
\t\t<a href="{uri}" rel="next">{page}</a>\n
将被用来为无效连结产生下一页连结的标记。
last字串
<span class="last">\n\t{link}\n</span>\n
将被用来产生最后一页的标记。
last-marker字串
&raquo;&raquo;
将被用来产生最后一页标记的标记。
last-link字串
\t\t<a href="{uri}">{page}</a>\n
将被用来产生最后一页连结的标记。
last-inactive字串将被用来产生最后一页的标记,如果此页是最后一页或唯一。
last-inactive-link字串将被用来产生最后一页连结的标记,如果此页是最后一页或唯一。

在样板中,{uri} 将被产生的分页连结取代(# 如果是非活跃样板), 并且 {page} 被页码或上一个/下一个标记取代。 如果你想要在这些标记使用图像,只要修改定义在样板中相应的连结, 用图像标记取代 {page}

当你锻造 Pagination 实例时所传递的配置将与定义在你配置档案中的预设样板合併。 这能让你指传递你想要覆写值。 如果你在配置档案中的样板不完整, 上面所提的预设值将被使用。

forge($name = 'default', $config = array())

forge 方法能建立一个新的分页实例,并且透过传递一个阵列来配置。

静态
参数
参数预设描述
$name必要要被建立的实例名称。如果没有给名称,'default' 实例会被建立。
$config
array()
配置阵列。
回传Pagination
範例
// 建立一个新的分页实例
$pagination = Pagination::forge('mypagination', array(
	'pagination_url' => 'http://docs.fuelphp.com/',
	'uri_segment' => 2,
	'total_items' => 10,
	'per_page' => 20,
));

instance($name = null)

instance 方法能让你检索先前锻造的实例,或回传预设实例如果没给名称的话。

静态
参数
参数预设描述
$name
null
要被回传实例的名称。如果没给名称,'default' 实例会被建立。
回传混合,一个 Pagination 物件,或 flase 如果请求的实例不存在。
範例
// 取回先前锻造的实例
$pagination = Pagination::instance('mypagination');

render($raw = false)

render 方法产生在检视中显示分页连结的标记。

静态
参数
参数预设描述
$raw
false
如果为 true,会回传一个原始分页资料的阵列,而不是呈现分页标记。
回传字串
範例
// 取回先前锻造的实例,并且呈现
echo Pagination::instance('mypagination')->render();

分页物件包含一个 __toString() 方法,当你写出该物件、或转为字串时, 会造成 render() 方法被呼叫。

first($marker = null)

first 方法为分页产生显示「第一页」连结的标记。 如果没给字串用来做为标记,来自样板的 "first-marker" 值会被使用。

静态
参数
参数预设描述
$marker
null
要被显示在连结里的文字。预设是 'first-marker' 样板值。
回传字串
範例
// 取回先前锻造的实例,并且呈现「第一页」连结
echo Pagination::instance('mypagination')->first();

「第一页」连结将只在有第一页,而你不在第一页时显示。 请注意,预设情况下,没有为 'first' 定义无效连结。

previous($marker = null)

previous 方法为分页产生显示「上一页」连结的标记。 如果没给字串用来做为标记,来自样板的 "previous-marker" 值会被使用。

静态
参数
参数预设描述
$marker
null
要被显示在连结里的文字。预设是 'previous-marker' 样板值。
回传字串
範例
// 取回先前锻造的实例,并且呈现「上一页」连结
echo Pagination::instance('mypagination')->previous();

next($marker = null)

next 方法为分页产生显示「下一页」连结的标记。 如果没给字串用来做为标记,来自样板的 "next-marker" 值会被使用。

静态
参数
参数预设描述
$marker
null
要被显示在连结里的文字。预设是 'next-marker' 样板值。
回传字串
範例
// 取回先前锻造的实例,并且呈现「下一页」连结
echo Pagination::instance('mypagination')->next();

last($marker = null)

last 方法为分页产生显示「最后一页」连结的标记。 如果没给字串用来做为标记,来自样板的 "last-marker" 值会被使用。

静态
参数
参数预设描述
$marker
null
要被显示在连结里的文字。预设是 'last-marker' 样板值。
回传字串
範例
// 取回先前锻造的实例,并且呈现「最后一页」连结
echo Pagination::instance('mypagination')->last();

「最后一页」连结将只在有任何页面,而你不在最后一页时显示。 请注意,预设情况下,没有为 'last' 定义无效连结。

pages_render()

pages_render 方法为分页产生显示在上一页及下一页之间的页面连结的标记。

静态
参数
回传混合
範例
// 取回先前锻造的实例,并且呈现「pages」连结
echo Pagination::instance('mypagination')->pages_render();

静态介面

为了方便你, Pagination 类别也有一个只对预设实例操作的静态介面。

get($name)

get 方法能让你在预设实例取得一个配置项目。

静态
参数
参数预设描述
$name必要要取回的特性名称。
回传混合,特性值、或 null 如果特性不存在。
範例
// 取回目前页码
$page_number = Pagination::get('current_page');

// 这是一个别名
$page_number = Pagination::instance()->current_page;

set($name, $value)

set 方法能让你在预设实例设定一个配置项目为所给的值。

静态
参数
参数预设描述
$name必要要设定的特性名称。
$value必要要设定的特性值。
回传
範例
// 设定列总数
$page_number = Pagination::set('total_items', 610);

// 这是一个别名
Pagination::instance()->total_items = 610;

为了向下相容,静态方法 set_config()create_links()next_link()prev_link() 将被模拟在预设实例, 以最小化升级一个已存在的应用程序到 FuelPHP v1.4+ 的迁移影响。

请注意,现下没有可能的方法模拟直接存取静态类别特性, 所以如果你的应用程序使用的话,你将必须改变它们:

// v1.4 前用法:
Pagination::$per_page = 10;

// 新用法:
Pagination::set('per_page', 10);

// v1.4 前用法:
Model_Article::find()
	->order_by('date', 'ASC')
	->rows_offset(\Pagination::$offset)
	->rows_limit(\Pagination::$per_page)
	->get();

// 新用法:
Model_Article::query()
	->order_by('date', 'ASC')
	->rows_offset(\Pagination::get('offset'))
	->rows_limit(\Pagination::get('per_page'))
	->get();