CI分页搜索实现

一、背景说明
   由于公司新启动了一个项目,在开发的前期,老大说这次用CI框架来做,于是就开始了各种研究。因为是管理系统的项目,所以会有很多的搜索分页实现,但是在用CI原生的分页时候发觉达不到效果。比如说,有些时候需要同时保存username和gender的条件查询而进行分页,试了用session和get的方法,最后折腾了一天,终于搞定了,现在记录一下这个过程吧。

二、实现说明
  1. 利用URI类的segment来判断是否为第一次加载,以致设置相应的查询条件;
  2. 利用session来保存相应的查询条件;
  3. 设置分页类来达到效果;

三、具体步骤
   1.设置公共函数,进行分页设置选项,具体代码如下:
/**
     * 分页生成
     * @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'] = "<table width='100%'> <tr  style=\"background-color:#eee;line-height:25px;\" align='right'><td>";
        $config['full_tag_close'] = '</td></tr></table>';

        $config['first_link'] = '首页';
        $config['first_tag_open'] = ' <span class="page_link">[';
        $config['first_tag_close'] = ']</span> ';

        $config['last_link'] = '尾页';
        $config['last_tag_open'] = ' <span class="page_link">[';
        $config['last_tag_close'] = ']</span"> ';

        $config['next_link'] = '下一页';
        $config['next_tag_open'] = ' <span class="page_link">[';
        $config['next_tag_close'] = ']</span"> ';

        $config['prev_link'] = '上一页';
        $config['prev_tag_open'] = '<span class="page_link">[';
        $config['prev_tag_close'] = ']</span">';

        $config['num_tag_open'] = ' <span class="page_link">[';
        $config['num_tag_close'] = ']</span"> ';

        $config['cur_tag_open'] = ' [<span style="color:red;font-weight:bold;">';
        $config['cur_tag_close'] = '</span>] ';
        return $config;
    }


   大概说一下,除了基本CI要求的参数之外,还有一个参数:
  
  $config['cur_page'] = $cur_page;
        这个是设置当前页码的参数,多设置这个参数有一个原因,当用户点击查询重新加载新的数据的时候,需要分页显示的页码设置成第一页,所以用了如下代码来判断:
  
    if ($offset == 0) {
        $cur_page = 1;
    }
      即偏移量为0则跳转到第一页;
  
   2.在Controllers设置相应处理
  部分代码如下:

 

    //计算偏移量,保留和删除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()方法,对如下代码:
    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语句进行修改为:
if (($CI->uri->segment($this->uri_segment) != $base_page)&& $this->cur_page == 0)

用这个判断来修复当用户点击查询时,实际为第一页,但是页码显示第二页的BUG;


     3)最后一个地方的修改,
$first_url = ($this->first_url == '') ? $this->base_url : $this->first_url;

这条语句是用来首页的代码,因为本方法是通过判断segment来判断是否为首次加载,原生CI分页当点击首页时出现的链接地址此部分segment为空,就会导致当已经选择条件查询分页时,点击首页把所有条件删除,所以改为如下即可:

$first_url = ($this->first_url == '') ? $this->base_url.'1' : $this->first_url;

总结

到现在已经完成了CI的分页搜索,因为接触时间也不长,有错误之处欢迎指正:-)

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值