Passed
Push — master ( 028eab...d24489 )
by
unknown
29:02
created

FlashMessageFinisher   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 73
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 7
eloc 41
dl 0
loc 73
rs 10
c 0
b 0
f 0

3 Methods

Rating   Name   Duplication   Size   Complexity  
A injectFlashMessageService() 0 3 1
A injectExtensionService() 0 3 1
A executeInternal() 0 40 5
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * This file is part of the TYPO3 CMS project.
7
 *
8
 * It is free software; you can redistribute it and/or modify it under
9
 * the terms of the GNU General Public License, either version 2
10
 * of the License, or any later version.
11
 *
12
 * For the full copyright and license information, please read the
13
 * LICENSE.txt file that was distributed with this source code.
14
 *
15
 * The TYPO3 project - inspiring people to share!
16
 */
17
18
/*
19
 * Inspired by and partially taken from the Neos.Form package (www.neos.io)
20
 */
21
22
namespace TYPO3\CMS\Form\Domain\Finishers;
23
24
use TYPO3\CMS\Core\Messaging\AbstractMessage;
25
use TYPO3\CMS\Core\Messaging\FlashMessage;
26
use TYPO3\CMS\Core\Messaging\FlashMessageService;
27
use TYPO3\CMS\Extbase\Error\Error;
28
use TYPO3\CMS\Extbase\Error\Message;
29
use TYPO3\CMS\Extbase\Error\Notice;
30
use TYPO3\CMS\Extbase\Error\Warning;
31
use TYPO3\CMS\Extbase\Service\ExtensionService;
32
use TYPO3\CMS\Form\Domain\Finishers\Exception\FinisherException;
33
34
/**
35
 * A simple finisher that adds a message to the FlashMessageContainer
36
 *
37
 * Usage:
38
 * //...
39
 * $flashMessageFinisher = $this->objectManager->get(FlashMessageFinisher::class);
40
 * $flashMessageFinisher->setOptions(
41
 *   [
42
 *     'messageBody' => 'Some message body',
43
 *     'messageTitle' => 'Some message title',
44
 *     'messageArguments' => ['foo' => 'bar'],
45
 *     'severity' => \TYPO3\CMS\Core\Messaging\AbstractMessage::ERROR
46
 *   ]
47
 * );
48
 * $formDefinition->addFinisher($flashMessageFinisher);
49
 * // ...
50
 *
51
 * Scope: frontend
52
 */
53
class FlashMessageFinisher extends AbstractFinisher
54
{
55
56
    /**
57
     * @var array
58
     */
59
    protected $defaultOptions = [
60
        'messageBody' => null,
61
        'messageTitle' => '',
62
        'messageArguments' => [],
63
        'messageCode' => null,
64
        'severity' => AbstractMessage::OK,
65
    ];
66
67
    private ExtensionService $extensionService;
68
    private FlashMessageService $flashMessageService;
69
70
    public function injectFlashMessageService(FlashMessageService $flashMessageService): void
71
    {
72
        $this->flashMessageService = $flashMessageService;
73
    }
74
75
    public function injectExtensionService(ExtensionService $extensionService): void
76
    {
77
        $this->extensionService = $extensionService;
78
    }
79
80
    /**
81
     * Executes this finisher
82
     * @see AbstractFinisher::execute()
83
     *
84
     * @throws FinisherException
85
     */
86
    protected function executeInternal()
87
    {
88
        $messageBody = $this->parseOption('messageBody');
89
        if (!is_string($messageBody)) {
90
            throw new FinisherException(sprintf('The message body must be of type string, "%s" given.', gettype($messageBody)), 1335980069);
91
        }
92
        $messageTitle = $this->parseOption('messageTitle');
93
        $messageArguments = $this->parseOption('messageArguments');
94
        $messageCode = $this->parseOption('messageCode');
95
        $severity = $this->parseOption('severity');
96
        switch ($severity) {
97
            case AbstractMessage::NOTICE:
98
                $message = $this->objectManager->get(Notice::class, $messageBody, $messageCode, $messageArguments, $messageTitle);
99
                break;
100
            case AbstractMessage::WARNING:
101
                $message = $this->objectManager->get(Warning::class, $messageBody, $messageCode, $messageArguments, $messageTitle);
102
                break;
103
            case AbstractMessage::ERROR:
104
                $message = $this->objectManager->get(Error::class, $messageBody, $messageCode, $messageArguments, $messageTitle);
105
                break;
106
            default:
107
                $message = $this->objectManager->get(Message::class, $messageBody, $messageCode, $messageArguments, $messageTitle);
108
                break;
109
        }
110
111
        $flashMessage = $this->objectManager->get(
112
            FlashMessage::class,
113
            $message->render(),
114
            $message->getTitle(),
115
            $severity,
116
            true
117
        );
118
119
        // todo: this value has to be taken from the request directly in the future
120
        $pluginNamespace = $this->extensionService->getPluginNamespace(
121
            $this->finisherContext->getRequest()->getControllerExtensionName(),
122
            $this->finisherContext->getRequest()->getPluginName()
123
        );
124
125
        $this->flashMessageService->getMessageQueueByIdentifier('extbase.flashmessages.' . $pluginNamespace)->addMessage($flashMessage);
126
    }
127
}
128