stdWrapValue('fieldName', $processorConfiguration, 'pi_flexform'); if (!isset($processedData['data'][$fieldName])) { return $processedData; } // Process FlexForm $originalValue = $processedData['data'][$fieldName]; if (!is_string($originalValue)) { return $processedData; } $flexFormData = $this->flexFormTools->convertFlexFormContentToArray($originalValue); // Process FAL references if (isset($processorConfiguration['references.']) && is_array($processorConfiguration['references.'])) { $this->processFileReferences($cObj, $flexFormData, $processorConfiguration['references.']); } // Process additional DataProcessors if (isset($processorConfiguration['dataProcessing.']) && is_array($processorConfiguration['dataProcessing.'])) { // @todo: It looks as if data processors should retrieve the current request from the outside, // this would avoid $cObj->getRequest() here. $flexFormData = $this->processAdditionalDataProcessors($flexFormData, $processorConfiguration, $cObj->getRequest()); } // Set the target variable $targetVariableName = $cObj->stdWrapValue('as', $processorConfiguration, 'flexFormData'); $processedData[$targetVariableName] = $flexFormData; return $processedData; } /** * Recursively process FAL references and replace them by FAL objects. */ protected function processFileReferences(ContentObjectRenderer $cObj, array &$data, array $fields): void { foreach ($fields as $key => $field) { $key = rtrim($key, '.'); if (!isset($data[$key])) { continue; } if (is_array($field)) { $this->processFileReferences($cObj, $data[$key], $field); } else { $fileCollector = GeneralUtility::makeInstance(FileCollector::class); $fileCollector->addFilesFromRelation($cObj->getCurrentTable(), $field, $cObj->data); $data[$key] = $fileCollector->getFiles(); } } } /** * Recursively process sub processors of a data processor */ protected function processAdditionalDataProcessors(array $data, array $processorConfiguration, ServerRequestInterface $request): array { $contentObjectRenderer = GeneralUtility::makeInstance(ContentObjectRenderer::class); $contentObjectRenderer->setRequest($request); $contentObjectRenderer->start([$data], ''); return GeneralUtility::makeInstance(ContentDataProcessor::class)->process( $contentObjectRenderer, $processorConfiguration, $data ); } }