Cakephp检索超过限制的页面

时间:2015-04-01 12:11:38

标签: php cakephp paginator

我正在使用cakephp 1.3 paginator,它工作正常,除了这个:

如果我有5页,可以通过这种网址访问

http://example.com/blog/5

我将获得最后一页,但如果我访问

http://example.com/blog/10

我也获得最后页面。但我想不检索任何值,因为它不是有效的页面。

我的配置是这样的:

  var $paginate = array(
        'Post' => array(
            'limit' => 10,
            'order' => array('Post.id' => 'desc')           
        ) 
    );

$posts = $this->paginate('Post');

2 个答案:

答案 0 :(得分:1)

嗯,遗憾的是它是如何运作的until CakePHP 2.3,它被埋在Controller::paginate()方法的中间:

<强> https://github.com/cakephp/cakephp/blob/1.3.20/cake/libs/controller/controller.php#L1214-L1215

// ...

if ($page === 'last' || $page >= $pageCount) {
    $options['page'] = $page = $pageCount;

// ...

所以你自己只有一个选项calculate the page count,并用它来验证当前页面。

答案 1 :(得分:0)

如果有人对cakephp 1.3的这个问题感兴趣,我将根据@ndm回答解释我的解决方案。

方案如下

  • Paginate方法运行不正常,所以我需要重写它
  • 我不想更新cake \ controller.php文件,因为当我用最后的1.3分支更新版本时(如果有的话)我将不得不重新修改它,问题是我可能会忘记做吧。
  • 我不想在app_controller中编写修复代码,因为分页方法太长而且代码感觉很吵。

所以我决定创建一个新的PageController,它将扩展Controller类,并将由AppController进行扩展。

在这个文件中,我放了WHOLE paginate方法,并在@ndm提到之前做了一个简单的修复:

        if ($page >= $pageCount)
        {
            return array(); //return empty array, so no rows found.
        }

        if ($page === 'last') {
            $options['page'] = $page = $pageCount;
        } elseif (intval($page) < 1) {
            $options['page'] = $page = 1;
        }

最后我用include来帮助AppController找到PagerController:

<?php
include("pager_controller.php");

class AppController extends PagerController
{ 
     .....
}

它工作得很好,我可以毫不犹豫地更新cakephp 1.3版本(再次发生),也没有看到丑陋的paginate方法的编码。

希望它可以帮助你