diff --git a/core/lib/Drupal/Core/Render/Renderer.php b/core/lib/Drupal/Core/Render/Renderer.php index e2d7f5a..b50883c 100644 --- a/core/lib/Drupal/Core/Render/Renderer.php +++ b/core/lib/Drupal/Core/Render/Renderer.php @@ -207,12 +207,13 @@ protected function doRender(&$elements, $is_root_call = FALSE) { if (!isset($elements['#cache_no_placeholder']) && ($cached_element || isset($pre_bubbling_elements['#pre_render_cache']))) { // Do we _need_ to create a placeholder? if (isset($elements['#cache']['max-age']) && $elements['#cache']['max-age'] == 0) { + $render_cache_array = array_intersect_key($pre_bubbling_elements, ['#cache' => 0, '#pre_render_cache' => 1]); $elements = []; // @todo Add helper function for this based on the render array. // @todo Use hash of $pre_bubbling_elements['#pre_render_cache','#cache']? - $pholder_id = \Drupal\Component\Utility\Html::getId('X-FF-PH--' . implode(':', $pre_bubbling_elements['#cache']['keys'])); + $pholder_id = \Drupal\Component\Utility\Html::getId('X-FF-PH--' . implode(':', $render_cache_array['#cache']['keys'])); $elements['#markup'] = '
'; - $elements['#cache']['placeholders'][$pholder_id] = $pre_bubbling_elements; + $elements['#cache']['placeholders'][$pholder_id] = $render_cache_array; if ($cached_element) { // @todo If we already have data, then store it in the renderer. } @@ -241,7 +242,7 @@ protected function doRender(&$elements, $is_root_call = FALSE) { } // Ensure the item we want to render is loaded. - if (isset($elements['#pre_render_cache'])) { + if (!isset($elements['#pre_render']) && isset($elements['#pre_render_cache'])) { foreach ($elements['#pre_render_cache'] as $callable => $context) { if (is_string($callable) && strpos($callable, '::') === FALSE) { $callable = $this->controllerResolver->getControllerFromDefinition($callable); diff --git a/core/modules/block/src/BlockViewBuilder.php b/core/modules/block/src/BlockViewBuilder.php index 6ada68c..c892150 100644 --- a/core/modules/block/src/BlockViewBuilder.php +++ b/core/modules/block/src/BlockViewBuilder.php @@ -61,14 +61,12 @@ public function viewMultiple(array $entities = array(), $view_mode = 'full', $la $class . '::preRenderBlock' => compact('class', 'entity_type', 'entity_id', 'view_mode', 'langcode'), ], ); - // Don't run in ::preRenderBlock() to ensure cache keys can be altered. If an - // alter hook wants to modify the block contents, it can append another - // #pre_render_cache hook. - $this->moduleHandler()->alter(array('render_cache_block_view', "render_cache_block_view_$base_id"), $build[$entity_id], $plugin); + + $module_handler = $this->moduleHandler; + $build[$entity_id] = static::preRenderBlock($build[$entity_id], compact('class', 'entity', 'view_mode', 'langcode', 'module_handler')); // @todo Hack: Need an $entity->isDirty() function. if ($base_id == 'system_main_block') { - $build[$entity_id] = static::preRenderBlock($build[$entity_id], compact('class', 'entity', 'view_mode', 'langcode')); unset($build[$entity_id]['#pre_render_cache']); } } @@ -81,6 +79,9 @@ public static function preRenderBlock($build, $context) { if (!isset($entity)) { $entity = entity_load($entity_type, $entity_id); } + if (!isset($module_handler)) { + $module_handler = \Drupal::service('moduleHandler'); + } $entity_id = $entity->id(); $plugin = $entity->getPlugin(); @@ -118,7 +119,7 @@ public static function preRenderBlock($build, $context) { // Don't run in ::buildBlock() to ensure cache keys can be altered. If an // alter hook wants to modify the block contents, it can append another // #pre_render hook. - \Drupal::service('moduleHandler')->alter(array('block_view', "block_view_$base_id"), $build, $plugin); + $module_handler->alter(array('block_view', "block_view_$base_id"), $build, $plugin); return $build; }