diff --git a/core/lib/Drupal/Core/Entity/Query/QueryBase.php b/core/lib/Drupal/Core/Entity/Query/QueryBase.php index ed3d12b..1d651b9 100644 --- a/core/lib/Drupal/Core/Entity/Query/QueryBase.php +++ b/core/lib/Drupal/Core/Entity/Query/QueryBase.php @@ -290,12 +290,15 @@ public function pager($limit = 10, $element = NULL) { * setting this query to be a count query. */ protected function initializePager() { + // Get the currently active page. + $pager_page = pager_find_page($this->pager['element']); + + // If this query has a pager enabled, add the page to the query as a range. if ($this->pager && !empty($this->pager['limit']) && !$this->count) { - $page = pager_find_page($this->pager['element']); $count_query = clone $this; $this->pager['total'] = $count_query->count()->execute(); - $this->pager['start'] = $page * $this->pager['limit']; pager_default_initialize($this->pager['total'], $this->pager['limit'], $this->pager['element']); + $this->pager['start'] = $pager_page * $this->pager['limit']; $this->range($this->pager['start'], $this->pager['limit']); } } diff --git a/core/modules/system/src/Tests/Pager/PagerTest.php b/core/modules/system/src/Tests/Pager/PagerTest.php index 71413f2..0de500b 100644 --- a/core/modules/system/src/Tests/Pager/PagerTest.php +++ b/core/modules/system/src/Tests/Pager/PagerTest.php @@ -16,7 +16,7 @@ class PagerTest extends WebTestBase { * * @var array */ - public static $modules = ['dblog', 'pager_test']; + public static $modules = ['dblog', 'pager_test', 'node']; /** * A user with permission to access site reports. @@ -120,6 +120,13 @@ public function testMultiplePagers() { 'expected_page' => [0 => '3', 1 => '4', 4 => '5'], 'expected_query' => '?page=2,3,,,4', ], + // If negative values are passed as page numbers, the first page is + // returned. + [ + 'input_query' => '?page=-2,-6,,,5', + 'expected_page' => [0 => '1', 1 => '1', 4 => '6'], + 'expected_query' => '?page=0,0,,,5', + ], // If floats are passed as page numbers, only the integer part is // returned. [ @@ -174,6 +181,31 @@ public function testMultiplePagers() { } /** + * Test entity query pager. + */ + public function testEntityQueryPager() { + // Insert 10 node entities. The test module sets a pager limit of 2 to + // fetch data, so we will have 5 pages to flip through. + $this->drupalCreateContentType(['type' => 'article', 'name' => t('Article')]); + for ($i = 0; $i < 10; $i++) { + $this->drupalCreateNode(['type' => 'article', 'promote' => 1]); + } + + // Get first page. + $this->drupalGet('pager-test/entity-query-pager'); + $this->assertPagerItems(0); + + // Try getting a negative page, should still render the first one. + $this->drupalGet('pager-test/entity-query-pager', ['query' => ['page' => -5]]); + $this->assertPagerItems(0); + + // Try getting a page above the range, should render the last one. + $this->drupalGet('pager-test/entity-query-pager', ['query' => ['page' => 200]]); + $this->assertPagerItems(4); + + } + + /** * Test proper functioning of the ellipsis. */ public function testPagerEllipsis() { diff --git a/core/modules/system/tests/modules/pager_test/pager_test.routing.yml b/core/modules/system/tests/modules/pager_test/pager_test.routing.yml index ea6c9cb..625a797 100644 --- a/core/modules/system/tests/modules/pager_test/pager_test.routing.yml +++ b/core/modules/system/tests/modules/pager_test/pager_test.routing.yml @@ -1,3 +1,11 @@ +pager_test.entity_query_pager: + path: '/pager-test/entity-query-pager' + defaults: + _title: 'Page using an entity query pager for testing' + _controller: '\Drupal\pager_test\Controller\EntityQueryPagerTestController::entityQueryPager' + requirements: + _access: 'TRUE' + pager_test.multiple_pagers: path: '/pager-test/multiple-pagers' defaults: diff --git a/core/modules/system/tests/modules/pager_test/src/Controller/EntityQueryPagerTestController.php b/core/modules/system/tests/modules/pager_test/src/Controller/EntityQueryPagerTestController.php new file mode 100644 index 0000000..f5ee524 --- /dev/null +++ b/core/modules/system/tests/modules/pager_test/src/Controller/EntityQueryPagerTestController.php @@ -0,0 +1,41 @@ + 'id'], + ]; + $query = \Drupal::service('entity.query')->get('node'); + $query->pager(2); + $result = $query->execute(); + $rows = []; + foreach ($result as $row) { + $rows[] = ['data' => [$row]]; + } + + $build = []; + $build[] = [ + '#theme' => 'table', + '#header' => $header, + '#rows' => $rows, + '#empty' => $this->t("There are no node ids found in the db"), + ]; + $build[] = [ + '#type' => 'pager', + ]; + + return $build; + } + +}