开源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 中国开发者社区 的朋友们!
相关文章
相关标签/搜索