如何去除CakePHP 2分页器生成链接中的url与limit参数
问题
在CakePHP 2的视图中使用分页器生成链接时,当前页面URL为:
http://les-clone.ryan/payday_admin/leads
翻页时分页器会自动在URL中添加编码后的路由参数url=payday_admin%2Fleads和limit参数,生成的链接示例如下:
http://les-clone.ryan/payday_admin/leads?url=payday_admin%2Fleads&page=2&limit=20
我只需要保留page参数,期望生成的链接格式为:
http://les-clone.ryan/payday_admin/leads?page=2
我的视图代码:
<nav aria-label="Page navigation example"> <ul class="pagination justify-content-end mb-0"> <?php echo $this->Paginator->prev('Prev', array('tag' => 'li', 'class'=>'page-item', ' class'=>'page-link'), null, array('class' => 'disabled page-item', 'tag' => 'li', 'disabledTag' => 'a', ' class' =>'page-link')); echo $this->Paginator->numbers(array('separator' => '', 'currentTag' => 'a', 'tag' => 'li', 'class'=>'page-item', 'currentClass' => 'disabled bg-primary text-white page-link', ' class'=>'page-link','modulus'=>6)); echo $this->Paginator->next('Next', array('tag' => 'li', 'class'=>'page-item', ' class'=>'page-link'), null, array('class' => 'disabled page-item', 'tag' => 'li', 'disabledTag' => 'a', 'currentClass'=>'page-link', ' class' =>'page-link')); ?> </ul> </nav>
控制器中的分页配置代码:
// define pagination settings $this->Paginator->settings = array( 'Application' => array( 'paramType' => 'querystring', 'totalLimit' => 20000, 'limit' => 20000, 'maxLimit' => $filters['pagination']['perPage'], 'fields' => array( 'Application.*', 'ApplicationPayday.*', 'ApplicationApiLink.*', 'ApplicationResponse.*', 'AffiliateId.*', 'Redirect.*' ), 'joins' => array( array( 'table' => 'tlp_application_paydays', 'alias' => 'ApplicationPayday', 'type' => 'LEFT', 'conditions' => array( 'ApplicationPayday.application_id = Application.id' ) ), array( 'table' => 'tlp_application_api_links', 'alias' => 'ApplicationApiLink', 'type' => 'LEFT', 'conditions' => array( 'ApplicationApiLink.application_id = Application.id' ) ), array( 'table' => 'tlp_application_responses', 'alias' => 'ApplicationResponse', 'type' => 'LEFT', 'conditions' => array( 'ApplicationResponse.application_id = Application.id' ) ), array( 'table' => 'tlp_affiliate_ids', 'alias' => 'AffiliateId', 'type' => 'LEFT', 'conditions' => array( 'AffiliateId.aff_id = Application.tlp_aff_id' ) ), array( 'table' => 'tlp_redirects', 'alias' => 'Redirect', 'type' => 'LEFT', 'conditions' => array( 'Redirect.application_id = Application.id' ) ) ), 'conditions' => array( 'Application.modified_timestamp >=' => $initialStartDate, 'Application.modified_timestamp <=' => $initialEndDate ), 'group' => array( 'Application.id' ), 'order' => array( 'Application.id' => 'desc' ), 'recursive' => -1 ) ); // run query to get applications via paginated settings $applications = $this->Paginator->paginate('Application');
解决方案
要去掉多余的url和limit参数,从控制器配置和视图调用两个层面调整即可:
1. 调整控制器分页配置
在控制器的分页设置中做两处修改:
- 移除
paramType => 'querystring',默认参数处理方式不会强制携带路由参数 - 让
limit值与maxLimit保持一致,避免分页器自动在链接中附加limit参数
修改后的控制器配置片段:
$this->Paginator->settings = array( 'Application' => array( // 移除paramType => 'querystring' 'totalLimit' => 20000, 'limit' => $filters['pagination']['perPage'], // 与maxLimit值统一 'maxLimit' => $filters['pagination']['perPage'], // 其他原有配置保持不变 ) );
2. 在视图中过滤分页参数
如果控制器调整后仍有多余参数,在调用分页器方法时,通过url参数指定只保留page参数:
修改视图中的分页器调用代码:
<nav aria-label="Page navigation example"> <ul class="pagination justify-content-end mb-0"> <?php echo $this->Paginator->prev('Prev', array('tag' => 'li', 'class'=>'page-item', 'class'=>'page-link', 'url' => array('?' => array('page' => $this->Paginator->current() - 1))), null, array('class' => 'disabled page-item', 'tag' => 'li', 'disabledTag' => 'a', 'class' =>'page-link') ); echo $this->Paginator->numbers(array( 'separator' => '', 'currentTag' => 'a', 'tag' => 'li', 'class'=>'page-item', 'currentClass' => 'disabled bg-primary text-white page-link', 'class'=>'page-link', 'modulus'=>6, 'url' => array('?' => array()) // 自动携带正确page参数,过滤其他参数 )); echo $this->Paginator->next('Next', array('tag' => 'li', 'class'=>'page-item', 'class'=>'page-link', 'url' => array('?' => array('page' => $this->Paginator->current() + 1))), null, array('class' => 'disabled page-item', 'tag' => 'li', 'disabledTag' => 'a', 'currentClass'=>'page-link', 'class' =>'page-link') ); ?> </ul> </nav>
3. 自定义分页Helper(可选)
如果上述方法无法满足需求,可以创建自定义分页Helper,重写生成URL的方法,强制只保留page参数。不过多数场景下,前两种方法已足够解决问题。
内容的提问来源于stack exchange,提问作者Ryan H
相关产品推荐
相关产品推荐

