summaryrefslogtreecommitdiff
path: root/QueryBuilderPaginator.php
diff options
context:
space:
mode:
authorChristian Weiske <cweiske@cweiske.de>2026-01-19 08:29:59 +0100
committerChristian Weiske <cweiske@cweiske.de>2026-01-19 08:29:59 +0100
commit738d98d128059b52b99bda336f5410f3b9b6bd7b (patch)
treec898621e58c8461ee6ed16e2ce337636d1180c44 /QueryBuilderPaginator.php
download951-738d98d128059b52b99bda336f5410f3b9b6bd7b.tar.gz
951-738d98d128059b52b99bda336f5410f3b9b6bd7b.zip
Diffstat (limited to 'QueryBuilderPaginator.php')
-rw-r--r--QueryBuilderPaginator.php55
1 files changed, 55 insertions, 0 deletions
diff --git a/QueryBuilderPaginator.php b/QueryBuilderPaginator.php
new file mode 100644
index 0000000..02bed79
--- /dev/null
+++ b/QueryBuilderPaginator.php
@@ -0,0 +1,55 @@
+<?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);
+ }
+}