settings['persistenceIdentifier'])) { $typoScriptSettings = $this->configurationManager->getConfiguration(ExtbaseConfigurationManagerInterface::CONFIGURATION_TYPE_SETTINGS, 'form'); $formDefinition = $this->formPersistenceManager->load($this->settings['persistenceIdentifier'], $typoScriptSettings, $this->request); $formDefinition['persistenceIdentifier'] = $this->settings['persistenceIdentifier']; $formDefinition = $this->overrideByFlexFormSettings($formDefinition); $formDefinition = ArrayUtility::setValueByPath($formDefinition, 'renderingOptions._originalIdentifier', $formDefinition['identifier'], '.'); $formDefinition['identifier'] .= '-' . ($this->request->getAttribute('currentContentObject')?->data['uid'] ?? ''); } $this->view->assign('formConfiguration', $formDefinition); return $this->htmlResponse(); } /** * This method is used to display all pages / finishers except the * first page because its non cached. * * @internal */ public function performAction(): ResponseInterface { return new ForwardResponse('render'); } /** * Override the formDefinition with additional data from the Flexform * settings. For now, only finisher settings are overridable. */ protected function overrideByFlexFormSettings(array $formDefinition): array { $flexFormData = $this->request->getAttribute('currentContentObject')?->data['pi_flexform'] ?? []; if (is_string($flexFormData) && $flexFormData !== '') { $flexFormData = GeneralUtility::xml2array($flexFormData); } if (!is_array($flexFormData) || $flexFormData === []) { return $formDefinition; } if (isset($formDefinition['finishers'])) { $prototypeName = $formDefinition['prototypeName'] ?? 'standard'; $prototypeConfiguration = $this->configurationService->getPrototypeConfiguration($prototypeName); foreach ($formDefinition['finishers'] as $index => $formFinisherDefinition) { $finisherIdentifier = $formFinisherDefinition['identifier']; $sheetIdentifier = $this->getFlexformSheetIdentifier($formDefinition, $prototypeName, $finisherIdentifier); $flexFormSheetSettings = $this->getFlexFormSettingsFromSheet($flexFormData, $sheetIdentifier); if (($this->settings['overrideFinishers'] ?? false) && isset($flexFormSheetSettings['finishers'][$finisherIdentifier])) { $prototypeFinisherDefinition = $prototypeConfiguration['finishersDefinition'][$finisherIdentifier] ?? []; $converterDto = GeneralUtility::makeInstance( FlexFormFinisherOverridesConverterDto::class, $prototypeFinisherDefinition, $formFinisherDefinition, $finisherIdentifier, $flexFormSheetSettings ); // Iterate over all `prototypes..finishersDefinition..FormEngine.elements` values GeneralUtility::makeInstance(ArrayProcessor::class, $prototypeFinisherDefinition['FormEngine']['elements'])->forEach( GeneralUtility::makeInstance( ArrayProcessing::class, 'modifyFinisherOptionsFromFlexFormOverrides', '^(.*)(?:\.config\.type|\.section)$', GeneralUtility::makeInstance(FinisherOptionsFlexFormOverridesConverter::class, $converterDto) ) ); $formDefinition['finishers'][$index] = $converterDto->getFinisherDefinition(); } } } return $formDefinition; } protected function getFlexformSheetIdentifier(array $formDefinition, string $prototypeName, string $finisherIdentifier): string { return md5( implode('', [ $formDefinition['persistenceIdentifier'], $prototypeName, $formDefinition['identifier'], $finisherIdentifier, ]) ); } protected function getFlexFormSettingsFromSheet(array $flexForm, string $sheetIdentifier): array { $sheetData = []; $sheetData['data'] = array_filter( $flexForm['data'] ?? [], static function ($key) use ($sheetIdentifier) { return $key === $sheetIdentifier; }, ARRAY_FILTER_USE_KEY ); if (empty($sheetData['data'])) { return []; } $sheetDataXml = $this->flexFormTools->flexArray2Xml($sheetData); return $this->flexFormTools->convertFlexFormContentToArray($sheetDataXml)['settings'] ?? []; } }