CodeIgniter 中国开发者社区诚征热爱 CI 的版主

查看完整版本: CodeIgniter 分页教程(Pagination)

Hex 2007-10-23 17:12

CodeIgniter 分页教程(Pagination)

[b]作者[/b]: Yannick Lyn Fatt
[b]翻译[/b]: CodeIgniter 中国
[b]原文[/b]: [url=http://godbit.com/article/pagination-with-code-igniter]http://godbit.com/article/pagination-with-code-igniter[/url]


  有些时候,你可能需要把数据库查询所得到的一篇文章或一组结果拆分成多页。在这时,你将需要写某种分页脚本。这对于从没有做过这个的开发者来说还是有一点难度的,但使用 [url=http://codeigniter.org.cn/]CodeIgniter[/url] 却是轻而易举就能完成的。
  CodeIgniter 具有非常容易使用的[url=http://codeigniter.org.cn/user_guide/libraries/pagination.html]分页类[/url]。在本教程中我会做一个从数据库返回一组结果并分页这些结果的简单例子。我将使用最新版本的 CI,写这篇文章时的版本是 1.5.1 。分页类并没有修改(至少我认为没有),用最新的稳定版框架总是好的。现在,让我们开始吧。


[b]配置和数据库设置[/b]

  很好,一切正常,当我们开始写一个 CI 应用程序时,我们要设置很多东西。我们首先打开 [b]config.php[/b] 文件(可在 [b]/system/application/config/[/b] 中找到)。在这里我们将输入站点根 URL。这是我的设置:[code=PHP]$config['base_url'] = "http://localhost/~yannick/pagination/";[/code]你的设置可能会和我的略有不同。
  这个应用程序将使用一个数据库,所以我们下一步的工作是创建数据库,然后再以 CI 访问我们的数据库。要做到这一点请打开 [b]database.php[/b],这也定位在你的 [b]config 文件夹[/b]中,并填写必要的信息,以便连接到你的数据库。您可以下载“例子代码”:如果你愿意可以使用例子代码和我的例子数据库。这将创建一个名为“[b]christian_books[/b]”的表,并插入一些测试数据。同时,我想你现在可以猜一猜分页后是什么样?如果你猜对了一些“Christian Books”,你将是正确的。


[b]控制器[/b]

  我们的基本配置文件和数据库设置已经完成,现在我们需要创建一个控制器。我将它命名为“[b]books.php[/b]”,并且它将包含下列代码:[code=PHP]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'] = site_url('books/index');
    $config['total_rows'] = $this->db->count_all('christian_books');
    $config['per_page'] = 5;
    $config['uri_segment'] = 3;  // 表示第 3 段 URL 为当前页数,如 index.php/控制器/方法/页数,如果表示当前页的 URL 段不是第 3 段,请修改成需要的数值。

     $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);
  }
}[/code]如果你读过我最近写的[url=http://godbit.com/article/introduction-to-code-igniter]介绍 CI[/url]的系列文章,那么,你将在这里看到许多很熟悉的内容。如果你没读过并且是新手,要想感受 CI 这种自由的话,要阅读上面的这篇文章,然后再回来继续看下面的内容。如果你已经加快了学习速度,那么,让我们继续看看上述代码更详细的描述。
  首先,我们在构造函数中装载 [url=http://codeigniter.org.cn/user_guide/helpers/url_helper.html]URL 辅助函数[/url]和数据库。当然,你不一定要创建一个构造函数并装载这些辅助函数,因为它可以很容易的在控制器中的其它函数/方法中装载,但是,如果辅助函数将用于控制器中的大多数/所有方法的话,我通常倾向于创建一个构造函数并把它们放在里面。
  其次,我们创建了一个名为 index() 的方法。这是一个非常基本的应用程序,正因如此,我们将只需要这种单一的方法,使我们装载分页类,模型和 HTML 表格类(我们稍后将讨论的内容) 。
  让我们开始吧!你会看到非常简单的使用分页类的方法。首先,我们配置要分页页面的 URL:[code=PHP]$config['base_url'] = base_url().'index.php/books/index/';[/code]这个 base_url() 函数不要与 $config[] 数组中的 base_url 相混淆。该 base_url() 函数来自 URL 辅助函数并且它代表整个应用程序的 URL。在上述代码中,连接到 base_url() 后面的内容是要分页页面的地址。
  然后,我们设置数据库中的总行数:[code=PHP]$config['total_rows'] = $this->db->count_all('christian_books');[/code]这个函数返回数据库中的所有行,如果你运行一个特定查询将返回某些行,并不一定是所有的行,然后,你可能会使用在[url=http://codeigniter.org.cn/user_guide/database/results.html]记录辅助函数[/url]中的 $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 通常采取以下形式,[b]www.your-site.com/index.php/class/function/ID[/b],所以大家可以看到第三段(index.php 的后面)代表 ID。所以允许采用如下的 URL:

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

  URL 第三段的 10 将被插入到我们模型函数的第二个参数中:get_books(5, 10),它表示偏移量(offset)。因此,我们的结果将返回数据库中前 10 条记录的后 5 条记录(因为根据前面的代码,我们每页显示 5 条记录)。非常妙,对不对?好了,我们先在停在这里休息一下,更详细的内容将在下一节中。
  现在,这里有一些新东西。在这里,我们装载 [url=http://codeigniter.org.cn/user_guide/libraries/table.html]HTML 表格类[/url],这是新添加到 CI 1.5.0 版本中的。这个类允许你从数组或数据库结果中生成 HTML 表格。你可以进行相当多的定制,但在这个例子中,我使用他基本形式中的一种:我明确的指明表格的头部应该是什么。[code=PHP]$this->table->set_heading('ID', 'Title', 'Author', 'Description');[/code]如果我没有指明这一点,HTML 表格类将使用它们在数据库表中的名字作为表名。因此,举例来说,如果你的数据库表中有一个列名为“[b]book_id[/b]”,则表格类将使用“[b]book_id[/b]”。如果你不想它这样显示的话,则上述代码片断允许你指定一个更可读的字段名。
  最后,我们装载“视图”,并传递给它我们将用到的任何数据。都做好后,我们的控制器就完成了。现在,让我们来看看我们的模型,看看怎样在分页中发挥它的威力。


[b]模型[/b]

  OK,这时候模型就开始重新调用你数据库里的信息了。在这个分页教程中,我们的模型将包含一个方法,它基于页面上的用户请求,从数据库中获取正确的结果。正如你所看到的,控制器方法有两个参数,一个 limit 和另一个 offset。然后,我们创建一个文件,命名为“[b]books_model.php[/b]”,并在文件中输入下列代码:[code=PHP]class books_model extends Model {
  function __construct(){
    parent::Model();
  }

  function get_books($num, $offset) {
    $query = $this->db->get('christian_books', $num, $offset);        
    return $query;
  }
}[/code]大家可以看到,我们的模型‘[b]books_model[/b]‘和方法 get_books(),本教程中包含了一个填充了图书记录的数据库,我们希望取得这些图书并显示在屏幕上。你会注意到我们调用 get_books() 的两个参数,分别是 $num 和 $offset。 $num 指明从数据库中取得的记录数,$offset 指明将从哪开始获取记录。[code=PHP]$query = $this->db->get('christian_books', $num, $offset);[/code]上面的代码将产生下面的 MySQL 查询(举例):[code=SQL]SELECT * FROM christian_books LIMIT 10, 5[/code]5 代表 $num,10 代表 $offset。以上就是传给模型的所有内容了。我们存储这些结果在一个名为 $query 的变量中,然后把变量返回给调用它的方法。把这些结合起来,我们的模型就写完了。
  我们已经完成了 2/3 了,最后事情是,我们要创建视图。


[b]视图[/b]

  记住,一个视图就是一个简单的 Web 页面或页面片段。所以,在这里我们的视图是一个在表格里显示图书的 Web 页面。让我们来看看代码:[code=HTML]<!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" content="text/html; charset=utf-8" />
<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>[/code]你可能会想,“这当然不能这么简单。”是的,这只是为本教程创建的视图。[code=PHP]$this->table->generate($results);[/code]首先,把从模型中得到的结果传递到 generate() 方法中,这样,我们将创建显示图书表格的 HTML 代码。[code=PHP]$this->pagination->create_links();[/code]接下来,我们分页类中的 create_links() 方法是最有用的,它创建各页页码的链接,包括“下一页”和“上一页”的链接。它看起来类似这样:

        « First  < 1 2 [b]3[/b] 4 5 >  Last »

  现在访问你的页面,并在显示页码的地方开心的玩一玩。你也可以从一页切换到另一页,看看 URL 是怎样变化的,并且 URL 的第三段表示显示在表格中结果的偏移量。


[b]总结[/b]

  好了,上面我简单介绍了分页类,正如你看到的,添加分页功能到你的 CI 应用程序并不难。我也介绍了在 1.5.0 版本中新添加的 HTML 表格类,并且它也不是很难。这个类库使我们可以快速的创建 HTML 表格,以显示我们的结果。
  就这样了,我希望你在享受本教程的同时,会发现它内容翔实并对你有帮助。如果你有兴趣学习如何在没有 CI 框架帮助的情况下,在 PHP 中做分页程序,那么,我建议你看看 Jonathan Sampson 制作的[url=http://www.sampsonresume.com/2007/02/01/screencast-php-pagination/]分页视频[/url].
  世界和平,上帝保佑。

腻歪 2007-10-24 16:34

饿滴神啊~~~~
咋介长呀。。。

Hex 2007-10-24 18:10

呵呵,腻歪你有空就给翻译翻译吧~~~
我太感谢你了,呵呵~

腻歪 2007-10-25 18:03

@Hex

好~不用客气啦~~:loveliness:

姜运涛 2007-11-7 14:58

这个挺好用
凑字凑字

Hex 2007-11-7 17:13

呵呵,是的,但就是没翻译过来,哎~希望有心人帮忙翻译一下~呵呵

jgcao 2007-11-11 16:58

这个分页系统比较好,就是分页的显示的样式比较少,不知以后可不可以多一些样式供程序员选择

Hex 2007-11-15 15:44

我开始翻译这篇文章,腻歪是不管了,呜呜呜。。。

Hex 2007-11-20 17:49

70% 已翻译完毕,希望大家提意见!!!!太感谢了!!!!!!!!!!

SonYoo 2007-11-21 10:20

看看吧...

Hex 2007-11-21 11:46

大家一定要多提意见啊!!

laotan 2007-11-25 10:09

强烈要支持!!!!!!看完了。!!!

Hex 2007-11-26 14:06

本教程已经全部翻译完毕,征求意见中。。。。。。。

gaochao 2007-11-27 11:43

速度挺快的啊 加油加油

Hex 2007-11-27 12:18

别光加油!提意见。。。。。。。。

doutu 2007-11-28 23:05

官方版的分页功能还是蛮原始的,想要传多几个参数就不行了。我只好自己扩展了一下,没空整理,哪位需要可以联系一下

Hex 2007-11-29 10:07

呵呵,发到论坛上吧~~~~~~~~分享一下嘛~~~

sam 2007-12-4 23:54

恩。。不错。。

应该多写一些例子。。。。呵呵。。真不错。。:lol

sam 2007-12-21 18:11

用ci+pgsql进行分页

如果你用的是postgresql数据库的话,CI自带的函数是不能完全进行分页的,需要做一下改动。
在本案例中有一个model文件books_model.php
如下:
<?php
class Books_model extends Model{
        
        function __construct()
        {
               parent::Model();
        }
        
        function get_books($num,$offset)
        {
                $sql="select * from christian_books limit $num offset $offset";
                $query=$this->db->query($sql);
                return $query;
        }
}
?>

呵呵。。只需要改动一下get_books函数,但是需要自己手写sql语句,这样就可以兼容postgresql数据库了。。神奇。。:P

[[i] 本帖最后由 zhuyaopeng 于 2007-12-21 18:15 编辑 [/i]]

Hex 2007-12-21 18:19

顶楼上的。。。。。。。。:victory:

xhq6632 2008-3-24 10:25

意见就是,不是很明了

iss_uoow 2008-3-25 00:31

好东西 简单 易懂.. 意见就是很好 继续努力^_^

Hex 2008-3-25 00:38

[quote]原帖由 [i]xhq6632[/i] 于 2008-3-24 10:25 发表 [url=http://codeigniter.org.cn/forums/redirect.php?goto=findpost&pid=2143&ptid=17][img]http://codeigniter.org.cn/forums/images/common/back.gif[/img][/url]
意见就是,不是很明了 [/quote]
感谢提出意见,是否可以说明哪里不明确?谢谢!

mojay 2008-4-6 21:23

新手,还得多学习啊。

chenxihacn 2008-4-16 16:41

回复 楼主 的帖子

跟着做了一遍,过了。
分页的样式自己也可以完全控制,就是“首页”“尾页”会根据页面 抑制显示,有开关可以控制这个的吗?

Hex 2008-4-16 16:57

[quote]原帖由 [i]chenxihacn[/i] 于 2008-4-16 16:41 发表 [url=http://codeigniter.org.cn/forums/redirect.php?goto=findpost&pid=2680&ptid=17][img]http://codeigniter.org.cn/forums/images/common/back.gif[/img][/url]
跟着做了一遍,过了。
分页的样式自己也可以完全控制,就是“首页”“尾页”会根据页面 抑制显示,有开关可以控制这个的吗? [/quote]
没有,呵呵。

caincheung 2008-4-17 08:59

正需要。

wangqiu1027 2008-5-23 16:39

关于ci分页传参数的问题

在实际的开发中,经常遇到这样的问题。就是在查询的结果中翻页,点击下一页的时候,如何传递条件参数,哪位大侠能给个例子上来,小弟不胜感激:handshake

默生 2008-6-8 17:33

[quote]点击下一页的时候,如何传递条件参数,[/quote]
我也在疑惑?
点下一页的时候,不能显示:Q

哈哈, 已经解决!
[color=#ff00ff][color=#000000]注意[/color][u]~yannick[/u][/color]
[color=#0000ff][quote]
[color=#0000ff]$config[/color][color=#66cc66][[/color][color=#ff0000]'base_url'[/color][color=#66cc66]][/color] = [color=#ff0000]"http://localhost/~yannick/pagination/"[/color];
[/quote]
改成自已的就行了.


[/color][size=5][color=red]但是如何给表格添加样样式呢?[/color][/size]
[size=5][color=#ff0000]我想给某个特定的表格加个id或class之类的[/color][/size]

[[i] 本帖最后由 默生 于 2008-6-8 17:48 编辑 [/i]]

Azhun 2008-7-6 17:52

Good Job Thanks a lot!
页: [1] 2
查看完整版本: CodeIgniter 分页教程(Pagination)