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

7z5jn7bk  于 2022-11-11  发布在  PHP
关注(0)|答案(1)|浏览(159)

我有一个表格,其中包含不同版本的文本。我希望显示每个版本与前一个版本的差异。如果版本超过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,并跳过前((旧页码- 1)* 旧页面大小)实体。

kr98yfug

kr98yfug1#

可以创建一个自定义分页器来扩展默认分页器,但其功能如下所述:

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

相关问题