diff --git a/Classes/Controller/AbstractController.php b/Classes/Controller/AbstractController.php index 251c5b9b3297d8d0d508d3d12fb92b15418a0687..af31b713b91a5be78f9761730581cec42dc328b1 100644 --- a/Classes/Controller/AbstractController.php +++ b/Classes/Controller/AbstractController.php @@ -189,4 +189,20 @@ abstract class AbstractController extends ActionController { 'teaserImageObject' => $teaserImageObject, ]; } + + /** + * Calculate the pagination offset + * + * @param int $currentPageBrowserPage + * @param int $newsLimitPerPage + * @return int + */ + protected function calculatePaginationOffset(int $currentPageBrowserPage, int $newsLimitPerPage = NULL){ + $offset = 0; + $newsPerPage = $newsLimitPerPage ?? (int) $this->settings['newsLimitPerPage']; + if ($currentPageBrowserPage > 0 && $newsPerPage > 0) { + $offset = $currentPageBrowserPage * $newsPerPage; + } + return $offset; + } } diff --git a/Classes/Controller/LatestController.php b/Classes/Controller/LatestController.php index d08977f29f5e6a5141837fd18deb49709e38a8b9..03a95c53677612da5ebaddb994503578430eeb81 100644 --- a/Classes/Controller/LatestController.php +++ b/Classes/Controller/LatestController.php @@ -100,7 +100,7 @@ class LatestController extends AbstractController { // Redo this function, until $newsMetaData gets the $limit. Needed because of languagevisibility. if (count($newsMetaData) < $limit) { - $offset += $limit; + $offset += $limit - 1; $maxCount = $this->newsRepository->getCountOfLastUpdatedOrHighlightedNewsByCategories( FALSE, $categoryUids, TRUE, $this->settings['sortBy'], $tagUids, $startTime, $endTime ); diff --git a/Classes/Controller/ListByCategoryController.php b/Classes/Controller/ListByCategoryController.php index d17c9179e97c2dd1e4b4525b61c2555a63d30f3e..5d63356001c67abbfd3351ac20c31b19c4865b74 100644 --- a/Classes/Controller/ListByCategoryController.php +++ b/Classes/Controller/ListByCategoryController.php @@ -96,15 +96,14 @@ class ListByCategoryController extends AbstractController { $startTime = (int) $this->settings['starttime']; $endTime = (int) $this->settings['endtime']; - $offset = 0; $newsPerPage = (int) $this->settings['newsLimitPerPage']; - if ($currentPageBrowserPage && $newsPerPage) { - $offset = $currentPageBrowserPage * $newsPerPage; - } + $newsCount = $this->newsRepository->newsCountByCategories($categoryUids, $tagUids, $startTime, $endTime); $numberOfPages = ($newsPerPage <= 0 ? 0 : ceil($newsCount / $newsPerPage)); $headerSet = FALSE; + $offset = $this->calculatePaginationOffset($currentPageBrowserPage); + $news = $this->newsRepository->findAllSortedNewsByCategories( $categoryUids, $newsPerPage, $offset, $this->settings['sortBy'], $tagUids, $startTime, $endTime )->toArray(); diff --git a/Classes/Controller/OverviewController.php b/Classes/Controller/OverviewController.php index a0aa8e8e7daaaafd1be225cf09a8eebd1685a448..415fe29480a48679a51d6800f60219e59459f866 100644 --- a/Classes/Controller/OverviewController.php +++ b/Classes/Controller/OverviewController.php @@ -133,23 +133,18 @@ class OverviewController extends AbstractController { * @param array $newsByCategory * @param array $allNews * @param array $newsFilter - * @param boolean $isInitialCall * @param int $currentPageBrowserPage * @return void * @throws \InvalidArgumentException * @throws \TYPO3\CMS\Extbase\Persistence\Exception\InvalidQueryException */ protected function overviewWithCategories( - array $newsByCategory = [], array $allNews = [], array $newsFilter = [], $isInitialCall = TRUE, $currentPageBrowserPage = 0 + array $newsByCategory = [], array $allNews = [], array $newsFilter = [], $currentPageBrowserPage = 0 ) { $newsLimitPerCategory = (int) $this->settings['newsLimit']; $this->categoryRepository->setDefaultOrderings(['sorting' => Query::ORDER_ASCENDING]); - $offset = 0; - - if ($currentPageBrowserPage && $newsLimitPerCategory) { - $offset = ($currentPageBrowserPage * $newsLimitPerCategory) - ($isInitialCall ? 0 : 1); - } + $offset = $this->calculatePaginationOffset($currentPageBrowserPage, $newsLimitPerCategory); if ($this->settings['onlyNewsWithinThisPageSection']) { /** @noinspection PhpUndefinedMethodInspection */ @@ -246,7 +241,7 @@ class OverviewController extends AbstractController { if ($maxNewsPerCategory < $newsLimitPerCategory && count($allNews) < $newsLimitPerCategory) { $nextPage = $currentPageBrowserPage + 1; if ($nextPage <= $numberOfPages) { - $this->overviewWithCategories($newsByCategory, $allNews, $newsFilter, FALSE, $nextPage); + $this->overviewWithCategories($newsByCategory, $allNews, $newsFilter, $nextPage); return; } } @@ -278,22 +273,18 @@ class OverviewController extends AbstractController { * @param array $newsByTag * @param array $allNews * @param array $newsFilter - * @param boolean $isInitialCall * @param int $currentPageBrowserPage * @return void * @throws \InvalidArgumentException * @throws \TYPO3\CMS\Extbase\Persistence\Exception\InvalidQueryException */ protected function overviewWithTags( - array $newsByTag = [], array $allNews = [], array $newsFilter = [], $isInitialCall = TRUE, $currentPageBrowserPage = 0 + array $newsByTag = [], array $allNews = [], array $newsFilter = [], $currentPageBrowserPage = 0 ) { $newsLimitPerTag = (int) $this->settings['newsLimit']; $this->tagRepository->setDefaultOrderings(['sorting' => Query::ORDER_ASCENDING]); - $offset = 0; - if ($currentPageBrowserPage && $newsLimitPerTag) { - $offset = ($currentPageBrowserPage * $newsLimitPerTag) - ($isInitialCall ? 0 : 1); - } + $offset = $this->calculatePaginationOffset($currentPageBrowserPage, $newsLimitPerTag); $tagPid = (int) $this->settings['tagPid']; if (!$tagPid) { @@ -399,7 +390,7 @@ class OverviewController extends AbstractController { if ($maxNewsPerTag < $newsLimitPerTag && count($allNews) < $newsLimitPerTag) { $nextPage = $currentPageBrowserPage + 1; if ($nextPage <= $numberOfPages) { - $this->overviewWithTags($newsByTag, $allNews, $newsFilter, FALSE, $nextPage); + $this->overviewWithTags($newsByTag, $allNews, $newsFilter, $nextPage); return; } } @@ -440,7 +431,6 @@ class OverviewController extends AbstractController { * * @param array $newsMetaData * @param array $newsFilter - * @param boolean $isInitialCall * @param int $currentPageBrowserPage * @return void * @throws \InvalidArgumentException @@ -448,7 +438,7 @@ class OverviewController extends AbstractController { * @throws \TYPO3\CMS\Extbase\Mvc\Exception\NoSuchArgumentException */ protected function overviewWithoutCategoriesAction( - array $newsMetaData = [], array $newsFilter = NULL, $isInitialCall = TRUE, $currentPageBrowserPage = 0 + array $newsMetaData = [], array $newsFilter = NULL, $currentPageBrowserPage = 0 ) { // remember selection of the filter values, if any $selectedTag = $this->tagRepository->findByUid((int) $newsFilter['tag']); @@ -456,12 +446,9 @@ class OverviewController extends AbstractController { $this->view->assign('selectedTag', $selectedTag); $this->view->assign('selectedCategory', $selectedCategory); - $offset = 0; + $offset = $this->calculatePaginationOffset($currentPageBrowserPage); + $newsPerPage = (int) $this->settings['newsLimit']; - if ($currentPageBrowserPage && $newsPerPage) { - // might be necessary for the recursive calling performance wise - $offset = ($currentPageBrowserPage * $newsPerPage) - ($isInitialCall ? 0 : 1); - } $startTime = (int) $this->settings['starttime']; $endTime = (int) $this->settings['endtime']; @@ -528,7 +515,7 @@ class OverviewController extends AbstractController { if (count($newsMetaData) < $newsPerPage) { $nextPage = $currentPageBrowserPage + 1; if ($nextPage <= $numberOfPages) { - $this->overviewWithoutCategoriesAction($newsMetaData, $newsFilter, FALSE, $nextPage); + $this->overviewWithoutCategoriesAction($newsMetaData, $newsFilter, $nextPage); return; } } diff --git a/Classes/Domain/Repository/AbstractRepository.php b/Classes/Domain/Repository/AbstractRepository.php index edea6aed5a412cdce6088d320a6f2c5c1c3ac1ca..49ad3c22f70749cf4b18fafb57dafea4b36affca 100644 --- a/Classes/Domain/Repository/AbstractRepository.php +++ b/Classes/Domain/Repository/AbstractRepository.php @@ -28,6 +28,7 @@ namespace SGalinski\SgNews\Domain\Repository; use TYPO3\CMS\Backend\Utility\BackendUtility; use TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettings; +use TYPO3\CMS\Extbase\Persistence\QueryInterface; use TYPO3\CMS\Extbase\Persistence\Repository; use TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController; use TYPO3\CMS\Frontend\Page\PageRepository; @@ -79,4 +80,16 @@ abstract class AbstractRepository extends Repository { return $statement; } + + /** + * This count returns the right amount of results, in contrast to $query->execute()->count(), which does not respect + * the language- nor the workspace overlay. + * + * @param QueryInterface $query The query object to use the count on + * + * @return int + */ + public function getCount(QueryInterface $query) { + return \count($query->execute(true)); + } } diff --git a/Classes/Domain/Repository/NewsRepository.php b/Classes/Domain/Repository/NewsRepository.php index a3f840be37db033bf367cd12d837082259b3bd35..079b48b6c85f4e9d724178abdaa394628ac9584d 100644 --- a/Classes/Domain/Repository/NewsRepository.php +++ b/Classes/Domain/Repository/NewsRepository.php @@ -169,7 +169,7 @@ class NewsRepository extends AbstractRepository { } elseif (count($constraints) === 1) { $query->matching($constraints[0]); } - return $query->count(); + return $this->getCount($query); } /** @@ -215,9 +215,9 @@ class NewsRepository extends AbstractRepository { $onlyHighlighted = FALSE, array $categoryIds = NULL, $hideNeverHighlightedNews = FALSE, $sortBy = 'date', array $tagIds = NULL, $startTime = 0, $endTime = 0 ): int { - return $this->getQueryForLastUpdatedOrHighlightedNewsByCategories( + return $this->getCount($this->getQueryForLastUpdatedOrHighlightedNewsByCategories( 0, $onlyHighlighted, $categoryIds, 0, $hideNeverHighlightedNews, $sortBy, $tagIds, $startTime, $endTime - )->count(); + )); } /** @@ -450,6 +450,6 @@ class NewsRepository extends AbstractRepository { $query->matching($constraints[0]); } - return $query->count(); + return $this->getCount($query); } }