core/includes/theme.inc | 19 --------- .../modules/system/src/MessagesPostRenderCache.php | 47 +++++++++++++++++++--- .../src/Plugin/Block/SystemPageMessagesBlock.php | 36 +++++------------ core/modules/system/system.services.yml | 1 + 4 files changed, 52 insertions(+), 51 deletions(-) diff --git a/core/includes/theme.inc b/core/includes/theme.inc index b51ea8e..b71c17f 100644 --- a/core/includes/theme.inc +++ b/core/includes/theme.inc @@ -523,25 +523,6 @@ function template_preprocess_datetime_wrapper(&$variables) { } /** - * Prepares variables for status message templates. - * - * Default template: status-messages.html.twig. - * - * @param array $variables - * An associative array containing: - * - display: (optional) May have a value of 'status' or 'error' when only - * displaying messages of that specific type. - */ -function template_preprocess_status_messages(&$variables) { - $variables['message_list'] = drupal_get_messages($variables['display']); - $variables['status_headings'] = array( - 'status' => t('Status message'), - 'error' => t('Error message'), - 'warning' => t('Warning message'), - ); -} - -/** * Prepares variables for links templates. * * Default template: links.html.twig. diff --git a/core/modules/system/src/MessagesPostRenderCache.php b/core/modules/system/src/MessagesPostRenderCache.php index f25f67b..2cfc912 100644 --- a/core/modules/system/src/MessagesPostRenderCache.php +++ b/core/modules/system/src/MessagesPostRenderCache.php @@ -7,6 +7,9 @@ namespace Drupal\system; +use Drupal\Core\Render\Renderer; +use Drupal\Core\Render\RendererInterface; + /** * Defines a service for messages post render cache callbacks. */ @@ -14,10 +17,29 @@ class MessagesPostRenderCache { /** * The messages. - * They are stored in a static property so they can appear in multiple blocks. * + * They are stored in a property so they can appear in multiple blocks. + * + * @var string[] + */ + protected $messages; + + /** + * The renderer. + * + * @var \Drupal\Core\Render\RendererInterface */ - protected static $messages; + protected $renderer; + + /** + * Constructs a new MessagesPostRenderCache object. + * + * @param \Drupal\Core\Render\RendererInterface $renderer + * The renderer. + */ + public function __construct(RendererInterface $renderer) { + $this->renderer = $renderer; + } /** * #post_render_cache callback; replaces placeholder with messages. @@ -31,13 +53,28 @@ class MessagesPostRenderCache { * A renderable array containing the messages. */ public function renderMessages(array $element, array $context) { - if (!isset(static::$messages)) { - static::$messages = drupal_get_messages(); + // Collect the messages. + if (!isset($this->messages)) { + $this->messages = drupal_get_messages(); } + // Render the messages. + $messages = [ + '#theme' => 'status_messages', + '#message_list' => $this->messages, + '#status_headings' => [ + 'status' => t('Status message'), + 'error' => t('Error message'), + 'warning' => t('Warning message'), + ], + ]; + $markup = $this->renderer->render($messages); + + // Replace the placeholder. $callback = 'system.messages_post_render_cache:renderMessages'; $placeholder = drupal_render_cache_generate_placeholder($callback, $context); - $element['#message_list'] = str_replace($placeholder, static::$messages, $element['#message_list']); + $element['#markup'] = str_replace($placeholder, $markup, $element['#markup']); + $element = Renderer::mergeBubbleableMetadata($element, $messages); return $element; } diff --git a/core/modules/system/src/Plugin/Block/SystemPageMessagesBlock.php b/core/modules/system/src/Plugin/Block/SystemPageMessagesBlock.php index 6783632..7dfc02f 100644 --- a/core/modules/system/src/Plugin/Block/SystemPageMessagesBlock.php +++ b/core/modules/system/src/Plugin/Block/SystemPageMessagesBlock.php @@ -72,35 +72,17 @@ public function defaultConfiguration() { * {@inheritdoc} */ public function build() { - - $build['messages'] = array( - // @TODO change this to status_messages once the messages are gone from - // template_preprocess_page - '#theme' => 'status_messages_block', - '#pre_render' => array(array($this, 'getMessagesPlaceholder')), - ); - $build['messages']['#status_headings'] = array( - 'status' => t('Status message'), - 'error' => t('Error message'), - 'warning' => t('Warning message'), - ); - - return $build; - } - - /** - * Gets messages in the pre-render stage. - * - * @param $element - * @return mixed - */ - public function getMessagesPlaceholder($element) { $callback = 'system.messages_post_render_cache:renderMessages'; - $context = array(); + $context = []; $placeholder = drupal_render_cache_generate_placeholder($callback, $context); - $element['#post_render_cache'] = array($callback => array($context)); - $element['#message_list'] = $placeholder; - return $element; + return [ + '#post_render_cache' => array( + $callback => array( + $context, + ), + ), + '#markup' => $placeholder, + ]; } /** diff --git a/core/modules/system/system.services.yml b/core/modules/system/system.services.yml index 84fb2cb..fd29409 100644 --- a/core/modules/system/system.services.yml +++ b/core/modules/system/system.services.yml @@ -44,6 +44,7 @@ services: - { name: event_subscriber } system.messages_post_render_cache: class: Drupal\system\MessagesPostRenderCache + arguments: ['@renderer'] system.theme_settings_cache_tag: class: Drupal\system\EventSubscriber\ThemeSettingsCacheTag arguments: ['@theme_handler', '@cache_tags.invalidator']