CI分页搜索实现
分类: php 学习笔记2013-10-28 16:13 992人阅读 评论(2) 收藏 举报
ci分页搜索ci条件搜索分页ci编写条件分页搜索ci编写条件搜索codeigniter条件搜索
一、背景说明
由于公司新启动了一个项目,在开发的前期,老大说这次用CI框架来做,于是就开始了各种研究。因为是管理系统的项目,所以会有很多的搜索分页实现,但是在用CI原生的分页时候发觉达不到效果。比如说,有些时候需要同时保存username和gender的条件查询而进行分页,试了用session和get的方法,最后折腾了一天,终于搞定了,现在记录一下这个过程吧。
二、实现说明
利用URI类的segment来判断是否为第一次加载,以致设置相应的查询条件;
利用session来保存相应的查询条件;
设置分页类来达到效果;
三、具体步骤
1.设置公共函数,进行分页设置选项,具体代码如下:
[php] view plaincopy
/**
* 分页生成
* @param string $base_url 当前分页URL
* @param int $total_rows 数据总条数
* @param int $per_page 每页显示数据条数
* @param int $uri_segment 分页方法自动测定你 URI 的哪个部分包含页数
* @param int $cur_page 当前页码,用于条件查询时初始返回第一页
* @return mixed 分页信息
*/
public function getPageConfigInfo($base_url = null, $total_rows = 0, $per_page = 0, $uri_segment = 0,$offset=0) {
$config = array();
if ($offset == 0) {
$cur_page = 1;
}
if(isset($cur_page)){
$config['cur_page'] = $cur_page;
}
$config['base_url'] = site_url() . $base_url;
$config['total_rows'] = $total_rows;
$config['per_page'] = $per_page;
$config['uri_segment'] = $uri_segment;
$config['full_tag_open'] = "
";
$config['full_tag_close'] = ' |
$config['first_link'] = '首页';
$config['first_tag_open'] = ' [';
$config['first_tag_close'] = '] ';
$config['last_link'] = '尾页';
$config['last_tag_open'] = ' [';
$config['last_tag_close'] = '] ';
$config['next_link'] = '下一页';
$config['next_tag_open'] = ' [';
$config['next_tag_close'] = '] ';
$config['prev_link'] = '上一页';
$config['prev_tag_open'] = '[';
$config['prev_tag_close'] = ']';
$config['num_tag_open'] = ' [';
$config['num_tag_close'] = '] ';
$config['cur_tag_open'] = ' [';
$config['cur_tag_close'] = '] ';
return $config;
}
大概说一下,除了基本CI要求的参数之外,还有一个参数:
[php] view plaincopy
$config['cur_page'] = $cur_page;
这个是设置当前页码的参数,多设置这个参数有一个原因,当用户点击查询重新加载新的数据的时候,需要分页显示的页码设置成第一页,所以用了如下代码来判断:
[php] view plaincopy
if ($offset == 0) {
$cur_page = 1;
}
即偏移量为0则跳转到第一页;
2.在Controllers设置相应处理
部分代码如下:
[php] view plaincopy
//计算偏移量,保留和删除session条件
$offset = 0;
if ($this->uri->segment($this->uri_segment) != '') {
$offset = (int) ($this->uri->segment($this->uri_segment) - 1) * $this->per_page;
if ($this->session->userdata('search') != '') {
$where = $this->session->userdata('search'); //保持条件查询
}
} else {
$this->session->unset_userdata('client_ver');
$this->session->unset_userdata('deal_state');
$this->session->unset_userdata('phone_type');
$this->session->unset_userdata('begin_dt');
$this->session->unset_userdata('end_dt');
$this->session->unset_userdata('search');
}
//客户端版本条件查询
if ($this->input->post('client_version') != '') {
$_client_ver = $this->input->post('client_ver');
$where .= " AND client_version LIKE '%" . $_client_ver . "%'";
$this->session->set_userdata('client_ver', $_client_ver);
} else {
$this->session->unset_userdata('client_ver');
}
//操作状态条件查询
if ($this->input->post('deal_state') != '') {
$_deal_state = $this->input->post('state');
$where .= " AND deal_state='" . $_deal_state . "'";
$this->session->set_userdata('deal_state', $_deal_state);
} else {
$this->session->unset_userdata('deal_state');
}
至此,获取前台传入数据已经基本结束
3.修改Pagination.php类
1)先$use_page_numbers将此变量设置为TRUE,用页码代替偏移量,即显示分页时候1,2,3...
2)来到create_links()方法,对如下代码:
[php] view plaincopy
if ($CI->uri->segment($this->uri_segment) != $base_page)
{
$this->cur_page = $CI->uri->segment($this->uri_segment);
// Prep the current page - no funny business!
$this->cur_page = (int) $this->cur_page;
}
if语句进行修改为:
[php] view plaincopy
if (($CI->uri->segment($this->uri_segment) != $base_page)&& $this->cur_page == 0)
用这个判断来修复当用户点击查询时,实际为第一页,但是页码显示第二页的BUG;
3)最后一个地方的修改,
[php] view plaincopy
$first_url = ($this->first_url == '') ? $this->base_url : $this->first_url;
这条语句是用来首页的代码,因为本方法是通过判断segment来判断是否为首次加载,原生CI分页当点击首页时出现的链接地址此部分segment为空,就会导致当已经选择条件查询分页时,点击首页把所有条件删除,所以改为如下即可:
[php] view plaincopy
$first_url = ($this->first_url == '') ? $this->base_url.'1' : $this->first_url;
四、总结
到现在已经完成了CI的分页搜索,因为接触时间也不长,有错误之处欢迎指正:-)
版权声明:本文为博主原创文章,未经博主允许不得转载。
来源: