‪TYPO3CMS  ‪main
FlashMessageQueue.php
Go to the documentation of this file.
1 <?php
2 
3 /*
4  * This file is part of the TYPO3 CMS project.
5  *
6  * It is free software; you can redistribute it and/or modify it under
7  * the terms of the GNU General Public License, either version 2
8  * of the License, or any later version.
9  *
10  * For the full copyright and license information, please read the
11  * LICENSE.txt file that was distributed with this source code.
12  *
13  * The TYPO3 project - inspiring people to share!
14  */
15 
17 
25 
29 class ‪FlashMessageQueue extends \SplQueue implements \JsonSerializable
30 {
31  public const ‪FLASHMESSAGE_QUEUE = 'core.template.flashMessages';
32  public const ‪NOTIFICATION_QUEUE = 'core.template.notifications';
33 
39  protected ‪$identifier;
40 
44  public function ‪__construct(‪$identifier)
45  {
46  $this->identifier = ‪$identifier;
47  }
48 
52  public function ‪getIdentifier()
53  {
54  return ‪$this->identifier;
55  }
56 
64  public function ‪enqueue($message): void
65  {
66  if (!($message instanceof FlashMessage)) {
67  throw new ‪Exception(
68  'FlashMessageQueue::enqueue() expects an object of type \TYPO3\CMS\Core\Messaging\FlashMessage but got type "' . get_debug_type($message) . '"',
69  1376833554
70  );
71  }
72  if ($message->isSessionMessage()) {
73  $this->‪addFlashMessageToSession($message);
74  } else {
75  parent::enqueue($message);
76  }
77  }
78 
79  public function ‪addMessage(‪FlashMessage $message)
80  {
81  $this->‪enqueue($message);
82  }
83 
89  #[\ReturnTypeWillChange]
90  public function ‪dequeue()
91  {
92  // deliberately empty
93  }
94 
99  protected function ‪addFlashMessageToSession(‪FlashMessage $message)
100  {
101  $queuedFlashMessages = $this->‪getFlashMessagesFromSession();
102  $queuedFlashMessages[] = $message;
103  $this->‪storeFlashMessagesInSession($queuedFlashMessages);
104  }
105 
114  public function ‪getAllMessages(int|‪ContextualFeedbackSeverity|null $severity = null)
115  {
116  if (is_int($severity)) {
117  // @deprecated int type for $severity deprecated in v12, will change to Severity only in v13.
118  $severity = ContextualFeedbackSeverity::transform($severity);
119  }
120  // Get messages from user session
121  $queuedFlashMessagesFromSession = $this->‪getFlashMessagesFromSession();
122  $queuedFlashMessages = array_merge($queuedFlashMessagesFromSession, $this->‪toArray());
123  if ($severity !== null) {
124  $filteredFlashMessages = [];
125  foreach ($queuedFlashMessages as $message) {
126  if ($message->getSeverity() === $severity) {
127  $filteredFlashMessages[] = $message;
128  }
129  }
130  return $filteredFlashMessages;
131  }
132 
133  return $queuedFlashMessages;
134  }
135 
146  public function ‪getAllMessagesAndFlush(int|‪ContextualFeedbackSeverity|null $severity = null)
147  {
148  if (is_int($severity)) {
149  // @deprecated int type for $severity deprecated in v12, will change to Severity only in v13.
150  $severity = ContextualFeedbackSeverity::transform($severity);
151  }
152  $queuedFlashMessages = $this->‪getAllMessages($severity);
153  // Reset messages in user session
154  $this->‪removeAllFlashMessagesFromSession($severity);
155  // Reset internal messages
156  $this->‪clear($severity);
157  return $queuedFlashMessages;
158  }
159 
165  protected function ‪storeFlashMessagesInSession(array $flashMessages = null)
166  {
167  if (is_array($flashMessages)) {
168  $flashMessages = array_map('json_encode', $flashMessages);
169  }
170  $user = $this->‪getUserByContext();
171  if ($user instanceof AbstractUserAuthentication) {
172  $user->setAndSaveSessionData($this->identifier, $flashMessages);
173  }
174  }
175 
183  protected function ‪removeAllFlashMessagesFromSession(int|‪ContextualFeedbackSeverity|null $severity = null)
184  {
185  if (is_int($severity)) {
186  // @deprecated int type for $severity deprecated in v12, will change to Severity only in v13.
187  $severity = ContextualFeedbackSeverity::transform($severity);
188  }
189  if (!$this->‪getUserByContext() instanceof AbstractUserAuthentication) {
190  return;
191  }
192  if ($severity === null) {
193  $this->‪storeFlashMessagesInSession(null);
194  } else {
195  $messages = $this->‪getFlashMessagesFromSession();
196  foreach ($messages as $index => $message) {
197  if ($message->getSeverity() === $severity) {
198  unset($messages[$index]);
199  }
200  }
201  $this->‪storeFlashMessagesInSession($messages);
202  }
203  }
204 
211  protected function ‪getFlashMessagesFromSession(): array
212  {
213  $sessionMessages = [];
214  $user = $this->‪getUserByContext();
215  if ($user instanceof AbstractUserAuthentication) {
216  $messagesFromSession = $user->getSessionData($this->identifier);
217  $messagesFromSession = is_array($messagesFromSession) ? $messagesFromSession : [];
218  foreach ($messagesFromSession as $messageData) {
219  $sessionMessages[] = ‪FlashMessage::createFromArray(json_decode($messageData, true));
220  }
221  }
222  return $sessionMessages;
223  }
224 
229  protected function ‪getUserByContext(): ?AbstractUserAuthentication
230  {
231  if ((‪$GLOBALS['TSFE'] ?? null) instanceof TypoScriptFrontendController && ‪$GLOBALS['TSFE']->fe_user instanceof FrontendUserAuthentication) {
232  return ‪$GLOBALS['TSFE']->fe_user;
233  }
234  return ‪$GLOBALS['BE_USER'] ?? null;
235  }
236 
243  public function ‪renderFlashMessages(FlashMessageRendererInterface $flashMessageRenderer = null)
244  {
245  $content = '';
246  $flashMessages = $this->‪getAllMessagesAndFlush();
247 
248  if (!empty($flashMessages)) {
249  if ($flashMessageRenderer === null) {
250  $flashMessageRenderer = GeneralUtility::makeInstance(FlashMessageRendererResolver::class)->resolve();
251  }
252  $content = $flashMessageRenderer->render($flashMessages);
253  }
254 
255  return $content;
256  }
257 
263  public function ‪toArray()
264  {
265  $array = [];
266  $this->rewind();
267  while ($this->valid()) {
268  $array[] = $this->current();
269  $this->next();
270  }
271  return $array;
272  }
273 
281  public function ‪clear(int|‪ContextualFeedbackSeverity|null $severity = null)
282  {
283  if (is_int($severity)) {
284  // @deprecated int type for $severity deprecated in v12, will change to Severity only in v13.
285  $severity = ContextualFeedbackSeverity::transform($severity);
286  }
287  $this->rewind();
288  if ($severity === null) {
289  while (!$this->isEmpty()) {
290  parent::dequeue();
291  }
292  } else {
293  $keysToRemove = [];
294  while ($cur = $this->current()) {
295  if ($cur->getSeverity() === $severity) {
296  $keysToRemove[] = $this->key();
297  }
298  $this->next();
299  }
300  // keys are renumbered when unsetting elements
301  // so unset them from last to first
302  $keysToRemove = array_reverse($keysToRemove);
303  foreach ($keysToRemove as $key) {
304  $this->offsetUnset($key);
305  }
306  }
307  }
308 
312  public function ‪jsonSerialize(): array
313  {
314  return $this->‪toArray();
315  }
316 }
‪TYPO3\CMS\Core\Messaging\FlashMessageQueue\getIdentifier
‪string getIdentifier()
Definition: FlashMessageQueue.php:51
‪TYPO3\CMS\Core\Messaging\FlashMessageQueue\$identifier
‪string $identifier
Definition: FlashMessageQueue.php:38
‪TYPO3\CMS\Core\Messaging\FlashMessageQueue\clear
‪clear(int|ContextualFeedbackSeverity|null $severity=null)
Definition: FlashMessageQueue.php:280
‪TYPO3\CMS\Core\Exception
Definition: Exception.php:22
‪TYPO3\CMS\Core\Messaging\FlashMessageQueue\getAllMessagesAndFlush
‪FlashMessage[] getAllMessagesAndFlush(int|ContextualFeedbackSeverity|null $severity=null)
Definition: FlashMessageQueue.php:145
‪TYPO3\CMS\Core\Messaging\FlashMessage\createFromArray
‪static static createFromArray(array $data)
Definition: FlashMessage.php:60
‪TYPO3\CMS\Core\Exception
‪TYPO3\CMS\Core\Messaging\FlashMessageQueue\__construct
‪__construct($identifier)
Definition: FlashMessageQueue.php:43
‪TYPO3\CMS\Core\Messaging\FlashMessageQueue\removeAllFlashMessagesFromSession
‪removeAllFlashMessagesFromSession(int|ContextualFeedbackSeverity|null $severity=null)
Definition: FlashMessageQueue.php:182
‪TYPO3\CMS\Core\Messaging\FlashMessageQueue\jsonSerialize
‪array jsonSerialize()
Definition: FlashMessageQueue.php:311
‪TYPO3\CMS\Core\Messaging\FlashMessageQueue\addFlashMessageToSession
‪addFlashMessageToSession(FlashMessage $message)
Definition: FlashMessageQueue.php:98
‪TYPO3\CMS\Core\Messaging\FlashMessageQueue\addMessage
‪addMessage(FlashMessage $message)
Definition: FlashMessageQueue.php:78
‪TYPO3\CMS\Core\Messaging\FlashMessageQueue\FLASHMESSAGE_QUEUE
‪const FLASHMESSAGE_QUEUE
Definition: FlashMessageQueue.php:31
‪TYPO3\CMS\Core\Type\ContextualFeedbackSeverity
‪ContextualFeedbackSeverity
Definition: ContextualFeedbackSeverity.php:25
‪TYPO3\CMS\Core\Messaging\Renderer\FlashMessageRendererInterface
Definition: FlashMessageRendererInterface.php:26
‪TYPO3\CMS\Core\Messaging\FlashMessageQueue\storeFlashMessagesInSession
‪storeFlashMessagesInSession(array $flashMessages=null)
Definition: FlashMessageQueue.php:164
‪TYPO3\CMS\Core\Messaging\FlashMessageQueue\NOTIFICATION_QUEUE
‪const NOTIFICATION_QUEUE
Definition: FlashMessageQueue.php:32
‪TYPO3\CMS\Core\Messaging\FlashMessageQueue\getFlashMessagesFromSession
‪FlashMessage[] getFlashMessagesFromSession()
Definition: FlashMessageQueue.php:210
‪TYPO3\CMS\Core\Messaging\FlashMessage
Definition: FlashMessage.php:27
‪TYPO3\CMS\Core\Messaging
Definition: AbstractMessage.php:18
‪TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController
Definition: TypoScriptFrontendController.php:105
‪TYPO3\CMS\Core\Messaging\FlashMessageQueue\getUserByContext
‪getUserByContext()
Definition: FlashMessageQueue.php:228
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\Messaging\FlashMessageQueue\enqueue
‪enqueue($message)
Definition: FlashMessageQueue.php:63
‪TYPO3\CMS\Frontend\Authentication\FrontendUserAuthentication
Definition: FrontendUserAuthentication.php:34
‪TYPO3\CMS\Core\Messaging\FlashMessageQueue\dequeue
‪dequeue()
Definition: FlashMessageQueue.php:89
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:51
‪TYPO3\CMS\Core\Messaging\FlashMessageQueue
Definition: FlashMessageQueue.php:30
‪TYPO3\CMS\Core\Messaging\FlashMessageQueue\getAllMessages
‪FlashMessage[] getAllMessages(int|ContextualFeedbackSeverity|null $severity=null)
Definition: FlashMessageQueue.php:113
‪TYPO3\CMS\Core\Messaging\FlashMessageQueue\toArray
‪FlashMessage[] toArray()
Definition: FlashMessageQueue.php:262
‪TYPO3\CMS\Core\Messaging\FlashMessageQueue\renderFlashMessages
‪string renderFlashMessages(FlashMessageRendererInterface $flashMessageRenderer=null)
Definition: FlashMessageQueue.php:242
‪TYPO3\CMS\Core\Authentication\AbstractUserAuthentication
Definition: AbstractUserAuthentication.php:63