Cakephp 检索超过限制的页面

Cakephp retrieves pages over limit

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

如果我有5页,通过这种方式访问​​url

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');

嗯,不幸的是,它就是这样工作的 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您自己并使用它来验证当前页面。

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

场景如下

  • Paginate 方法效果不佳,因此我需要重写它
  • 我不想更新 cake\controller.php 文件,因为当我用最后一个 1.3 分支更新版本时(如果发生的话)我将不得不重新修复它,并且问题是我可能会忘记这样做。
  • 我不想在 app_controller 中编写修复代码,因为分页方法太长而且代码感觉很吵。

所以我决定创建一个新的 PageController,它将扩展控制器 class,并将由 AppController 扩展。

在这个文件中,我放入了整个分页方法,并进行了一个简单的修复,就在 @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
{ 
     .....
}

它工作得很好,我可以毫不犹豫地更新蛋糕php 1.3 版本(如果有的话再次更新),也不会看到丑陋的分页方法的编码。

希望对您有所帮助