TYPO3: Query Builder Paginator

raw

0-README.rst

which only fetches the records that shall be displayed, instead of all records from database like the "QueryResultPaginator" does.

Rejected TYPO3 feature request: https://forge.typo3.org/issues/102194

raw

QueryBuilderPaginator.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
<?php
 
declare(strict_types=1);
 
namespace Vendor\Extension\Helper;
 
use TYPO3\CMS\Core\Database\Query\QueryBuilder;
use TYPO3\CMS\Core\Pagination\AbstractPaginator;
 
/**
 * Copy of TYPO3\CMS\Extbase\Pagination\QueryResultPaginator
 * that supports a QueryBuilder as source
 */
class QueryBuilderPaginator extends AbstractPaginator
{
    private QueryBuilder $queryBuilder;
 
    private array $paginatedQueryResult;
 
    public function __construct(
        QueryBuilder $queryBuilder,
        int $currentPageNumber = 1,
        int $itemsPerPage = 10
    ) {
        $this->queryBuilder = $queryBuilder;
        $this->setCurrentPageNumber($currentPageNumber);
        $this->setItemsPerPage($itemsPerPage);
 
        $this->updateInternalState();
    }
 
    public function getPaginatedItems(): iterable
    {
        return $this->paginatedQueryResult;
    }
 
    protected function updatePaginatedItems(int $limit, int $offset): void
    {
        $this->paginatedQueryResult = $this->queryBuilder
            ->setMaxResults($limit)
            ->setFirstResult($offset)
            ->execute()
            ->fetchAllAssociative();
    }
 
    protected function getTotalAmountOfItems(): int
    {
        return (clone $this->queryBuilder)->count('uid')->executeQuery()->fetchOne();
    }
 
    protected function getAmountOfItemsOnCurrentPage(): int
    {
        return count($this->paginatedQueryResult);
    }
}
 
Christian Weiske Christian Weiske
owner

History