Completed
Push — feature-message-types ( b0465a )
by Romain
03:13
created

FormRequestDataJavaScriptAssetHandler::getFieldsExistingMessages()   C

Complexity

Conditions 7
Paths 2

Size

Total Lines 35
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 35
rs 6.7272
c 0
b 0
f 0
cc 7
eloc 19
nc 2
nop 0
1
<?php
2
/*
3
 * 2017 Romain CANON <[email protected]>
4
 *
5
 * This file is part of the TYPO3 Formz project.
6
 * It is free software; you can redistribute it and/or modify it
7
 * under the terms of the GNU General Public License, either
8
 * version 3 of the License, or any later version.
9
 *
10
 * For the full copyright and license information, see:
11
 * http://www.gnu.org/licenses/gpl-3.0.html
12
 */
13
14
namespace Romm\Formz\AssetHandler\JavaScript;
15
16
use Romm\Formz\AssetHandler\AbstractAssetHandler;
17
use Romm\Formz\Service\ArrayService;
18
use Romm\Formz\Service\MessageService;
19
use TYPO3\CMS\Core\Utility\GeneralUtility;
20
use TYPO3\CMS\Extbase\Error\Message;
21
use TYPO3\CMS\Extbase\Error\Result;
22
23
/**
24
 * Will handle the "one time run" data needed by JavaScript: the submitted
25
 * values, and others.
26
 */
27
class FormRequestDataJavaScriptAssetHandler extends AbstractAssetHandler
28
{
29
30
    /**
31
     * See class description.
32
     *
33
     * @return string
34
     */
35
    public function getFormRequestDataJavaScriptCode()
36
    {
37
        $submittedFormValues = [];
38
        $fieldsExistingMessages = [];
39
        $originalRequest = $this->getControllerContext()
40
            ->getRequest()
41
            ->getOriginalRequest();
42
43
        $formWasSubmitted = (null !== $originalRequest)
44
            ? 'true'
45
            : 'false';
46
47
        if ($formWasSubmitted) {
48
            $submittedFormValues = ArrayService::get()->arrayToJavaScriptJson($this->getSubmittedFormValues());
49
            $fieldsExistingMessages = ArrayService::get()->arrayToJavaScriptJson($this->getFieldsExistingMessages());
50
        }
51
52
        $formName = GeneralUtility::quoteJSvalue($this->getFormObject()->getName());
53
54
        $javaScriptCode = <<<JS
55
(function() {
56
    Formz.Form.beforeInitialization($formName, function(form) {
57
        form.injectRequestData($submittedFormValues, $fieldsExistingMessages, $formWasSubmitted)
58
    });
59
})();
60
JS;
61
62
        return $javaScriptCode;
63
    }
64
65
    /**
66
     * Will fetch the values of the fields of the submitted form, if a form has
67
     * been submitted.
68
     *
69
     * @return array
70
     */
71
    protected function getSubmittedFormValues()
72
    {
73
        $result = [];
74
        $formName = $this->getFormObject()->getName();
75
        $originalRequest = $this->getControllerContext()
76
            ->getRequest()
77
            ->getOriginalRequest();
78
79
        if (null !== $originalRequest
80
            && $originalRequest->hasArgument($formName)
81
        ) {
82
            $result = $originalRequest->getArgument($formName);
83
        }
84
85
        return $result;
86
    }
87
88
    /**
89
     * This function checks every message which may exist on every property of
90
     * the form (used to tell to JavaScript which messages already exist).
91
     *
92
     * @return array
93
     */
94
    protected function getFieldsExistingMessages()
95
    {
96
        $fieldsMessages = [];
97
        $request = $this->getControllerContext()
98
            ->getRequest();
99
100
        if (null !== $request->getOriginalRequest()) {
101
            $requestResult = $request->getOriginalRequestMappingResults();
102
            /** @var Result[] $formFieldsResult */
103
            $formFieldsResult = $requestResult->forProperty($this->getFormObject()->getName())->getSubResults();
104
105
            foreach ($this->getFormObject()->getProperties() as $fieldName) {
106
                if (array_key_exists($fieldName, $formFieldsResult)) {
107
                    $messages = [];
108
                    $result = $formFieldsResult[$fieldName];
109
110
                    if ($result->hasErrors()) {
111
                        $messages['errors'] = $this->formatMessages($result->getErrors());
112
                    }
113
114
                    if ($result->hasWarnings()) {
115
                        $messages['warnings'] = $this->formatMessages($result->getWarnings());
116
                    }
117
118
                    if ($result->hasNotices()) {
119
                        $messages['notices'] = $this->formatMessages($result->getNotices());
120
                    }
121
122
                    $fieldsMessages[$fieldName] = $messages;
123
                }
124
            }
125
        }
126
127
        return $fieldsMessages;
128
    }
129
130
    /**
131
     * @param Message[] $messages
132
     * @return array
133
     */
134
    protected function formatMessages(array $messages)
135
    {
136
        $sortedMessages = [];
137
138
        foreach ($messages as $message) {
139
            $validationName = MessageService::get()->getMessageValidationName($message);
140
            $messageKey = MessageService::get()->getMessageKey($message);
141
142
            if (false === isset($sortedMessages[$validationName])) {
143
                $sortedMessages[$validationName] = [];
144
            }
145
146
            $sortedMessages[$validationName][$messageKey] = $message->render();
147
        }
148
149
        return $sortedMessages;
150
    }
151
}
152