diff --git a/core/modules/node/src/Tests/Views/FrontPageTest.php b/core/modules/node/src/Tests/Views/FrontPageTest.php index 8b522e4..cb97c61 100644 --- a/core/modules/node/src/Tests/Views/FrontPageTest.php +++ b/core/modules/node/src/Tests/Views/FrontPageTest.php @@ -249,6 +249,7 @@ public function testCacheTags() { 'node_view', 'user_view', 'user:0', + 'rendered', ]); $view->setDisplay('page_1'); $this->assertViewsCacheTags( diff --git a/core/modules/views/src/Plugin/views/cache/CachePluginBase.php b/core/modules/views/src/Plugin/views/cache/CachePluginBase.php index c4d628b..f446e94 100644 --- a/core/modules/views/src/Plugin/views/cache/CachePluginBase.php +++ b/core/modules/views/src/Plugin/views/cache/CachePluginBase.php @@ -298,12 +298,18 @@ public function generateResultsKey() { 'langcode' => \Drupal::languageManager()->getCurrentLanguage()->getId(), 'base_url' => $GLOBALS['base_url'], ); - foreach (array('exposed_info', 'page', 'sort', 'order', 'items_per_page', 'offset') as $key) { + foreach (array('exposed_info', 'sort', 'order') as $key) { if ($this->view->getRequest()->query->has($key)) { $key_data[$key] = $this->view->getRequest()->query->get($key); } } + $key_data['pager'] = [ + 'page' => $this->view->getCurrentPage(), + 'items_per_page' => $this->view->getItemsPerPage(), + 'offset' => $this->view->getOffset(), + ]; + $this->resultsKey = $this->view->storage->id() . ':' . $this->displayHandler->display['id'] . ':results:' . hash('sha256', serialize($key_data)); } diff --git a/core/modules/views/src/Tests/AssertViewsCacheTagsTrait.php b/core/modules/views/src/Tests/AssertViewsCacheTagsTrait.php index b3002bd..6ab4e12 100644 --- a/core/modules/views/src/Tests/AssertViewsCacheTagsTrait.php +++ b/core/modules/views/src/Tests/AssertViewsCacheTagsTrait.php @@ -25,7 +25,7 @@ * be set on the output cache item otherwise. */ protected function assertViewsCacheTags(ViewExecutable $view, $expected_results_cache, $expected_output_cache) { - $view->preview(); + $output = $view->preview(); /** @var \Drupal\views\Plugin\views\cache\CachePluginBase $cache_plugin */ $cache_plugin = $view->display_handler->getPlugin('cache'); @@ -57,6 +57,8 @@ protected function assertViewsCacheTags(ViewExecutable $view, $expected_results_ } $view->destroy(); + + return $output; } } diff --git a/core/modules/views/src/Tests/Plugin/CacheTest.php b/core/modules/views/src/Tests/Plugin/CacheTest.php index c336514..bc16be7 100644 --- a/core/modules/views/src/Tests/Plugin/CacheTest.php +++ b/core/modules/views/src/Tests/Plugin/CacheTest.php @@ -84,6 +84,48 @@ public function testTimeResultCaching() { } /** + * Tests result caching with a pager. + */ + public function testTimeResultCachingWithPager() { + // Create a basic result which just 2 results. + $view = Views::getView('test_cache'); + $view->setDisplay(); + $view->display_handler->overrideOption('cache', array( + 'type' => 'time', + 'options' => array( + 'results_lifespan' => '3600', + 'output_lifespan' => '3600' + ) + )); + + $mapping = ['views_test_data_name' => 'name']; + + $view->setDisplay('page_1'); + $view->setCurrentPage(0); + $this->executeView($view); + $this->assertIdenticalResultset($view, [['name' => 'John'], ['name' => 'George']], $mapping); + $view->destroy(); + + $view->setDisplay('page_1'); + $view->setCurrentPage(1); + $this->executeView($view); + $this->assertIdenticalResultset($view, [['name' => 'Ringo'], ['name' => 'Paul']], $mapping); + $view->destroy(); + + $view->setDisplay('page_1'); + $view->setCurrentPage(0); + $this->executeView($view); + $this->assertIdenticalResultset($view, [['name' => 'John'], ['name' => 'George']], $mapping); + $view->destroy(); + + $view->setDisplay('page_1'); + $view->setCurrentPage(2); + $this->executeView($view); + $this->assertIdenticalResultset($view, [['name' => 'Meredith']], $mapping); + $view->destroy(); + } + + /** * Tests no caching. * * @see views_plugin_cache_time diff --git a/core/modules/views/src/Tests/RenderCacheIntegrationTest.php b/core/modules/views/src/Tests/RenderCacheIntegrationTest.php index 29780b0..1e95134 100644 --- a/core/modules/views/src/Tests/RenderCacheIntegrationTest.php +++ b/core/modules/views/src/Tests/RenderCacheIntegrationTest.php @@ -60,6 +60,26 @@ public function testFieldBasedView() { $tags_exceeding_page = array_merge($base_tags, $entities[1]->getCacheTags(), $entities[2]->getCacheTags(), $entities[3]->getCacheTags(), $entities[4]->getCacheTags(), $entities[5]->getCacheTags()); $this->assertViewsCacheTags($view, $tags_exceeding_page, $tags_exceeding_page); + $view->destroy(); + + $view->setCurrentPage(1); + $this->assertViewsCacheTags($view, array_merge($base_tags, $entities[0]->getCacheTags()), array_merge($base_tags, $entities[0]->getCacheTags())); + $view->destroy(); + + // Ensure that invalidation on both pages work. + $view->setCurrentPage(1); + $entities[0]->name->value = $random_name = $this->randomMachineName(); + $entities[0]->save(); + + $output = $this->assertViewsCacheTags($view, array_merge($base_tags, $entities[0]->getCacheTags()), array_merge($base_tags, $entities[0]->getCacheTags())); + $this->assertTrue(strpos($output['#markup'], $random_name) !== FALSE); + $view->destroy(); + + $view->setCurrentPage(0); + $entities[1]->name->value = $random_name = $this->randomMachineName(); + $entities[1]->save(); + $output = $this->assertViewsCacheTags($view, $tags_exceeding_page, $tags_exceeding_page); + $this->assertTrue(strpos($output['#markup'], $random_name) !== FALSE); } public function testEntityRenderBasedView() { diff --git a/core/modules/views/tests/modules/views_test_config/test_views/views.view.entity_test_fields.yml b/core/modules/views/tests/modules/views_test_config/test_views/views.view.entity_test_fields.yml index 8641d2b..8966bb8 100644 --- a/core/modules/views/tests/modules/views_test_config/test_views/views.view.entity_test_fields.yml +++ b/core/modules/views/tests/modules/views_test_config/test_views/views.view.entity_test_fields.yml @@ -61,7 +61,7 @@ display: entity_field: id order: desc pager: - type: some + type: full options: items_per_page: 5 style: diff --git a/core/modules/views/tests/modules/views_test_config/test_views/views.view.entity_test_row.yml b/core/modules/views/tests/modules/views_test_config/test_views/views.view.entity_test_row.yml index 023a3f3..2384fe0 100644 --- a/core/modules/views/tests/modules/views_test_config/test_views/views.view.entity_test_row.yml +++ b/core/modules/views/tests/modules/views_test_config/test_views/views.view.entity_test_row.yml @@ -28,7 +28,7 @@ display: entity_field: id order: desc pager: - type: some + type: full options: items_per_page: 5 style: diff --git a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_cache.yml b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_cache.yml index 82908d8..6dd5fc5 100644 --- a/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_cache.yml +++ b/core/modules/views/tests/modules/views_test_config/test_views/views.view.test_cache.yml @@ -42,3 +42,15 @@ display: table: views_test_data field: id relationship: none + + page_1: + display_plugin: page + id: page_1 + display_options: + defaults: + pager: false + pager: + type: full + options: + items_per_page: 2 +