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