CI框架原生的分页类虽然简便但是非常蛋疼,特别是有比较少见的需求的时候…
比如这次需要在同个页面展示两个不同的分页链接,然后传入两个页码参数…折腾这个费了不少时间~ ~

首先是参考了这篇CodeIgniter分页类对多参数传递时的灵活处理,使用链接:http://域名/控制器/方法名/参数1/参数2 进行双重分页,然后在方法中接受两个参数,如:

1
2
3
4
public function index($page1,$page2)
{

//code.....
}

然后自己封装了个分页class,传了些必要的参数(包括uri_segment,base_url,suffix等)

这样当生成参数1的分页时把后缀suffix拼接上参数2:

http://域名/控制器/方法名/参数1/参数2 的分页则使用:

1
2
$config['uri_segment'] = 3;
$config['suffix'] = '/'.参数2;

当生成参数2的分页时把base_url拼接上参数1:

http://域名/控制器/方法名/参数1/参数2 的分页则使用:

1
2
$config['uri_segment'] = 4;
$config['base_url']=base_url() . '/' . $this->uri->segment(1) . '/' . $this->uri->segment(2)  . '/'.参数1;

这样刚好可以同时使用两个分页了,然后再参考上面那篇文章手动设置下$config[‘first_url’]以解决第一页的url不带页码的问题,基本上就能使用了.


但是,这时候发现了CI框架的一个蛋疼的bug:

当点击第一个分页的第2页链接后,第二个分页的当前页面(本应是第1页)也变成了2…就像这样:

CI_page_wrong

这和说好的不一样啊!!!明明正确设置了uri_segment的说….

再仔细分析,发现只有在第二个分页处在第1页时有这个bug~

于是翻源码~ ~ 在system/libraries/Pagination.php的第157行发现,在uri_segment不等于base_page时(也就是非第1页)才根据segment来判断当前页码,于是简单了,在157行后面加个else,如下:

1
2
3
4
5
6
7
8
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;
}else{
$this->cur_page = 1;//这里加个else,第一页默认页码赋值为1,修正单页面多个分页时cur_page出错的问题
}

这样,同个页面里的两个分页都能够正常工作了~ ~ !