Skip to content
Snippets Groups Projects
Commit 65df175e authored by Kevin Ditscheid's avatar Kevin Ditscheid
Browse files

[BUGFIX] Fix wrong offset calculation

Integrate a general function into the AbstractController to
handle offset calculation for the pagination.
parent a654eb3d
No related branches found
Tags 5.1.0
No related merge requests found
...@@ -189,4 +189,20 @@ abstract class AbstractController extends ActionController { ...@@ -189,4 +189,20 @@ abstract class AbstractController extends ActionController {
'teaserImageObject' => $teaserImageObject, '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;
}
} }
...@@ -100,7 +100,7 @@ class LatestController extends AbstractController { ...@@ -100,7 +100,7 @@ class LatestController extends AbstractController {
// Redo this function, until $newsMetaData gets the $limit. Needed because of languagevisibility. // Redo this function, until $newsMetaData gets the $limit. Needed because of languagevisibility.
if (count($newsMetaData) < $limit) { if (count($newsMetaData) < $limit) {
$offset += $limit; $offset += $limit - 1;
$maxCount = $this->newsRepository->getCountOfLastUpdatedOrHighlightedNewsByCategories( $maxCount = $this->newsRepository->getCountOfLastUpdatedOrHighlightedNewsByCategories(
FALSE, $categoryUids, TRUE, $this->settings['sortBy'], $tagUids, $startTime, $endTime FALSE, $categoryUids, TRUE, $this->settings['sortBy'], $tagUids, $startTime, $endTime
); );
......
...@@ -96,15 +96,14 @@ class ListByCategoryController extends AbstractController { ...@@ -96,15 +96,14 @@ class ListByCategoryController extends AbstractController {
$startTime = (int) $this->settings['starttime']; $startTime = (int) $this->settings['starttime'];
$endTime = (int) $this->settings['endtime']; $endTime = (int) $this->settings['endtime'];
$offset = 0;
$newsPerPage = (int) $this->settings['newsLimitPerPage']; $newsPerPage = (int) $this->settings['newsLimitPerPage'];
if ($currentPageBrowserPage && $newsPerPage) {
$offset = $currentPageBrowserPage * $newsPerPage;
}
$newsCount = $this->newsRepository->newsCountByCategories($categoryUids, $tagUids, $startTime, $endTime); $newsCount = $this->newsRepository->newsCountByCategories($categoryUids, $tagUids, $startTime, $endTime);
$numberOfPages = ($newsPerPage <= 0 ? 0 : ceil($newsCount / $newsPerPage)); $numberOfPages = ($newsPerPage <= 0 ? 0 : ceil($newsCount / $newsPerPage));
$headerSet = FALSE; $headerSet = FALSE;
$offset = $this->calculatePaginationOffset($currentPageBrowserPage);
$news = $this->newsRepository->findAllSortedNewsByCategories( $news = $this->newsRepository->findAllSortedNewsByCategories(
$categoryUids, $newsPerPage, $offset, $this->settings['sortBy'], $tagUids, $startTime, $endTime $categoryUids, $newsPerPage, $offset, $this->settings['sortBy'], $tagUids, $startTime, $endTime
)->toArray(); )->toArray();
......
...@@ -133,23 +133,18 @@ class OverviewController extends AbstractController { ...@@ -133,23 +133,18 @@ class OverviewController extends AbstractController {
* @param array $newsByCategory * @param array $newsByCategory
* @param array $allNews * @param array $allNews
* @param array $newsFilter * @param array $newsFilter
* @param boolean $isInitialCall
* @param int $currentPageBrowserPage * @param int $currentPageBrowserPage
* @return void * @return void
* @throws \InvalidArgumentException * @throws \InvalidArgumentException
* @throws \TYPO3\CMS\Extbase\Persistence\Exception\InvalidQueryException * @throws \TYPO3\CMS\Extbase\Persistence\Exception\InvalidQueryException
*/ */
protected function overviewWithCategories( 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']; $newsLimitPerCategory = (int) $this->settings['newsLimit'];
$this->categoryRepository->setDefaultOrderings(['sorting' => Query::ORDER_ASCENDING]); $this->categoryRepository->setDefaultOrderings(['sorting' => Query::ORDER_ASCENDING]);
$offset = 0; $offset = $this->calculatePaginationOffset($currentPageBrowserPage, $newsLimitPerCategory);
if ($currentPageBrowserPage && $newsLimitPerCategory) {
$offset = ($currentPageBrowserPage * $newsLimitPerCategory) - ($isInitialCall ? 0 : 1);
}
if ($this->settings['onlyNewsWithinThisPageSection']) { if ($this->settings['onlyNewsWithinThisPageSection']) {
/** @noinspection PhpUndefinedMethodInspection */ /** @noinspection PhpUndefinedMethodInspection */
...@@ -246,7 +241,7 @@ class OverviewController extends AbstractController { ...@@ -246,7 +241,7 @@ class OverviewController extends AbstractController {
if ($maxNewsPerCategory < $newsLimitPerCategory && count($allNews) < $newsLimitPerCategory) { if ($maxNewsPerCategory < $newsLimitPerCategory && count($allNews) < $newsLimitPerCategory) {
$nextPage = $currentPageBrowserPage + 1; $nextPage = $currentPageBrowserPage + 1;
if ($nextPage <= $numberOfPages) { if ($nextPage <= $numberOfPages) {
$this->overviewWithCategories($newsByCategory, $allNews, $newsFilter, FALSE, $nextPage); $this->overviewWithCategories($newsByCategory, $allNews, $newsFilter, $nextPage);
return; return;
} }
} }
...@@ -278,22 +273,18 @@ class OverviewController extends AbstractController { ...@@ -278,22 +273,18 @@ class OverviewController extends AbstractController {
* @param array $newsByTag * @param array $newsByTag
* @param array $allNews * @param array $allNews
* @param array $newsFilter * @param array $newsFilter
* @param boolean $isInitialCall
* @param int $currentPageBrowserPage * @param int $currentPageBrowserPage
* @return void * @return void
* @throws \InvalidArgumentException * @throws \InvalidArgumentException
* @throws \TYPO3\CMS\Extbase\Persistence\Exception\InvalidQueryException * @throws \TYPO3\CMS\Extbase\Persistence\Exception\InvalidQueryException
*/ */
protected function overviewWithTags( 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']; $newsLimitPerTag = (int) $this->settings['newsLimit'];
$this->tagRepository->setDefaultOrderings(['sorting' => Query::ORDER_ASCENDING]); $this->tagRepository->setDefaultOrderings(['sorting' => Query::ORDER_ASCENDING]);
$offset = 0; $offset = $this->calculatePaginationOffset($currentPageBrowserPage, $newsLimitPerTag);
if ($currentPageBrowserPage && $newsLimitPerTag) {
$offset = ($currentPageBrowserPage * $newsLimitPerTag) - ($isInitialCall ? 0 : 1);
}
$tagPid = (int) $this->settings['tagPid']; $tagPid = (int) $this->settings['tagPid'];
if (!$tagPid) { if (!$tagPid) {
...@@ -399,7 +390,7 @@ class OverviewController extends AbstractController { ...@@ -399,7 +390,7 @@ class OverviewController extends AbstractController {
if ($maxNewsPerTag < $newsLimitPerTag && count($allNews) < $newsLimitPerTag) { if ($maxNewsPerTag < $newsLimitPerTag && count($allNews) < $newsLimitPerTag) {
$nextPage = $currentPageBrowserPage + 1; $nextPage = $currentPageBrowserPage + 1;
if ($nextPage <= $numberOfPages) { if ($nextPage <= $numberOfPages) {
$this->overviewWithTags($newsByTag, $allNews, $newsFilter, FALSE, $nextPage); $this->overviewWithTags($newsByTag, $allNews, $newsFilter, $nextPage);
return; return;
} }
} }
...@@ -440,7 +431,6 @@ class OverviewController extends AbstractController { ...@@ -440,7 +431,6 @@ class OverviewController extends AbstractController {
* *
* @param array $newsMetaData * @param array $newsMetaData
* @param array $newsFilter * @param array $newsFilter
* @param boolean $isInitialCall
* @param int $currentPageBrowserPage * @param int $currentPageBrowserPage
* @return void * @return void
* @throws \InvalidArgumentException * @throws \InvalidArgumentException
...@@ -448,7 +438,7 @@ class OverviewController extends AbstractController { ...@@ -448,7 +438,7 @@ class OverviewController extends AbstractController {
* @throws \TYPO3\CMS\Extbase\Mvc\Exception\NoSuchArgumentException * @throws \TYPO3\CMS\Extbase\Mvc\Exception\NoSuchArgumentException
*/ */
protected function overviewWithoutCategoriesAction( 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 // remember selection of the filter values, if any
$selectedTag = $this->tagRepository->findByUid((int) $newsFilter['tag']); $selectedTag = $this->tagRepository->findByUid((int) $newsFilter['tag']);
...@@ -456,12 +446,9 @@ class OverviewController extends AbstractController { ...@@ -456,12 +446,9 @@ class OverviewController extends AbstractController {
$this->view->assign('selectedTag', $selectedTag); $this->view->assign('selectedTag', $selectedTag);
$this->view->assign('selectedCategory', $selectedCategory); $this->view->assign('selectedCategory', $selectedCategory);
$offset = 0; $offset = $this->calculatePaginationOffset($currentPageBrowserPage);
$newsPerPage = (int) $this->settings['newsLimit']; $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']; $startTime = (int) $this->settings['starttime'];
$endTime = (int) $this->settings['endtime']; $endTime = (int) $this->settings['endtime'];
...@@ -528,7 +515,7 @@ class OverviewController extends AbstractController { ...@@ -528,7 +515,7 @@ class OverviewController extends AbstractController {
if (count($newsMetaData) < $newsPerPage) { if (count($newsMetaData) < $newsPerPage) {
$nextPage = $currentPageBrowserPage + 1; $nextPage = $currentPageBrowserPage + 1;
if ($nextPage <= $numberOfPages) { if ($nextPage <= $numberOfPages) {
$this->overviewWithoutCategoriesAction($newsMetaData, $newsFilter, FALSE, $nextPage); $this->overviewWithoutCategoriesAction($newsMetaData, $newsFilter, $nextPage);
return; return;
} }
} }
......
...@@ -28,6 +28,7 @@ namespace SGalinski\SgNews\Domain\Repository; ...@@ -28,6 +28,7 @@ namespace SGalinski\SgNews\Domain\Repository;
use TYPO3\CMS\Backend\Utility\BackendUtility; use TYPO3\CMS\Backend\Utility\BackendUtility;
use TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettings; use TYPO3\CMS\Extbase\Persistence\Generic\Typo3QuerySettings;
use TYPO3\CMS\Extbase\Persistence\QueryInterface;
use TYPO3\CMS\Extbase\Persistence\Repository; use TYPO3\CMS\Extbase\Persistence\Repository;
use TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController; use TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController;
use TYPO3\CMS\Frontend\Page\PageRepository; use TYPO3\CMS\Frontend\Page\PageRepository;
...@@ -79,4 +80,16 @@ abstract class AbstractRepository extends Repository { ...@@ -79,4 +80,16 @@ abstract class AbstractRepository extends Repository {
return $statement; 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));
}
} }
...@@ -169,7 +169,7 @@ class NewsRepository extends AbstractRepository { ...@@ -169,7 +169,7 @@ class NewsRepository extends AbstractRepository {
} elseif (count($constraints) === 1) { } elseif (count($constraints) === 1) {
$query->matching($constraints[0]); $query->matching($constraints[0]);
} }
return $query->count(); return $this->getCount($query);
} }
/** /**
...@@ -215,9 +215,9 @@ class NewsRepository extends AbstractRepository { ...@@ -215,9 +215,9 @@ class NewsRepository extends AbstractRepository {
$onlyHighlighted = FALSE, array $categoryIds = NULL, $hideNeverHighlightedNews = FALSE, $sortBy = 'date', $onlyHighlighted = FALSE, array $categoryIds = NULL, $hideNeverHighlightedNews = FALSE, $sortBy = 'date',
array $tagIds = NULL, $startTime = 0, $endTime = 0 array $tagIds = NULL, $startTime = 0, $endTime = 0
): int { ): int {
return $this->getQueryForLastUpdatedOrHighlightedNewsByCategories( return $this->getCount($this->getQueryForLastUpdatedOrHighlightedNewsByCategories(
0, $onlyHighlighted, $categoryIds, 0, $hideNeverHighlightedNews, $sortBy, $tagIds, $startTime, $endTime 0, $onlyHighlighted, $categoryIds, 0, $hideNeverHighlightedNews, $sortBy, $tagIds, $startTime, $endTime
)->count(); ));
} }
/** /**
...@@ -450,6 +450,6 @@ class NewsRepository extends AbstractRepository { ...@@ -450,6 +450,6 @@ class NewsRepository extends AbstractRepository {
$query->matching($constraints[0]); $query->matching($constraints[0]);
} }
return $query->count(); return $this->getCount($query);
} }
} }
  • Maintainer

    The commit message is wrong sadly. This commit isn't about fixing the offset, but fixing the count of results.

0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment