diff --git a/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php b/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php index b1a1bf0..4a53b83 100644 --- a/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php +++ b/core/modules/views/src/Plugin/views/display/DisplayPluginBase.php @@ -2365,7 +2365,7 @@ public static function buildBasicRenderable($view_id, $display_id, array $args = '#arguments' => $args, '#embed' => FALSE, '#cache' => [ - 'keys' => ['views', 'display', $view_id, $display_id], + 'keys' => ['view', $view_id, 'display', $display_id, 'args', implode(',', $args)], ], ]; diff --git a/core/modules/views/src/Tests/AssertViewsCacheTagsTrait.php b/core/modules/views/src/Tests/AssertViewsCacheTagsTrait.php index eac7f0c..b5a15c6 100644 --- a/core/modules/views/src/Tests/AssertViewsCacheTagsTrait.php +++ b/core/modules/views/src/Tests/AssertViewsCacheTagsTrait.php @@ -34,7 +34,7 @@ * A set of cache tags expected to be set on the built view's render array. * * @return array - * The render array + * The render array. */ protected function assertViewsCacheTags(ViewExecutable $view, $expected_results_cache, $views_caching_is_enabled, array $expected_render_array_cache_tags) { /** @var \Drupal\Core\Render\RendererInterface $renderer */ @@ -119,6 +119,9 @@ protected function assertViewsCacheTags(ViewExecutable $view, $expected_results_ * The expected render cache tags. * @param bool $views_caching_is_enabled * Defines whether views output / render caching is enabled. + * + * @return array + * The render array. */ protected function assertViewsCacheTagsFromStaticRenderArray(ViewExecutable $view, array $expected_render_array_cache_tags, $views_caching_is_enabled) { $original = $build = DisplayPluginBase::buildBasicRenderable($view->id(), $view->current_display ?: 'default', $view->args); @@ -158,6 +161,8 @@ protected function assertViewsCacheTagsFromStaticRenderArray(ViewExecutable $vie else { $this->assertFalse($render_cache_item, 'Render cache item not found.'); } + + return $build; } } diff --git a/core/modules/views/src/Tests/RenderCacheIntegrationTest.php b/core/modules/views/src/Tests/RenderCacheIntegrationTest.php index 93fa2fa..f734ae6 100644 --- a/core/modules/views/src/Tests/RenderCacheIntegrationTest.php +++ b/core/modules/views/src/Tests/RenderCacheIntegrationTest.php @@ -8,6 +8,7 @@ namespace Drupal\views\Tests; use Drupal\Core\Cache\Cache; +use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Language\LanguageInterface; use Drupal\entity_test\Entity\EntityTest; use Drupal\views\Views; @@ -90,15 +91,18 @@ protected function assertCacheTagsForFieldBasedView($do_assert_views_caches) { $view = Views::getview('entity_test_fields'); // Empty result (no entities yet). + $this->pass('Test without entities'); $base_tags = ['config:views.view.entity_test_fields', 'entity_test_list']; $this->assertViewsCacheTags($view, $base_tags, $do_assert_views_caches, $base_tags); $this->assertViewsCacheTagsFromStaticRenderArray($view, $base_tags, $do_assert_views_caches); // Non-empty result (1 entity). + /** @var \Drupal\Core\Entity\EntityInterface[] $entities */ $entities[] = $entity = EntityTest::create(); $entity->save(); + $this->pass('Test with entities'); $tags_with_entity = Cache::mergeTags($base_tags, $entities[0]->getCacheTags()); $this->assertViewsCacheTags($view, $tags_with_entity, $do_assert_views_caches, $tags_with_entity); $this->assertViewsCacheTagsFromStaticRenderArray($view, $tags_with_entity, $do_assert_views_caches); @@ -109,7 +113,9 @@ protected function assertCacheTagsForFieldBasedView($do_assert_views_caches) { $entities[] = $entity = EntityTest::create(); $entity->save(); } + // Page 1. + $this->pass('Test pager'); $this->pass('Page 1'); \Drupal::request()->query->set('page', 0); $tags_page_1 = Cache::mergeTags($base_tags, $entities[1]->getCacheTags(), $entities[2]->getCacheTags(), $entities[3]->getCacheTags(), $entities[4]->getCacheTags(), $entities[5]->getCacheTags()); @@ -132,6 +138,7 @@ protected function assertCacheTagsForFieldBasedView($do_assert_views_caches) { $entities[0]->name->value = $random_name = $this->randomMachineName(); $entities[0]->save(); $build = $this->assertViewsCacheTags($view, $tags_page_2, $do_assert_views_caches, $tags_page_2); + // @todo Static render arrays don't support different pages yet. // $this->assertViewsCacheTagsFromStaticRenderArray($view, $tags_page_2, $do_assert_views_caches); $this->assertTrue(strpos($build['#markup'], $random_name) !== FALSE); $view->destroy(); @@ -144,6 +151,39 @@ protected function assertCacheTagsForFieldBasedView($do_assert_views_caches) { $build = $this->assertViewsCacheTags($view, $tags_page_1, $do_assert_views_caches, $tags_page_1); $this->assertViewsCacheTagsFromStaticRenderArray($view, $tags_page_1, $do_assert_views_caches); $this->assertTrue(strpos($build['#markup'], $random_name) !== FALSE); + $view->destroy(); + + // Setup arguments to ensure that render caching also varies by them. + $this->pass('Test arguments'); + + // Custom assert for a single result row. + $single_entity_assertions = function(array $build, EntityInterface $entity) { + $this->setRawContent($build['#markup']); + + $result = $this->cssSelect('div.views-row'); + $count = count($result); + $this->assertEqual($count, 1); + + $this->assertEqual((string) $result[0]->div->span, (string) $entity->id()); + }; + + $tags_argument = Cache::mergeTags($base_tags, $entities[0]->getCacheTags()); + $view->setArguments([$entities[0]->id()]); + $build = $this->assertViewsCacheTags($view, $tags_argument, $do_assert_views_caches, $tags_argument); + $single_entity_assertions($build, $entities[0]); + + $view->setArguments([$entities[0]->id()]); + $build = $this->assertViewsCacheTagsFromStaticRenderArray($view, $tags_argument, $do_assert_views_caches); + $single_entity_assertions($build, $entities[0]); + + // Set a different argument and ensure that the result is different. + $tags2_argument = Cache::mergeTags($base_tags, $entities[1]->getCacheTags()); + $view->setArguments([$entities[1]->id()]); + $build = $this->assertViewsCacheTagsFromStaticRenderArray($view, $tags2_argument, $do_assert_views_caches); + $single_entity_assertions($build, $entities[1]); + + $view->destroy(); + } /** 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 0f589a1..5f2592b 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 @@ -51,6 +51,15 @@ display: plugin_id: standard entity_type: entity_test entity_field: name + arguments: + id: + id: id + table: entity_test + field: id + plugin_id: numeric + entity_type: entity_test + entity_field: id + default_action: 'ignore' sorts: id: table: entity_test