[BUGFIX] List module pagination broken 49/29949/3
authorMarkus Klein <klein.t3@mfc-linz.at>
Thu, 8 May 2014 18:07:13 +0000 (20:07 +0200)
committerWouter Wolters <typo3@wouterwolters.nl>
Tue, 3 Jun 2014 21:50:00 +0000 (23:50 +0200)
A wrong formula is used to calculate the pointer
for the pages.
This patch also introduces a central function for
calculating the pointer to a page.

Resolves: #55320
Releases: 6.2
Change-Id: Ia4eec61f4f87b52d0d5e940e542998f9f82aa140
Reviewed-on: https://review.typo3.org/29949
Reviewed-by: Marcin Sągol
Tested-by: Marcin Sągol
Tested-by: Tymoteusz Motylewski
Reviewed-by: Wouter Wolters
Tested-by: Wouter Wolters
typo3/sysext/recordlist/Classes/RecordList/DatabaseRecordList.php

index 3d47fe3..de0a9bf 100644 (file)
@@ -902,6 +902,16 @@ class DatabaseRecordList extends \TYPO3\CMS\Recordlist\RecordList\AbstractDataba
        }
 
        /**
+        * Get pointer for first element on the page
+        *
+        * @param int $page Page number starting with 1
+        * @return int Pointer to first element on the page (starting with 0)
+        */
+       protected function getPointerForPage($page) {
+               return ($page - 1) * $this->iLimit;
+       }
+
+       /**
         * Creates a page browser for tables with many records
         *
         * @param string $renderPart Distinguish between 'top' and 'bottom' part of the navigation (above or below the records)
@@ -913,33 +923,27 @@ class DatabaseRecordList extends \TYPO3\CMS\Recordlist\RecordList\AbstractDataba
                $returnContent = '';
                // Show page selector if not all records fit into one page
                if ($totalPages > 1) {
-                       $first = ($previous = ($next = ($last = ($reload = ''))));
                        $listURL = $this->listURL('', $this->table);
                        // 1 = first page
-                       $currentPage = floor(($this->firstElementNumber + 1) / $this->iLimit) + 1;
+                       // 0 = first element
+                       $currentPage = floor($this->firstElementNumber / $this->iLimit) + 1;
                        // Compile first, previous, next, last and refresh buttons
                        if ($currentPage > 1) {
                                $labelFirst = $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_common.xlf:first');
-                               $first = '<a href="' . $listURL . '&pointer=0">' . IconUtility::getSpriteIcon('actions-view-paging-first', array('title' => $labelFirst)) . '</a>';
-                       } else {
-                               $first = IconUtility::getSpriteIcon('actions-view-paging-first-disabled');
-                       }
-                       if ($currentPage - 1 > 0) {
                                $labelPrevious = $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_common.xlf:previous');
-                               $previous = '<a href="' . $listURL . '&pointer=' . ($currentPage - 2) * $this->iLimit . '">' . IconUtility::getSpriteIcon('actions-view-paging-previous', array('title' => $labelPrevious)) . '</a>';
+                               $first = '<a href="' . $listURL . '&pointer=' . $this->getPointerForPage(1) . '">' . IconUtility::getSpriteIcon('actions-view-paging-first', array('title' => $labelFirst)) . '</a>';
+                               $previous = '<a href="' . $listURL . '&pointer=' . $this->getPointerForPage($currentPage - 1) . '">' . IconUtility::getSpriteIcon('actions-view-paging-previous', array('title' => $labelPrevious)) . '</a>';
                        } else {
+                               $first = IconUtility::getSpriteIcon('actions-view-paging-first-disabled');
                                $previous = IconUtility::getSpriteIcon('actions-view-paging-previous-disabled');
                        }
-                       if ($currentPage + 1 <= $totalPages) {
+                       if ($currentPage < $totalPages) {
                                $labelNext = $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_common.xlf:next');
-                               $next = '<a href="' . $listURL . '&pointer=' . $currentPage * $this->iLimit . '">' . IconUtility::getSpriteIcon('actions-view-paging-next', array('title' => $labelNext)) . '</a>';
-                       } else {
-                               $next = IconUtility::getSpriteIcon('actions-view-paging-next-disabled');
-                       }
-                       if ($currentPage != $totalPages) {
                                $labelLast = $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_common.xlf:last');
-                               $last = '<a href="' . $listURL . '&pointer=' . ($totalPages - 1) * $this->iLimit . '">' . IconUtility::getSpriteIcon('actions-view-paging-last', array('title' => $labelLast)) . '</a>';
+                               $next = '<a href="' . $listURL . '&pointer=' . $this->getPointerForPage($currentPage + 1) . '">' . IconUtility::getSpriteIcon('actions-view-paging-next', array('title' => $labelNext)) . '</a>';
+                               $last = '<a href="' . $listURL . '&pointer=' . $this->getPointerForPage($totalPages) . '">' . IconUtility::getSpriteIcon('actions-view-paging-last', array('title' => $labelLast)) . '</a>';
                        } else {
+                               $next = IconUtility::getSpriteIcon('actions-view-paging-next-disabled');
                                $last = IconUtility::getSpriteIcon('actions-view-paging-last-disabled');
                        }
                        $reload = '<a href="#" onclick="document.dblistForm.action=\'' . $listURL . '&pointer=\'+calculatePointer(document.getElementById(\'jumpPage-' . $renderPart . '\').value); document.dblistForm.submit(); return true;" title="' . $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_common.xlf:reload', TRUE) . '">' . IconUtility::getSpriteIcon('actions-system-refresh') . '</a>';