PHP 框架: CodeIgniter 分页教程
有些时候,你可能需要把数据库查询所得到的一篇文章或一组结果拆分成多页。在这时,你将需要写某种分页脚本。这对于从没有做过这个的开发者来说还是有一点难度的,但使用 CodeIgniter 却是轻而易举就能完成的。
CodeIgniter 具有非常容易使用的分页类。在本教程中我会做一个从数据库返回一组结果并分页这些结果的简单例子。我将使用最新版本的 CI,写这篇文章时的版本是 1.5.1 。分页类并没有修改(至少我认为没有),用最新的稳定版框架总是好的。现在,让我们开始吧。
配置和数据库设置
很好,一切正常,当我们开始写一个 CI 应用程序时,我们要设置很多东西。我们首先打开 config.php 文件(可在 /system/application/config/ 中找到)。在这里我们将输入站点根 URL。这是我的设置:
- $config['base_url'] = "http://localhost/~yannick/pagination/";
你的设置可能会和我的略有不同。
这个应用程序将使用一个数据库,所以我们下一步的工作是创建数据库,然后再以 CI 访问我们的数据库。要做到这一点请打开 database.php,这也定位在你的 config 文件夹中,并填写必要的信息,以便连接到你的数据库。您可以下载“例子代码”:如果你愿意可以使用例子代码和我的例子数据库。这将创建一个名为“christian_books”的表,并插入一些测试数据。同时,我想你现在可以猜一猜分页后是什么样?如果你猜对了一些“Christian Books”,你将是正确的。
控制器
我们的基本配置文件和数据库设置已经完成,现在我们需要创建一个控制器。我将它命名为“books.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'] = 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:
- $config['base_url'] = base_url().'index.php/books/index/';
这个 base_url() 函数不要与 $config[] 数组中的 base_url 相混淆。该 base_url() 函数来自 URL 辅助函数并且它代表整个应用程序的 URL。在上述代码中,连接到 base_url() 后面的内容是要分页页面的地址。
然后,我们设置数据库中的总行数:
- $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 表格。你可以进行相当多的定制,但在这个例子中,我使用他基本形式中的一种:我明确的指明表格的头部应该是什么。
- $this->table->set_heading('ID', 'Title', 'Author', 'Description');
如果我没有指明这一点,HTML 表格类将使用它们在数据库表中的名字作为表名。因此,举例来说,如果你的数据库表中有一个列名为“book_id”,则表格类将使用“book_id”。如果你不想它这样显示的话,则上述代码片断允许你指定一个更可读的字段名。
最后,我们装载“视图”,并传递给它我们将用到的任何数据。都做好后,我们的控制器就完成了。现在,让我们来看看我们的模型,看看怎样在分页中发挥它的威力。
模型
OK,这时候模型就开始重新调用你数据库里的信息了。在这个分页教程中,我们的模型将包含一个方法,它基于页面上的用户请求,从数据库中获取正确的结果。正如你所看到的,控制器方法有两个参数,一个 limit 和另一个 offset。然后,我们创建一个文件,命名为“books_model.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;
- }
- }
大家可以看到,我们的模型‘books_model‘和方法 get_books(),本教程中包含了一个填充了图书记录的数据库,我们希望取得这些图书并显示在屏幕上。你会注意到我们调用 get_books() 的两个参数,分别是 $num 和 $offset。 $num 指明从数据库中取得的记录数,$offset 指明将从哪开始获取记录。
- $query = $this->db->get('christian_books', $num, $offset);
上面的代码将产生下面的 MySQL 查询(举例):
- SELECT * FROM christian_books LIMIT 10, 5
5 代表 $num,10 代表 $offset。以上就是传给模型的所有内容了。我们存储这些结果在一个名为 $query 的变量中,然后把变量返回给调用它的方法。把这些结合起来,我们的模型就写完了。
我们已经完成了 2/3 了,最后事情是,我们要创建视图。
视图
记住,一个视图就是一个简单的 Web 页面或页面片段。所以,在这里我们的视图是一个在表格里显示图书的 Web 页面。让我们来看看代码:
- <!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>
你可能会想,“这当然不能这么简单。”是的,这只是为本教程创建的视图。
- $this->table->generate($results);
首先,把从模型中得到的结果传递到 generate() 方法中,这样,我们将创建显示图书表格的 HTML 代码。
- $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 中国开发者社区的朋友们!
PHP 框架: CodeIgniter 分页教程的更多相关文章
- SSM框架——实现分页和搜索分页
登录|注册 在路上 在路上,要懂得积累:在路上,要学会放下:我在路上!Stay hungry,Stay foolish. 目录视图 摘要视图 订阅 [公告]博客系统优化升级 ...
- 百度云虚拟主机BCH安装PHP框架CodeIgniter
百度云虚拟主机BCH官方未支持CodeIgniter框架,本人参加php中文网活动获取一百度云虚拟主机,本人选的ThinkPHP版,但本人喜欢CodeIgniter框架,因此尝试在该主机上配置Code ...
- Spring+SpringMvc+Mybatis框架集成搭建教程
一.背景 最近有很多同学由于没有过SSM(Spring+SpringMvc+Mybatis , 以下简称SSM)框架的搭建的经历,所以在自己搭建SSM框架集成的时候,出现了这样或者那样的问题,很是苦恼 ...
- Yii2框架RESTful API教程(二) - 格式化响应,授权认证和速率限制
之前写过一篇Yii2框架RESTful API教程(一) - 快速入门,今天接着来探究一下Yii2 RESTful的格式化响应,授权认证和速率限制三个部分 一.目录结构 先列出需要改动的文件.目录如下 ...
- Yii2框架RESTful API教程(一) - 快速入门
前不久做一个项目,是用Yii2框架写一套RESTful风格的API,就去查了下<Yii 2.0 权威指南 >,发现上面写得比较简略.所以就在这里写一篇教程贴,希望帮助刚接触Yii2框架RE ...
- python_Tornado_web_框架_分页
如何实现web_框架_分页? -- 思考什么是xss跨站攻击? --别人把js代码提交到后台,然后从后台返回数据的时候,别人上传的js变成html中的代码, 就会插入别人的代码,带来极大的信息泄露的风 ...
- ThinkJS框架入门详细教程(二)新手入门项目
一.准备工作 参考前一篇:ThinkJS框架入门详细教程(一)开发环境 安装thinkJS命令 npm install -g think-cli 监测是否安装成功 thinkjs -v 二.创建项目 ...
- 前端测试框架Jest系列教程 -- 简介
写在前面: 随着互联网日新月异的发展,用户对于页面的美观度,流畅度以及各方面的体验有了更高的要求,我们的网页不再是简单的承载文字,图片等简单的信息传递给用户,我们需要的是更加美观的页面展示,更快的浏览 ...
- 前端测试框架Jest系列教程 -- Asynchronous(测试异步代码)
写在前面: 在JavaScript代码中,异步运行是很常见的.当你有异步运行的代码时,Jest需要知道它测试的代码何时完成,然后才能继续进行另一个测试.Jest提供了几种方法来处理这个问题. 测试异步 ...
随机推荐
- Spark Shuffle 过程
本文参考:http://www.cnblogs.com/cenyuhai/p/3826227.html 在数据流动的整个过程中,最复杂最影响性能的环节,就是 Shuffle 过程,本文将参考大神的博客 ...
- javascript中call与this的初见
call定义 语法:call([thisObj[,arg1[, arg2[, [,.argN]]]]]) 定义:调用一个对象的一个方法,以另一个对象替换当前对象. 说明:call 方法可以用来代替另一 ...
- 如何用naviecat批量创建mysql数据
1.参考博文:https://blog.csdn.net/lelly52800/article/details/87267096 2.excel要与表结构一致 3.右键,导入向导,选择相应版本,点击“ ...
- 用 Python 编写一个天气查询应用 pyqt5
效果预览: ! 一.获取天气信息 使用python获取天气有两种方式. 1)是通过爬虫的方式获取天气预报网站的HTML页面,然后使用xpath或者bs4解析HTML界面的内容. 2)另一种 ...
- 034-PHP简单定义一个匿名函数
<?php /* 简单定义一个匿名函数 */ # 把匿名函数赋值给一个变量,也叫临时函数 $demo = function ($txt) { echo $txt; }; # 调用测试下 $dem ...
- 103-PHP定义一个类
<?php class ren{ //定义人类 } class mao{ //定义猫类 } new ren(); //实例化人类 new mao(); //实例化猫类 new mao(); // ...
- Spark 2.x 在作业完成时却花费很长时间结束
使用 Apache Spark 2.x 的时候可能会遇到这种现象:虽然 Spark Jobs 已经全部完成了,但是程序却还在执行.比如我们使用 Spark SQL 去执行一些 SQL,这个 SQL 在 ...
- SPOJ ANARC05H 计数DP
给定一个数字串,问有多少种拆分方法,题目所谓的拆分,就是分成若干个子块,每个块的和 即为各个数字相加,当前块的和一定要小于等于后面的块的和 比如1117 就有这些[1-117], [1-1-17], ...
- Apache部署Django+Vue
首先部署Vue,后端项目django开5000端口,所以vue里的路由是ip:5000,然后打包npm run build 生成dist文件 把dist文件里的index.html和static放在/ ...
- Bean XML 配置(3)- 依赖注入配置
Spring 系列教程 Spring 框架介绍 Spring 框架模块 Spring开发环境搭建(Eclipse) 创建一个简单的Spring应用 Spring 控制反转容器(Inversion of ...