‪TYPO3CMS  11.5
FormFrontendController.php
Go to the documentation of this file.
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 
19 
20 use Psr\Http\Message\ResponseInterface;
34 
42 {
47 
53  {
54  $this->formPersistenceManager = ‪$formPersistenceManager;
55  }
56 
66  public function ‪renderAction(): ResponseInterface
67  {
68  $formDefinition = [];
69  if (!empty($this->settings['persistenceIdentifier'])) {
70  $formDefinition = $this->formPersistenceManager->load($this->settings['persistenceIdentifier']);
71  $formDefinition['persistenceIdentifier'] = $this->settings['persistenceIdentifier'];
72  $formDefinition = $this->‪overrideByTypoScriptSettings($formDefinition);
73  $formDefinition = $this->‪overrideByFlexFormSettings($formDefinition);
74  $formDefinition = ‪ArrayUtility::setValueByPath($formDefinition, 'renderingOptions._originalIdentifier', $formDefinition['identifier'], '.');
75  $formDefinition['identifier'] .= '-' . $this->configurationManager->getContentObject()->data['uid'];
76  }
77  $this->view->assign('formConfiguration', $formDefinition);
78 
79  return $this->‪htmlResponse();
80  }
81 
88  public function ‪performAction()
89  {
90  return new ‪ForwardResponse('render');
91  }
92 
100  protected function ‪overrideByFlexFormSettings(array $formDefinition): array
101  {
102  $flexFormData = ‪GeneralUtility::xml2array($this->configurationManager->getContentObject()->data['pi_flexform'] ?? '');
103 
104  if (!is_array($flexFormData)) {
105  return $formDefinition;
106  }
107 
108  if (isset($formDefinition['finishers'])) {
109  $prototypeName = $formDefinition['prototypeName'] ?? 'standard';
110  $configurationService = GeneralUtility::makeInstance(ConfigurationService::class);
111  $prototypeConfiguration = $configurationService->getPrototypeConfiguration($prototypeName);
112 
113  foreach ($formDefinition['finishers'] as $index => $formFinisherDefinition) {
114  $finisherIdentifier = $formFinisherDefinition['identifier'];
115 
116  $sheetIdentifier = $this->‪getFlexformSheetIdentifier($formDefinition, $prototypeName, $finisherIdentifier);
117  $flexFormSheetSettings = $this->‪getFlexFormSettingsFromSheet($flexFormData, $sheetIdentifier);
118 
119  if (($this->settings['overrideFinishers'] ?? false) && isset($flexFormSheetSettings['finishers'][$finisherIdentifier])) {
120  $prototypeFinisherDefinition = $prototypeConfiguration['finishersDefinition'][$finisherIdentifier] ?? [];
121  $converterDto = GeneralUtility::makeInstance(
122  FlexFormFinisherOverridesConverterDto::class,
123  $prototypeFinisherDefinition,
124  $formFinisherDefinition,
125  $finisherIdentifier,
126  $flexFormSheetSettings
127  );
128 
129  // Iterate over all `TYPO3.CMS.Form.prototypes.<prototypeName>.finishersDefinition.<finisherIdentifier>.FormEngine.elements` values
130  GeneralUtility::makeInstance(ArrayProcessor::class, $prototypeFinisherDefinition['FormEngine']['elements'])->forEach(
131  GeneralUtility::makeInstance(
132  ArrayProcessing::class,
133  'modifyFinisherOptionsFromFlexFormOverrides',
134  '^(.*)(?:(?<!\.TCEforms)\.config\.type|\.section)$',
135  GeneralUtility::makeInstance(FinisherOptionsFlexFormOverridesConverter::class, $converterDto)
136  )
137  );
138 
139  $formDefinition['finishers'][$index] = $converterDto->getFinisherDefinition();
140  }
141  }
142  }
143  return $formDefinition;
144  }
145 
155  protected function ‪overrideByTypoScriptSettings(array $formDefinition): array
156  {
157  if (
158  isset($this->settings['formDefinitionOverrides'][$formDefinition['identifier']])
159  && !empty($this->settings['formDefinitionOverrides'][$formDefinition['identifier']])
160  ) {
161  $formDefinitionOverrides = GeneralUtility::makeInstance(TypoScriptService::class)
162  ->resolvePossibleTypoScriptConfiguration($this->settings['formDefinitionOverrides'][$formDefinition['identifier']]);
163 
165  $formDefinition,
166  $formDefinitionOverrides
167  );
168  }
169  return $formDefinition;
170  }
171 
178  protected function ‪getFlexformSheetIdentifier(
179  array $formDefinition,
180  string $prototypeName,
181  string $finisherIdentifier
182  ): string {
183  return md5(
184  implode('', [
185  $formDefinition['persistenceIdentifier'],
186  $prototypeName,
187  $formDefinition['identifier'],
188  $finisherIdentifier,
189  ])
190  );
191  }
192 
198  protected function ‪getFlexFormSettingsFromSheet(
199  array $flexForm,
200  string $sheetIdentifier
201  ): array {
202  $sheetData = [];
203  $sheetData['data'] = array_filter(
204  $flexForm['data'] ?? [],
205  static function ($key) use ($sheetIdentifier) {
206  return $key === $sheetIdentifier;
207  },
208  ARRAY_FILTER_USE_KEY
209  );
210 
211  if (empty($sheetData['data'])) {
212  return [];
213  }
214 
215  $flexFormService = GeneralUtility::makeInstance(FlexFormService::class);
216  $flexFormTools = GeneralUtility::makeInstance(FlexFormTools::class);
217 
218  $sheetDataXml = $flexFormTools->flexArray2Xml($sheetData);
219  return $flexFormService->convertFlexFormContentToArray($sheetDataXml)['settings'] ?? [];
220  }
221 }
‪TYPO3\CMS\Core\Utility\GeneralUtility\xml2array
‪static mixed xml2array($string, $NSprefix='', $reportDocTag=false)
Definition: GeneralUtility.php:1482
‪TYPO3\CMS\Extbase\Mvc\Controller\ActionController\htmlResponse
‪ResponseInterface htmlResponse(string $html=null)
Definition: ActionController.php:1067
‪TYPO3\CMS\Form\Domain\Configuration\FormDefinition\Converters\FinisherOptionsFlexFormOverridesConverter
Definition: FinisherOptionsFlexFormOverridesConverter.php:29
‪TYPO3\CMS\Form\Controller\FormFrontendController\renderAction
‪renderAction()
Definition: FormFrontendController.php:65
‪TYPO3\CMS\Form\Controller\FormFrontendController\getFlexformSheetIdentifier
‪string getFlexformSheetIdentifier(array $formDefinition, string $prototypeName, string $finisherIdentifier)
Definition: FormFrontendController.php:177
‪TYPO3\CMS\Form\Controller
Definition: AbstractBackendController.php:18
‪TYPO3\CMS\Core\Utility\ArrayUtility\mergeRecursiveWithOverrule
‪static mergeRecursiveWithOverrule(array &$original, array $overrule, $addKeys=true, $includeEmptyValues=true, $enableUnsetFeature=true)
Definition: ArrayUtility.php:654
‪TYPO3\CMS\Extbase\Http\ForwardResponse
Definition: ForwardResponse.php:24
‪TYPO3\CMS\Core\Service\FlexFormService
Definition: FlexFormService.php:25
‪TYPO3\CMS\Form\Controller\FormFrontendController\getFlexFormSettingsFromSheet
‪array getFlexFormSettingsFromSheet(array $flexForm, string $sheetIdentifier)
Definition: FormFrontendController.php:197
‪TYPO3\CMS\Form\Domain\Configuration\ArrayProcessing\ArrayProcessing
Definition: ArrayProcessing.php:27
‪TYPO3\CMS\Form\Domain\Configuration\ArrayProcessing\ArrayProcessor
Definition: ArrayProcessor.php:30
‪TYPO3\CMS\Form\Controller\FormFrontendController
Definition: FormFrontendController.php:42
‪TYPO3\CMS\Core\Configuration\FlexForm\FlexFormTools
Definition: FlexFormTools.php:40
‪TYPO3\CMS\Form\Controller\FormFrontendController\overrideByFlexFormSettings
‪array overrideByFlexFormSettings(array $formDefinition)
Definition: FormFrontendController.php:99
‪TYPO3\CMS\Form\Mvc\Configuration\TypoScriptService
Definition: TypoScriptService.php:29
‪TYPO3\CMS\Form\Controller\FormFrontendController\$formPersistenceManager
‪TYPO3 CMS Form Mvc Persistence FormPersistenceManagerInterface $formPersistenceManager
Definition: FormFrontendController.php:45
‪TYPO3\CMS\Form\Domain\Configuration\ConfigurationService
Definition: ConfigurationService.php:50
‪TYPO3\CMS\Form\Controller\FormFrontendController\performAction
‪performAction()
Definition: FormFrontendController.php:87
‪TYPO3\CMS\Core\Utility\ArrayUtility\setValueByPath
‪static array setValueByPath(array $array, $path, $value, $delimiter='/')
Definition: ArrayUtility.php:272
‪TYPO3\CMS\Form\Controller\FormFrontendController\overrideByTypoScriptSettings
‪array overrideByTypoScriptSettings(array $formDefinition)
Definition: FormFrontendController.php:154
‪TYPO3\CMS\Core\Utility\ArrayUtility
Definition: ArrayUtility.php:24
‪TYPO3\CMS\Form\Domain\Configuration\FormDefinition\Converters\FlexFormFinisherOverridesConverterDto
Definition: FlexFormFinisherOverridesConverterDto.php:24
‪TYPO3\CMS\Extbase\Mvc\Controller\ActionController
Definition: ActionController.php:65
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:50
‪TYPO3\CMS\Form\Mvc\Persistence\FormPersistenceManagerInterface
Definition: FormPersistenceManagerInterface.php:32
‪TYPO3\CMS\Form\Controller\FormFrontendController\injectFormPersistenceManager
‪injectFormPersistenceManager(FormPersistenceManagerInterface $formPersistenceManager)
Definition: FormFrontendController.php:51