StatusMessages.php 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. <?php
  2. namespace Drupal\Core\Render\Element;
  3. /**
  4. * Provides a messages element.
  5. *
  6. * Used to display results of \Drupal::messenger()->addMessage() calls.
  7. *
  8. * Usage example:
  9. * @code
  10. * $build['status_messages'] = [
  11. * '#type' => 'status_messages',
  12. * ];
  13. * @endcode
  14. *
  15. * @RenderElement("status_messages")
  16. */
  17. class StatusMessages extends RenderElement {
  18. /**
  19. * {@inheritdoc}
  20. *
  21. * Generate the placeholder in a #pre_render callback, because the hash salt
  22. * needs to be accessed, which may not yet be available when this is called.
  23. */
  24. public function getInfo() {
  25. return [
  26. // May have a value of 'status' or 'error' when only displaying messages
  27. // of that specific type.
  28. '#display' => NULL,
  29. '#pre_render' => [
  30. get_class() . '::generatePlaceholder',
  31. ],
  32. ];
  33. }
  34. /**
  35. * #pre_render callback to generate a placeholder.
  36. *
  37. * @param array $element
  38. * A renderable array.
  39. *
  40. * @return array
  41. * The updated renderable array containing the placeholder.
  42. */
  43. public static function generatePlaceholder(array $element) {
  44. $element = [
  45. '#lazy_builder' => [get_class() . '::renderMessages', [$element['#display']]],
  46. '#create_placeholder' => TRUE,
  47. ];
  48. // Directly create a placeholder as we need this to be placeholdered
  49. // regardless if this is a POST or GET request.
  50. // @todo remove this when https://www.drupal.org/node/2367555 lands.
  51. return \Drupal::service('render_placeholder_generator')->createPlaceholder($element);
  52. }
  53. /**
  54. * #lazy_builder callback; replaces placeholder with messages.
  55. *
  56. * @param string|null $type
  57. * Limit the messages returned by type. Defaults to NULL, meaning all types.
  58. * Passed on to \Drupal\Core\Messenger\Messenger::deleteByType(). These
  59. * values are supported:
  60. * - NULL
  61. * - 'status'
  62. * - 'warning'
  63. * - 'error'
  64. *
  65. * @return array
  66. * A renderable array containing the messages.
  67. *
  68. * @see \Drupal\Core\Messenger\Messenger::deleteByType()
  69. */
  70. public static function renderMessages($type = NULL) {
  71. $render = [];
  72. if (isset($type)) {
  73. $messages = \Drupal::messenger()->deleteByType($type);
  74. }
  75. else {
  76. $messages = \Drupal::messenger()->deleteAll();
  77. }
  78. if ($messages) {
  79. // Render the messages.
  80. $render = [
  81. '#theme' => 'status_messages',
  82. '#message_list' => $messages,
  83. '#status_headings' => [
  84. 'status' => t('Status message'),
  85. 'error' => t('Error message'),
  86. 'warning' => t('Warning message'),
  87. ],
  88. ];
  89. }
  90. return $render;
  91. }
  92. }