CodeIgniter分页类配置与Model封装实战
在使用 CodeIgniter (CI) 进行 Web 开发时,高效的分页处理是提升用户体验的关键。本文将介绍如何配置 CI 的 Pagination 库以支持多种 URL 风格,并提供一个通用的 Model 层方法,用于在单次数据库查询中同时获取记录总数和分页后的数据列表,从而减少冗余代码。
CodeIgniter 分页类核心配置
CI 的分页功能高度依赖于控制器中的配置数组。理解不同的 URL 结构有助于正确设置参数,避免页面跳转或数据加载错误。
第1步:确定 URL 结构类型
CI 分页通常支持两种主要的 URL 模式,其底层逻辑有所不同:
- URI 段模式(默认): 如
localhost/news/page/2。数字2代表第几页;若未开启特定选项,也可能代表从第几条记录开始。 - 查询字符串模式: 如
localhost/news?per_page=20。数字20通常代表每页显示条数或起始偏移量。
第2步:配置关键参数
在控制器的方法中初始化分页库时,需构建如下配置数组。这些参数直接决定了分页链接的生成逻辑和前端展示效果。
$config['base_url'] = 'http://example.com/index.php/news/'; // 基础 URL
$config['total_rows'] = $total_rows; // 数据库中符合条件的总记录数
$config['per_page'] = 10; // 每页显示的记录条数
// URI 段模式下的索引位置(视路由规则而定)
$config['uri_segment'] = 3;
// 是否使用页码代替偏移量
// TRUE: page/2 表示第2页
// FALSE: page/10 表示从第10条记录开始
$config['use_page_numbers'] = TRUE;
// 开启后使用 ?per_page=xx 而非 URI 段
$config['page_query_string'] = FALSE;
// 自定义分页按钮文字
$config['first_link'] = '首页';
$config['last_link'] = '末页';
$config['next_link'] = '下一页 >';
$config['prev_link'] = '< 上一页';
$config['cur_tag_open'] = ' <a class="current">';
$config['cur_tag_close'] = '</a>';
$config['num_links'] = 2; // 当前页前后显示的页码数量
$this->pagination->initialize($config);
Model 层通用分页查询封装
为了减少 Controller 和 View 之间重复编写 SQL 查询的次数,建议在 Model 中封装一个统一的方法。该方法通过克隆数据库对象,一次性执行计数查询和数据列表查询,并合并返回值。
第3步:实现 get_page_data 方法
以下是标准的 CI3 Model 封装实现。注意使用 clone 复制查询构造器对象,以确保统计总数的操作不会影响后续获取数据列表的限制条件。
class News_model extends CI_Model {
/**
* 获取分页数据及总条数
*
* @param string $tablename 表名
* @param mixed $where WHERE 条件 (array 或 string)
* @param int $limit 每页条数
* @param int $offset 偏移量 (已应用 per_page)
* @param string $order_by 排序字段
* @param CI_DB_query_builder $db 指定使用的数据库连接
* @return array ['total' => int, 'data' => array]
*/
public function get_page_data($tablename, $where, $limit, $offset, $order_by, $db = NULL)
{
if (empty($tablename)) {
return FALSE;
}
// 获取数据库实例
$dbhandle = empty($db) ? $this->db : $db;
// 处理 WHERE 条件
if ($where) {
if (is_array($where)) {
$dbhandle->where($where);
} else {
// 使用 false 防止自动转义导致的安全问题或格式错误
$dbhandle->where($where, NULL, false);
}
}
// 克隆对象,用于单独执行 count 查询
$db_count = clone($dbhandle);
$total = $db_count->count_all_results($tablename);
// 重新构建查询以获取实际数据
$db_data = clone($dbhandle);
// 应用限制和偏移
if ($limit) {
$db_data->limit($limit);
}
if ($offset) {
$db_data->offset($offset);
}
// 应用排序
if ($order_by) {
$db_data->order_by($order_by);
}
// 执行查询并返回结果
$data = $db_data->get($tablename)->result_array();
return array('total' => $total, 'data' => $data);
}
}
进阶技巧:带参数的分页与缺陷修复
第4步:处理混合查询参数分页
当分页同时需要支持搜索筛选(GET参数)和页码切换时,建议流程如下:
- 在 Controller 的搜索方法中,使用
$this->input->get()获取所有查询参数。 - 将查询参数传递给 Model 进行过滤和分页计算。
- 保留 GET 参数到分页链接中,确保翻页不丢失搜索条件。
第5步:修复负值页码 Bug
在 CI 原生的 system/libraries/Pagination.php 文件中,当用户手动输入负数的页码时(例如访问 /news/page/-1000),可能会导致生成的分页链接出现负值异常。官方部分版本仅在页码为 0 时重置,建议检查并修改判断逻辑以兼容负数情况。
找到 system/libraries/Pagination.php 中的类似以下代码块:
if ($this->use_page_numbers AND $this->cur_page == 0) {
$this->cur_page = $base_page;
}
将其修改为更严谨的判断,涵盖负数情况:
// 推荐修正写法
if ($this->use_page_numbers AND $this->cur_page <= 0) {
$this->cur_page = $base_page;
}
此修正能确保无论用户尝试访问第几页的错误地址,系统都会安全地重定向至第一页或基础页码,避免前端渲染出错。
总结
合理配置 Pagination 库并配合 Model 层的逻辑封装,可以显著降低 CodeIgniter 项目中列表页的开发复杂度。通过统一的数据返回结构和完善的边界条件处理,能够构建出稳定且易于维护的分页模块。
以上就是 CodeIgniter 框架分页函数及相关知识的详细内容,更多关于 CodeIgniter 开发技巧的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









