‪TYPO3CMS  ‪main
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;
33 
41 {
46 
51  {
52  $this->formPersistenceManager = ‪$formPersistenceManager;
53  }
54 
64  public function ‪renderAction(): ResponseInterface
65  {
66  $formDefinition = [];
67  if (!empty($this->settings['persistenceIdentifier'])) {
68  $formDefinition = $this->formPersistenceManager->load($this->settings['persistenceIdentifier']);
69  $formDefinition['persistenceIdentifier'] = $this->settings['persistenceIdentifier'];
70  $formDefinition = $this->‪overrideByFlexFormSettings($formDefinition);
71  $formDefinition = ‪ArrayUtility::setValueByPath($formDefinition, 'renderingOptions._originalIdentifier', $formDefinition['identifier'], '.');
72  $formDefinition['identifier'] .= '-' . ($this->request->getAttribute('currentContentObject')?->data['uid'] ?? '');
73  }
74  $this->view->assign('formConfiguration', $formDefinition);
75 
76  return $this->‪htmlResponse();
77  }
78 
85  public function ‪performAction(): ResponseInterface
86  {
87  return new ‪ForwardResponse('render');
88  }
89 
94  protected function ‪overrideByFlexFormSettings(array $formDefinition): array
95  {
96  $flexFormData = ‪GeneralUtility::xml2array($this->request->getAttribute('currentContentObject')?->data['pi_flexform'] ?? '');
97 
98  if (!is_array($flexFormData)) {
99  return $formDefinition;
100  }
101 
102  if (isset($formDefinition['finishers'])) {
103  $prototypeName = $formDefinition['prototypeName'] ?? 'standard';
104  $configurationService = GeneralUtility::makeInstance(ConfigurationService::class);
105  $prototypeConfiguration = $configurationService->getPrototypeConfiguration($prototypeName);
106 
107  foreach ($formDefinition['finishers'] as $index => $formFinisherDefinition) {
108  $finisherIdentifier = $formFinisherDefinition['identifier'];
109 
110  $sheetIdentifier = $this->‪getFlexformSheetIdentifier($formDefinition, $prototypeName, $finisherIdentifier);
111  $flexFormSheetSettings = $this->‪getFlexFormSettingsFromSheet($flexFormData, $sheetIdentifier);
112 
113  if (($this->settings['overrideFinishers'] ?? false) && isset($flexFormSheetSettings['finishers'][$finisherIdentifier])) {
114  $prototypeFinisherDefinition = $prototypeConfiguration['finishersDefinition'][$finisherIdentifier] ?? [];
115  $converterDto = GeneralUtility::makeInstance(
116  FlexFormFinisherOverridesConverterDto::class,
117  $prototypeFinisherDefinition,
118  $formFinisherDefinition,
119  $finisherIdentifier,
120  $flexFormSheetSettings
121  );
122 
123  // Iterate over all `prototypes.<prototypeName>.finishersDefinition.<finisherIdentifier>.FormEngine.elements` values
124  GeneralUtility::makeInstance(ArrayProcessor::class, $prototypeFinisherDefinition['FormEngine']['elements'])->forEach(
125  GeneralUtility::makeInstance(
126  ArrayProcessing::class,
127  'modifyFinisherOptionsFromFlexFormOverrides',
128  '^(.*)(?:\.config\.type|\.section)$',
129  GeneralUtility::makeInstance(FinisherOptionsFlexFormOverridesConverter::class, $converterDto)
130  )
131  );
132 
133  $formDefinition['finishers'][$index] = $converterDto->getFinisherDefinition();
134  }
135  }
136  }
137  return $formDefinition;
138  }
139 
140  protected function ‪getFlexformSheetIdentifier(
141  array $formDefinition,
142  string $prototypeName,
143  string $finisherIdentifier
144  ): string {
145  return md5(
146  implode('', [
147  $formDefinition['persistenceIdentifier'],
148  $prototypeName,
149  $formDefinition['identifier'],
150  $finisherIdentifier,
151  ])
152  );
153  }
154 
155  protected function ‪getFlexFormSettingsFromSheet(
156  array $flexForm,
157  string $sheetIdentifier
158  ): array {
159  $sheetData = [];
160  $sheetData['data'] = array_filter(
161  $flexForm['data'] ?? [],
162  static function ($key) use ($sheetIdentifier) {
163  return $key === $sheetIdentifier;
164  },
165  ARRAY_FILTER_USE_KEY
166  );
167 
168  if (empty($sheetData['data'])) {
169  return [];
170  }
171 
172  $flexFormService = GeneralUtility::makeInstance(FlexFormService::class);
173  $flexFormTools = GeneralUtility::makeInstance(FlexFormTools::class);
174 
175  $sheetDataXml = $flexFormTools->flexArray2Xml($sheetData);
176  return $flexFormService->convertFlexFormContentToArray($sheetDataXml)['settings'] ?? [];
177  }
178 }
‪TYPO3\CMS\Form\Controller\FormFrontendController\overrideByFlexFormSettings
‪overrideByFlexFormSettings(array $formDefinition)
Definition: FormFrontendController.php:93
‪TYPO3\CMS\Form\Controller\FormFrontendController\getFlexformSheetIdentifier
‪getFlexformSheetIdentifier(array $formDefinition, string $prototypeName, string $finisherIdentifier)
Definition: FormFrontendController.php:139
‪TYPO3\CMS\Form\Controller\FormFrontendController\getFlexFormSettingsFromSheet
‪getFlexFormSettingsFromSheet(array $flexForm, string $sheetIdentifier)
Definition: FormFrontendController.php:154
‪TYPO3\CMS\Form\Domain\Configuration\FormDefinition\Converters\FinisherOptionsFlexFormOverridesConverter
Definition: FinisherOptionsFlexFormOverridesConverter.php:29
‪TYPO3\CMS\Form\Controller\FormFrontendController\renderAction
‪renderAction()
Definition: FormFrontendController.php:63
‪TYPO3\CMS\Form\Controller
Definition: AbstractBackendController.php:18
‪TYPO3\CMS\Extbase\Http\ForwardResponse
Definition: ForwardResponse.php:24
‪TYPO3\CMS\Core\Service\FlexFormService
Definition: FlexFormService.php:25
‪TYPO3\CMS\Form\Domain\Configuration\ArrayProcessing\ArrayProcessing
Definition: ArrayProcessing.php:27
‪TYPO3\CMS\Extbase\Mvc\Controller\ActionController\htmlResponse
‪htmlResponse(string $html=null)
Definition: ActionController.php:802
‪TYPO3\CMS\Form\Domain\Configuration\ArrayProcessing\ArrayProcessor
Definition: ArrayProcessor.php:30
‪TYPO3\CMS\Form\Controller\FormFrontendController
Definition: FormFrontendController.php:41
‪TYPO3\CMS\Core\Configuration\FlexForm\FlexFormTools
Definition: FlexFormTools.php:40
‪TYPO3\CMS\Form\Controller\FormFrontendController\$formPersistenceManager
‪TYPO3 CMS Form Mvc Persistence FormPersistenceManagerInterface $formPersistenceManager
Definition: FormFrontendController.php:44
‪TYPO3\CMS\Form\Domain\Configuration\ConfigurationService
Definition: ConfigurationService.php:50
‪TYPO3\CMS\Form\Controller\FormFrontendController\performAction
‪performAction()
Definition: FormFrontendController.php:84
‪TYPO3\CMS\Core\Utility\ArrayUtility
Definition: ArrayUtility.php:26
‪TYPO3\CMS\Form\Domain\Configuration\FormDefinition\Converters\FlexFormFinisherOverridesConverterDto
Definition: FlexFormFinisherOverridesConverterDto.php:24
‪TYPO3\CMS\Extbase\Mvc\Controller\ActionController
Definition: ActionController.php:63
‪TYPO3\CMS\Core\Utility\ArrayUtility\setValueByPath
‪static array setValueByPath(array $array, string|array|\ArrayAccess $path, mixed $value, string $delimiter='/')
Definition: ArrayUtility.php:261
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Form\Mvc\Persistence\FormPersistenceManagerInterface
Definition: FormPersistenceManagerInterface.php:32
‪TYPO3\CMS\Core\Utility\GeneralUtility\xml2array
‪static array string xml2array(string $string, string $NSprefix='', bool $reportDocTag=false)
Definition: GeneralUtility.php:1265
‪TYPO3\CMS\Form\Controller\FormFrontendController\injectFormPersistenceManager
‪injectFormPersistenceManager(FormPersistenceManagerInterface $formPersistenceManager)
Definition: FormFrontendController.php:49