CakePHP 分页器:从下一页获取第一项?

问题描述

我有一个包含不同版本文本的表格。我想显示每个版本与以前版本的差异。我还想对版本进行分页,以防超过 20 个。但是,要区分每页上的最后一个文本,我需要下一页的第一个文本。我不能只是将页面大小变大(在这种情况下为 21),因为第二个页面将跳过其第一个实体,而第三个将跳过其前两个实体,以此类推。

$config = $this->Paginator->getConfig();
$this->Paginator->setConfig('limit',$config['limit'] + 1);
$inscriptions = $this->paginate($query);

我或许可以通过对单个实体进行单独的 ->paginate() 调用解决问题,但如果可能,我宁愿不执行第二个查询

$inscriptions = $this->paginate($query);

$config = $this->Paginator->getConfig();
$this->Paginator->setConfig([
    'limit' => 1,'page' => ($config['page'] * $config['limit']) + 1
]);
$inscriptions[] = $this->paginate($query)->first();

有没有办法跳过前 n 个结果?在这种情况下,我可以页面大小设置为 21,但将页码设置为 1,并跳过第一个 ((old page number - 1) * old page size) 实体。

解决方法

可以制作一个扩展默认分页器的自定义分页器,但功能如下所述:

<?php
namespace App\Datasource;

use Cake\Core\InstanceConfigTrait;
use Cake\Datasource\Paginator;
use Cake\Datasource\QueryInterface;
use Cake\Datasource\RepositoryInterface;

class DiffPaginator extends Paginator
{
    use InstanceConfigTrait;

    protected function getQuery(RepositoryInterface $object,?QueryInterface $query = null,array $data): QueryInterface
    {
        $data['options']['offset'] = ($data['options']['page'] - 1) * $data['options']['limit'];
        $data['options']['limit'] += 1;
        unset($data['options']['page']);

        return parent::getQuery($object,$query,$data);
    }

    protected function buildParams(array $data): array
    {
        $paging = parent::buildParams($data);
        if ($paging['current'] == $paging['perPage'] + 1) {
            $paging['current'] -= 1;
        }
        return $paging;
    }
}

然后在您的控制器中使用以下内容:

$this->Paginator->setPaginator(new DiffPaginator);

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...