* * *
* *
{flashMessage.code}
*
{flashMessage.message}
*
*
*
* ``` * * @see https://docs.typo3.org/permalink/t3viewhelper:typo3-fluid-flashmessages */ final class FlashMessagesViewHelper extends AbstractViewHelper { /** * ViewHelper outputs HTML therefore output escaping has to be disabled * * @var bool */ protected $escapeOutput = false; public function __construct( private readonly FlashMessageService $flashMessageService, private readonly FlashMessageRendererResolver $flashMessageRendererResolver, private readonly ExtensionService $extensionService ) {} public function initializeArguments(): void { $this->registerArgument('queueIdentifier', 'string', 'Flash-message queue to use'); $this->registerArgument('as', 'string', 'The name of the current flashMessage variable for rendering inside'); } /** * Renders FlashMessages and flushes the FlashMessage queue * * Note: This does not disable the current page cache in order to prevent FlashMessage output * from being cached. * In case of conditional flash message rendering, caching must be disabled * (e.g. for a controller action). * Custom caching using the Caching Framework can be used in this case. */ public function render(): string { $as = $this->arguments['as']; $queueIdentifier = $this->arguments['queueIdentifier']; if ($queueIdentifier === null) { if (!$this->renderingContext->hasAttribute(ServerRequestInterface::class) || !$this->renderingContext->getAttribute(ServerRequestInterface::class) instanceof RequestInterface ) { // Throw if not an extbase request throw new \RuntimeException( 'ViewHelper f:flashMessages needs an extbase Request object to resolve the Queue identifier magically.' . ' When not in extbase context, set attribute "queueIdentifier".', 1639821269 ); } $request = $this->renderingContext->getAttribute(ServerRequestInterface::class); $pluginNamespace = $this->extensionService->getPluginNamespace($request->getControllerExtensionName(), $request->getPluginName()); $queueIdentifier = 'extbase.flashmessages.' . $pluginNamespace; } $flashMessageQueue = $this->flashMessageService->getMessageQueueByIdentifier($queueIdentifier); $flashMessages = $flashMessageQueue->getAllMessagesAndFlush(); if (count($flashMessages) === 0) { return ''; } if ($as === null) { return $this->flashMessageRendererResolver->resolve()->render($flashMessages); } $variableProvider = new ScopedVariableProvider($this->renderingContext->getVariableProvider(), new StandardVariableProvider([$as => $flashMessages])); $this->renderingContext->setVariableProvider($variableProvider); $content = (string)$this->renderChildren(); $this->renderingContext->setVariableProvider($variableProvider->getGlobalVariableProvider()); return $content; } }