開源PHP框架-CodeIgniter分頁教程

有些時候,你可能須要把數據庫查詢所獲得的一篇文章或一組結果拆分紅多頁。在這時,你將須要寫某種分頁腳本。這對於從沒有作過這個的開發者來講仍是有一點難度的,但使用  CodeIgniter  倒是垂手可得就能完成的。
        CodeIgniter 具備很是容易使用的 分頁類 。在本教程中我會作一個從數據庫返回一組結果並分頁這些結果的簡單例子。我將使用最新版本的 CI,寫這篇文章時的版本是 1.5.1 。分頁類並無修改(至少我認爲沒有),用最新的穩定版框架老是好的。如今,讓咱們開始吧。

         配置和數據庫設置

        很好,一切正常,當咱們開始寫一個 CI 應用程序時,咱們要設置不少東西。咱們首先打開  config.php  文件(可在  /system/application/config/  中找到)。在這裏咱們將輸入站點根 URL。這是個人設置:
PHP code
?
1
$config['base_url'] = "http://localhost/~yannick/pagination/";
你的設置可能會和個人略有不一樣。

        這個應用程序將使用一個數據庫,因此咱們下一步的工做是建立數據庫,而後再以 CI 訪問咱們的數據庫。要作到這一點請打開  database.php ,這也定位在你的  config 文件夾 中,並填寫必要的信息,以便鏈接到你的數據庫。您能夠下載「例子代碼」:若是你願意可使用例子代碼和個人例子數據庫。這將建立一個名爲「 christian_books 」的表,並插入一些測試數據。同時,我想你如今能夠猜一猜分頁後是什麼樣?若是你猜對了一些「Christian Books」,你將是正確的。

         控制器

        咱們的基本配置文件和數據庫設置已經完成,如今咱們須要建立一個控制器。我將它命名爲「 books.php 」,而且它將包含下列代碼:
PHP code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Books extends Controller {
  function __construct() {
    parent::Controller();
    $this->load->helper('url');
    $this->load->database();
  }
 
  function index() {
    // load pagination class
    $this->load->library('pagination');
    $config['base_url'] = base_url().'index.php/books/index/';
    $config['total_rows'] = $this->db->count_all('christian_books');
    $config['per_page'] = '5';
    $config['full_tag_open'] = '<p>';
    $config['full_tag_close'] = '</p>';
 
    $this->pagination->initialize($config);
                 
    //load the model and get results
    $this->load->model('books_model');
    $data['results'] = $this->books_model->get_books($config['per_page'],$this->uri->segment(3));
                 
    // load the HTML Table Class
    $this->load->library('table');
    $this->table->set_heading('ID', 'Title', 'Author', 'Description');
                 
    // load the view
    $this->load->view('books_view', $data);
  }
}
若是你讀過我最近寫的 介紹 CI 的系列文章,那麼,你將在這裏看到許多很熟悉的內容。若是你沒讀過而且是新手,要想感覺 CI 這種自由的話,要閱讀上面的這篇文章,而後再回來繼續看下面的內容。若是你已經加快了學習速度,那麼,讓咱們繼續看看上述代碼更詳細的描述。
        首先,咱們在構造函數中裝載  URL 輔助函數 和數據庫。固然,你不必定要建立一個構造函數並裝載這些輔助函數,由於它能夠很容易的在控制器中的其它函數/方法中裝載,可是,若是輔助函數將用於控制器中的大多數/全部方法的話,我一般傾向於建立一個構造函數並把它們放在裏面。
        其次,咱們建立了一個名爲 index() 的方法。這是一個很是基本的應用程序,正因如此,咱們將只須要這種單一的方法,使咱們裝載分頁類,模型和 HTML 表格類(咱們稍後將討論的內容) 。
        讓咱們開始吧!你會看到很是簡單的使用分頁類的方法。首先,咱們配置要分頁頁面的 URL:
PHP code
?
1
$config['base_url'] = base_url().'index.php/books/index/';
這個 base_url() 函數不要與 $config[] 數組中的 base_url 相混淆。該 base_url() 函數來自 URL 輔助函數而且它表明整個應用程序的 URL。在上述代碼中,鏈接到 base_url() 後面的內容是要分頁頁面的地址。
        而後,咱們設置數據庫中的總行數:
PHP code
?
1
$config['total_rows'] = $this->db->count_all('christian_books');
這個函數返回數據庫中的全部行,若是你運行一個特定查詢將返回某些行,並不必定是全部的行,而後,你可能會使用在 記錄輔助函數 中的 $query->num_row() 函數。
        $config['per_page'] 變量簡單地告訴分頁類每頁顯示多少條記錄。$config['full_tag_open'] 和 $config['full_tag_close'] 變量說明使用什麼標籤包圍分頁連接。
        接下來,咱們裝載模型,咱們將執行其中的一個方法:get_books()。它有兩個參數,limit,這決定了每頁顯示多少項目,offset,它表示從哪行開始返回記錄。你會發現,第一個參數(limit)從 $config['per_page'] 變量中取值,而第二個參數則經過 URL 輔助函數,從 URL 的第三段中取值:$this->uri->segment(3)。後者是這裏很是有趣的緣由。CI 的 URL 一般採起如下形式, www.your-site.com/index.php/class/function/ID ,因此你們能夠看到第三段(index.php 的後面)表明 ID。因此容許採用以下的 URL:

        http://localhost/~yannick/pagination/index.php/books/index/10

        URL 第三段的 10 將被插入到咱們模型函數的第二個參數中:get_books(5, 10),它表示偏移量(offset)。所以,咱們的結果將返回數據庫中前 10 條記錄的後 5 條記錄(由於根據前面的代碼,咱們每頁顯示 5 條記錄)。很是妙,對不對?好了,咱們先在停在這裏休息一下,更詳細的內容將在下一節中。
        如今,這裏有一些新東西。在這裏,咱們裝載  HTML 表格類 ,這是新添加到 CI 1.5.0 版本中的。這個類容許你從數組或數據庫結果中生成 HTML 表格。你能夠進行至關多的定製,但在這個例子中,我使用他基本形式中的一種:我明確的指明表格的頭部應該是什麼。
PHP code
?
1
$this->table->set_heading('ID', 'Title', 'Author', 'Description');
若是我沒有指明這一點,HTML 表格類將使用它們在數據庫表中的名字做爲表名。所以,舉例來講,若是你的數據庫表中有一個列名爲「 book_id 」,則表格類將使用「 book_id 」。若是你不想它這樣顯示的話,則上述代碼片段容許你指定一個更可讀的字段名。
        最後,咱們裝載「視圖」,並傳遞給它咱們將用到的任何數據。都作好後,咱們的控制器就完成了。如今,讓咱們來看看咱們的模型,看看怎樣在分頁中發揮它的威力。

         模型

        OK,這時候模型就開始從新調用你數據庫裏的信息了。在這個分頁教程中,咱們的模型將包含一個方法,它基於頁面上的用戶請求,從數據庫中獲取正確的結果。正如你所看到的,控制器方法有兩個參數,一個 limit 和另外一個 offset。而後,咱們建立一個文件,命名爲「 books_model.php 」,並在文件中輸入下列代碼:
PHP code
?
1
2
3
4
5
6
7
8
9
10
class books_model extends Model {
  function __construct(){
    parent::Model();
  }
 
  function get_books($num, $offset) {
    $query = $this->db->get('christian_books', $num, $offset);        
    return $query;
  }
}
你們能夠看到,咱們的模型‘ books_model ‘和方法 get_books(),本教程中包含了一個填充了圖書記錄的數據庫,咱們但願取得這些圖書並顯示在屏幕上。你會注意到咱們調用 get_books() 的兩個參數,分別是 $num 和 $offset。 $num 指明從數據庫中取得的記錄數,$offset 指明將從哪開始獲取記錄。
PHP code
?
1
$query = $this->db->get('christian_books', $num, $offset);
上面的代碼將產生下面的 MySQL 查詢(舉例):
SQL code
?
1
SELECT * FROM christian_books LIMIT 10, 5
5 表明 $num,10 表明 $offset。以上就是傳給模型的全部內容了。咱們存儲這些結果在一個名爲 $query 的變量中,而後把變量返回給調用它的方法。把這些結合起來,咱們的模型就寫完了。
        咱們已經完成了 2/3 了,最後事情是,咱們要建立視圖。

         視圖

        記住,一個視圖就是一個簡單的 Web 頁面或頁面片斷。因此,在這裏咱們的視圖是一個在表格裏顯示圖書的 Web 頁面。讓咱們來看看代碼:
PHP code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-us" lang="en-us">
<head>
<meta http-equiv="content-type" c />
<link rel="stylesheet" href='<?php echo base_url(); ?>css/main.css' type="text/css" media="screen, projection" />
<title>CodeIgniter Pagination Tutorial</title>
</head>
<body>
<h1>Christian Books</h1>
<?php echo $this->table->generate($results); ?>
<?php echo $this->pagination->create_links(); ?>
</body>
</html>
你可能會想,「這固然不能這麼簡單。」是的,這只是爲本教程建立的視圖。
PHP code
?
1
$this->table->generate($results);
首先,把從模型中獲得的結果傳遞到 generate() 方法中,這樣,咱們將建立顯示圖書表格的 HTML 代碼。
PHP code
?
1
$this->pagination->create_links();
接下來,咱們分頁類中的 create_links() 方法是最有用的,它建立各頁頁碼的連接,包括「下一頁」和「上一頁」的連接。它看起來相似這樣:

        « First  < 1 2  3  4 5 >  Last »

        如今訪問你的頁面,並在顯示頁碼的地方開心的玩一玩。你也能夠從一頁切換到另外一頁,看看 URL 是怎樣變化的,而且 URL 的第三段表示顯示在表格中結果的偏移量。

         總結

        好了,上面我簡單介紹了分頁類,正如你看到的,添加分頁功能到你的 CI 應用程序並不難。我也介紹了在 1.5.0 版本中新添加的 HTML 表格類,而且它也不是很難。這個類庫使咱們能夠快速的建立 HTML 表格,以顯示咱們的結果。
        就這樣了,我但願你在享受本教程的同時,會發現它內容翔實並對你有幫助。若是你有興趣學習如何在沒有 CI 框架幫助的狀況下,在 PHP 中作分頁程序,那麼,我建議你看看 Jonathan Sampson 製做的 分頁視頻
        世界和平,上帝保佑。

下載例子代碼:  ci_pagination_tut.zip

原文: http://godbit.com/article/pagination-with-code-igniter
翻譯: CodeIgniter 中國
鳴謝: CodeIgniter 中國開發者社區 的朋友們!
相關文章
相關標籤/搜索