Pagination 类別

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();