From 8e37bfb03f6922f1b25cb324a02f2ba003eb173e Mon Sep 17 00:00:00 2001 From: Alex Pott <alex.a.pott@googlemail.com> Date: Thu, 13 Feb 2020 09:31:58 +0000 Subject: [PATCH] Issue #3088077 by Sam152, bkosborne, rensingh99, tim.plunkett: Layout builder does not correctly bubble up cache metadata for empty blocks --- .../BlockComponentRenderArray.php | 7 +++++++ .../Unit/BlockComponentRenderArrayTest.php | 19 +++++++++++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/core/modules/layout_builder/src/EventSubscriber/BlockComponentRenderArray.php b/core/modules/layout_builder/src/EventSubscriber/BlockComponentRenderArray.php index 8cde7674a16b..d9218b538776 100644 --- a/core/modules/layout_builder/src/EventSubscriber/BlockComponentRenderArray.php +++ b/core/modules/layout_builder/src/EventSubscriber/BlockComponentRenderArray.php @@ -5,6 +5,7 @@ use Drupal\block_content\Access\RefinableDependentAccessInterface; use Drupal\Core\Access\AccessResult; use Drupal\Core\Block\BlockPluginInterface; +use Drupal\Core\Cache\CacheableMetadata; use Drupal\Core\Render\Element; use Drupal\Core\Render\PreviewFallbackInterface; use Drupal\Core\Session\AccountInterface; @@ -102,6 +103,12 @@ public function onBuildRender(SectionComponentBuildRenderArrayEvent $event) { } $content = $block->build(); + + // We don't output the block render data if there are no render elements + // found, but we want to capture the cache metadata from the block + // regardless. + $event->addCacheableDependency(CacheableMetadata::createFromRenderArray($content)); + $is_content_empty = Element::isEmpty($content); $is_placeholder_ready = $event->inPreview() && $block instanceof PreviewFallbackInterface; // If the content is empty and no placeholder is available, return. diff --git a/core/modules/layout_builder/tests/src/Unit/BlockComponentRenderArrayTest.php b/core/modules/layout_builder/tests/src/Unit/BlockComponentRenderArrayTest.php index 117c76f7deec..31efc509abc0 100644 --- a/core/modules/layout_builder/tests/src/Unit/BlockComponentRenderArrayTest.php +++ b/core/modules/layout_builder/tests/src/Unit/BlockComponentRenderArrayTest.php @@ -99,7 +99,10 @@ public function testOnBuildRender($refinable_dependent_access) { $placeholder_label = 'Placeholder Label'; $block->getPreviewFallbackString()->willReturn($placeholder_label); - $block_content = ['#markup' => 'The block content.']; + $block_content = [ + '#markup' => 'The block content.', + '#cache' => ['tags' => ['build-tag']], + ]; $block->build()->willReturn($block_content); $this->blockManager->createInstance('some_block_id', ['id' => 'some_block_id'])->willReturn($block->reveal()); @@ -122,7 +125,10 @@ public function testOnBuildRender($refinable_dependent_access) { $expected_cache = $expected_build + [ '#cache' => [ 'contexts' => [], - 'tags' => ['test'], + 'tags' => [ + 'build-tag', + 'test', + ], 'max-age' => -1, ], ]; @@ -410,7 +416,9 @@ public function testOnBuildRenderEmptyBuild() { $block->getBaseId()->willReturn('block_plugin_id'); $block->getDerivativeId()->willReturn(NULL); - $block->build()->willReturn([]); + $block->build()->willReturn([ + '#cache' => ['tags' => ['build-tag']], + ]); $this->blockManager->createInstance('some_block_id', ['id' => 'some_block_id'])->willReturn($block->reveal()); $component = new SectionComponent('some-uuid', 'some-region', ['id' => 'some_block_id']); @@ -423,7 +431,10 @@ public function testOnBuildRenderEmptyBuild() { $expected_cache = $expected_build + [ '#cache' => [ 'contexts' => [], - 'tags' => ['test'], + 'tags' => [ + 'build-tag', + 'test', + ], 'max-age' => -1, ], ]; -- GitLab