提问者:小点点

当自定义查找器的限制更改时,CakePHP 3给出错误的分页输出


CakePHP 3.7.7

我正在使用Paginator(https://book.cakephp.org/3.0/en/views/helpers/paginator.html)显示具有972行的查询的分页。

在我的Controller方法中,我正在加载Paginator组件并使用名为findFilters()的自定义查找器来返回我想要分页的数据。

public function initialize()
{
    parent::initialize();
    $this->loadComponent('Paginator');
}

public $paginate = [
    'finder' => 'filters', // uses custom finder, findFilters() in src/Model/Table/FiltersTable.php
];

/*
 * Called via ajax. Renders the data and pagination to a template.
 */
public function getFilters()
{
    $this->viewBuilder()->setLayout('ajax');

    $this->loadModel('Filters');

    $rf_keywords = '';
    $rf_keywords = trim($this->request->getData('rf_keywords'));

    // Pagination settings (relevant to the question).           
    $page = $this->request->getData('page') ? (int)$this->request->getData('page') : 1;
    $this->paginate = ['limit' => 200, 'page' => $page];

    $finder = $this
        ->Filters
        ->find('filters' , [
            'rf_keywords' => $rf_keywords
        ]);

    $data = $this
        ->paginate($finder)
        ->toArray(); 

    $this->set('data', $data);
}

在我的模板(get_filters. ctp)中,我有以下内容来输出分页编号(要在页面之间单击的链接)和总数:

<?= $this->Paginator->numbers(); ?>
<?= $this->Paginator->counter([
'format' => 'Page {{page}} of {{pages}}, showing {{current}} records out of
         {{count}} total, starting on record {{start}}, ending on {{end}}'
]) ?>

问题是更改Controller中的限制

$this->paginate = ['limit' => 200];

…没有正确更新分页的输出。请参阅下面的示例:

'限制'=

第1页,共49页,显示972条记录中的20条,从记录1开始,到20结束

'限制'=

第1页,共10页,显示总共972条中的100条记录,从记录1开始,到100结束

'限制'=

第1页,共10页,显示总共972条中的100条记录,从记录1开始,到100结束

'限制'=

显示页码1-9和:

第1页,共10页,显示总共972条中的100条记录,从记录1开始,到100结束

所以有2个问题:

>

  • 它不适用于任何限制

    页码链接($this-

    getFilters()的ajax请求是通过jquery发出的,所以我在它们上设置了cache: false,以确保每个请求都附加一个时间戳到URL,以确保它不使用一些旧的缓存响应。

    我已经清除了tmp/cache/model/*中的文件

    我在浏览器中强制刷新。尝试了隐身/私人浏览窗口以确保它不是某些会话问题。

    这些事情都不能解决问题。

    如果分页的page部分被更改,问题也是一致的。例如使用page=

    为什么这不起作用?

    编辑-自定义Finder返回正确的数据,所以我认为这不是问题。签名如下,它返回一个通过分页执行的Query对象:

    // src/Model/Table/FiltersTable.php
    public function findFilters(Query $query, array $options)
    {
         // $query->find() ...
         // ...
         return $query;
    }
    

  • 共1个答案

    匿名用户

    有点晚了,但问题在于CakePHP 3分页的默认maxLimit设置,默认设置为100(参考下文)。

    https://book.cakephp.org/3/en/controllers/components/pagination.html#limit-the-maximum-number-of-rows-per-page

    当您将Controller中的设置更新为时,它应该可以做到这一点。

    public $paginate = [
        // Other keys here.
        'maxLimit' => 1000
    ];