‪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  public function ‪dequeue(): mixed
90  {
91  // deliberately empty
92  return null;
93  }
94 
99  protected function ‪addFlashMessageToSession(FlashMessage $message)
100  {
101  $queuedFlashMessages = $this->‪getFlashMessagesFromSession();
102  $queuedFlashMessages[] = $message;
103  $this->‪storeFlashMessagesInSession($queuedFlashMessages);
104  }
105 
112  public function ‪getAllMessages(‪ContextualFeedbackSeverity|null $severity = null)
113  {
114  // Get messages from user session
115  $queuedFlashMessagesFromSession = $this->‪getFlashMessagesFromSession();
116  $queuedFlashMessages = array_merge($queuedFlashMessagesFromSession, $this->‪toArray());
117  if ($severity !== null) {
118  $filteredFlashMessages = [];
119  foreach ($queuedFlashMessages as $message) {
120  if ($message->getSeverity() === $severity) {
121  $filteredFlashMessages[] = $message;
122  }
123  }
124  return $filteredFlashMessages;
125  }
126 
127  return $queuedFlashMessages;
128  }
129 
138  public function ‪getAllMessagesAndFlush(‪ContextualFeedbackSeverity|null $severity = null)
139  {
140  $queuedFlashMessages = $this->‪getAllMessages($severity);
141  // Reset messages in user session
142  $this->‪removeAllFlashMessagesFromSession($severity);
143  // Reset internal messages
144  $this->‪clear($severity);
145  return $queuedFlashMessages;
146  }
147 
153  protected function ‪storeFlashMessagesInSession(array $flashMessages = null)
154  {
155  if (is_array($flashMessages)) {
156  $flashMessages = array_map('json_encode', $flashMessages);
157  }
158  $user = $this->‪getUserByContext();
159  if ($user instanceof AbstractUserAuthentication) {
160  $user->setAndSaveSessionData($this->identifier, $flashMessages);
161  }
162  }
163 
169  protected function ‪removeAllFlashMessagesFromSession(‪ContextualFeedbackSeverity|null $severity = null)
170  {
171  if (!$this->‪getUserByContext() instanceof AbstractUserAuthentication) {
172  return;
173  }
174  if ($severity === null) {
175  $this->‪storeFlashMessagesInSession(null);
176  } else {
177  $messages = $this->‪getFlashMessagesFromSession();
178  foreach ($messages as $index => $message) {
179  if ($message->getSeverity() === $severity) {
180  unset($messages[$index]);
181  }
182  }
183  $this->‪storeFlashMessagesInSession($messages);
184  }
185  }
186 
193  protected function ‪getFlashMessagesFromSession(): array
194  {
195  $sessionMessages = [];
196  $user = $this->‪getUserByContext();
197  if ($user instanceof AbstractUserAuthentication) {
198  $messagesFromSession = $user->getSessionData($this->identifier);
199  $messagesFromSession = is_array($messagesFromSession) ? $messagesFromSession : [];
200  foreach ($messagesFromSession as $messageData) {
201  $sessionMessages[] = ‪FlashMessage::createFromArray(json_decode($messageData, true));
202  }
203  }
204  return $sessionMessages;
205  }
206 
211  protected function ‪getUserByContext(): ?AbstractUserAuthentication
212  {
213  if ((‪$GLOBALS['TSFE'] ?? null) instanceof TypoScriptFrontendController && ‪$GLOBALS['TSFE']->fe_user instanceof FrontendUserAuthentication) {
214  return ‪$GLOBALS['TSFE']->fe_user;
215  }
216  return ‪$GLOBALS['BE_USER'] ?? null;
217  }
218 
225  public function ‪renderFlashMessages(FlashMessageRendererInterface $flashMessageRenderer = null)
226  {
227  $content = '';
228  $flashMessages = $this->‪getAllMessagesAndFlush();
229 
230  if (!empty($flashMessages)) {
231  if ($flashMessageRenderer === null) {
232  $flashMessageRenderer = GeneralUtility::makeInstance(FlashMessageRendererResolver::class)->resolve();
233  }
234  $content = $flashMessageRenderer->render($flashMessages);
235  }
236 
237  return $content;
238  }
239 
245  public function ‪toArray()
246  {
247  $array = [];
248  $this->rewind();
249  while ($this->valid()) {
250  $array[] = $this->current();
251  $this->next();
252  }
253  return $array;
254  }
255 
261  public function ‪clear(‪ContextualFeedbackSeverity|null $severity = null)
262  {
263  $this->rewind();
264  if ($severity === null) {
265  while (!$this->isEmpty()) {
266  parent::dequeue();
267  }
268  } else {
269  $keysToRemove = [];
270  while ($cur = $this->current()) {
271  if ($cur->getSeverity() === $severity) {
272  $keysToRemove[] = $this->key();
273  }
274  $this->next();
275  }
276  // keys are renumbered when unsetting elements
277  // so unset them from last to first
278  $keysToRemove = array_reverse($keysToRemove);
279  foreach ($keysToRemove as $key) {
280  $this->offsetUnset($key);
281  }
282  }
283  }
284 
288  public function ‪jsonSerialize(): array
289  {
290  return $this->‪toArray();
291  }
292 }
‪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\Exception
Definition: Exception.php:22
‪TYPO3\CMS\Core\Messaging\FlashMessage\createFromArray
‪static static createFromArray(array $data)
Definition: FlashMessage.php:56
‪TYPO3\CMS\Core\Exception
‪TYPO3\CMS\Core\Messaging\FlashMessageQueue\__construct
‪__construct($identifier)
Definition: FlashMessageQueue.php:43
‪TYPO3\CMS\Core\Messaging\FlashMessageQueue\getAllMessages
‪FlashMessage[] getAllMessages(ContextualFeedbackSeverity|null $severity=null)
Definition: FlashMessageQueue.php:111
‪TYPO3\CMS\Core\Messaging\FlashMessageQueue\jsonSerialize
‪array jsonSerialize()
Definition: FlashMessageQueue.php:287
‪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\Messaging\FlashMessageQueue\clear
‪clear(ContextualFeedbackSeverity|null $severity=null)
Definition: FlashMessageQueue.php:260
‪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:152
‪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:192
‪TYPO3\CMS\Core\Messaging\FlashMessageQueue\removeAllFlashMessagesFromSession
‪removeAllFlashMessagesFromSession(ContextualFeedbackSeverity|null $severity=null)
Definition: FlashMessageQueue.php:168
‪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:102
‪TYPO3\CMS\Core\Messaging\FlashMessageQueue\getUserByContext
‪getUserByContext()
Definition: FlashMessageQueue.php:210
‪$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:33
‪TYPO3\CMS\Core\Messaging\FlashMessageQueue\dequeue
‪dequeue()
Definition: FlashMessageQueue.php:88
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:51
‪TYPO3\CMS\Core\Messaging\FlashMessageQueue
Definition: FlashMessageQueue.php:30
‪TYPO3\CMS\Core\Messaging\FlashMessageQueue\toArray
‪FlashMessage[] toArray()
Definition: FlashMessageQueue.php:244
‪TYPO3\CMS\Core\Messaging\FlashMessageQueue\getAllMessagesAndFlush
‪FlashMessage[] getAllMessagesAndFlush(ContextualFeedbackSeverity|null $severity=null)
Definition: FlashMessageQueue.php:137
‪TYPO3\CMS\Core\Messaging\FlashMessageQueue\renderFlashMessages
‪string renderFlashMessages(FlashMessageRendererInterface $flashMessageRenderer=null)
Definition: FlashMessageQueue.php:224
‪TYPO3\CMS\Core\Authentication\AbstractUserAuthentication
Definition: AbstractUserAuthentication.php:64