setOptions( * [ * 'messageBody' => 'Some message body', * 'messageTitle' => 'Some message title', * 'messageArguments' => ['foo' => 'bar'], * 'severity' => \TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::ERROR * ] * ); * $formDefinition->addFinisher($flashMessageFinisher); * // ... * * Scope: frontend */ class FlashMessageFinisher extends AbstractFinisher { /** * @var array */ protected $defaultOptions = [ 'messageBody' => null, 'messageTitle' => '', 'messageArguments' => [], 'messageCode' => null, 'severity' => ContextualFeedbackSeverity::OK, ]; private ExtensionService $extensionService; private FlashMessageService $flashMessageService; public function injectFlashMessageService(FlashMessageService $flashMessageService): void { $this->flashMessageService = $flashMessageService; } public function injectExtensionService(ExtensionService $extensionService): void { $this->extensionService = $extensionService; } /** * Executes this finisher * @see AbstractFinisher::execute() * * @throws FinisherException */ protected function executeInternal() { $messageBody = $this->parseOption('messageBody'); if (!is_string($messageBody)) { throw new FinisherException(sprintf('The message body must be of type string, "%s" given.', gettype($messageBody)), 1335980069); } $messageTitle = $this->parseOption('messageTitle'); $messageArguments = $this->parseOption('messageArguments'); $messageCode = $this->parseOption('messageCode'); $severity = $this->parseOption('severity'); if (MathUtility::canBeInterpretedAsInteger($severity)) { $severity = ContextualFeedbackSeverity::tryFrom((int)$severity); } if (!$severity instanceof ContextualFeedbackSeverity) { $severity = $this->defaultOptions['severity']; } $messageClass = match ($severity) { ContextualFeedbackSeverity::NOTICE => Notice::class, ContextualFeedbackSeverity::WARNING => Warning::class, ContextualFeedbackSeverity::ERROR => Error::class, default => Message::class, }; /** @var Message|Notice|Warning|Error $message */ $message = GeneralUtility::makeInstance($messageClass, $messageBody, $messageCode, $messageArguments, $messageTitle); $flashMessage = new FlashMessage( $message->render(), $message->getTitle(), $severity, true ); // todo: this value has to be taken from the request directly in the future $pluginNamespace = $this->extensionService->getPluginNamespace( $this->finisherContext->getRequest()->getControllerExtensionName(), $this->finisherContext->getRequest()->getPluginName() ); $this->flashMessageService->getMessageQueueByIdentifier('extbase.flashmessages.' . $pluginNamespace)->addMessage($flashMessage); } }