<?php declare(strict_types=1); /* * This file is part of the TYPO3 CMS project. * * It is free software; you can redistribute it and/or modify it under * the terms of the GNU General Public License, either version 2 * of the License, or any later version. * * For the full copyright and license information, please read the * LICENSE.txt file that was distributed with this source code. * * The TYPO3 project - inspiring people to share! */ namespace SGalinski\SgNews\Paginator; use TYPO3\CMS\Core\Pagination\AbstractPaginator; use TYPO3\CMS\Extbase\Persistence\QueryResultInterface; /** * Copied QueryResult Paginator for us to get a raw result returned, * just like the old Controller used to use, also alot of BE ViewHelpers want an array */ final class QueryBuilderPaginator extends AbstractPaginator { /** * @var \TYPO3\CMS\Core\Database\Query\QueryBuilder */ private $queryBuilder; /** * @var array */ private $paginatedQueryResult; /** * @var int */ protected int $totalItems = 0; public function __construct( \TYPO3\CMS\Core\Database\Query\QueryBuilder $queryBuilder, int $currentPageNumber = 1, int $itemsPerPage = 10 ) { $this->queryBuilder = $queryBuilder; $this->setCurrentPageNumber($currentPageNumber); $this->setItemsPerPage($itemsPerPage); $this->updateInternalState(); } /** * @return iterable|QueryResultInterface */ public function getPaginatedItems(): iterable { return $this->paginatedQueryResult; } protected function updatePaginatedItems(int $limit, int $offset): void { $this->paginatedQueryResult = $this->queryBuilder ->setMaxResults($limit) ->setFirstResult($offset) ->execute()->fetchAll(); } protected function getTotalAmountOfItems(): int { $countBuilder = clone $this->queryBuilder; try { $totalItems = $countBuilder ->setMaxResults(99999) ->setFirstResult(0) ->count('uid') ->execute()->fetchOne(); } catch (\Exception $e) { $totalItems = $countBuilder ->setMaxResults(99999) ->setFirstResult(0) ->count('p.uid') ->execute()->fetchOne(); } $this->setTotalItems($totalItems ?: 0); return $totalItems ?: 0; } protected function getAmountOfItemsOnCurrentPage(): int { return count($this->paginatedQueryResult); } /** * @return int */ public function getTotalItems(): int { return $this->totalItems; } /** * @param int $totalItems */ public function setTotalItems(int $totalItems): void { $this->totalItems = $totalItems; } }