2 declare(strict_types = 1);
18 use Symfony\Component\Console\Output\OutputInterface;
83 return 'formFileExtension';
93 return 'Rename form definition file extension from .yaml to .form.yaml';
103 return 'Form definition files need to be named *.form.yaml to have a way of distinguishing form yaml ' .
104 'configuration files from other yaml configuration files. This wizard will analyze and rename found files.';
117 ReferenceIndexUpdatedPrerequisite::class,
118 DatabaseUpdatedPrerequisite::class
134 $updateNeeded =
false;
137 $this->resourceFactory = GeneralUtility::makeInstance(ResourceFactory::class);
142 $formDefinitionInformation[
'hasNewFileExtension'] ===
true
143 && $formDefinitionInformation[
'hasReferencesForOldFileExtension'] ===
false
144 && $formDefinitionInformation[
'hasReferencesForNewFileExtension'] ===
false
147 $formDefinitionInformation[
'hasNewFileExtension'] ===
false
148 && $formDefinitionInformation[
'location'] ===
'extension'
149 && $formDefinitionInformation[
'hasReferencesForOldFileExtension'] ===
false
150 && $formDefinitionInformation[
'hasReferencesForNewFileExtension'] ===
false
157 $formDefinitionInformation[
'hasNewFileExtension'] ===
false
158 && $formDefinitionInformation[
'location'] ===
'storage'
160 $updateNeeded =
true;
161 $this->output->writeln(
'Form definition files were found that should be migrated to be named .form.yaml.');
165 $formDefinitionInformation[
'hasNewFileExtension']
166 && $formDefinitionInformation[
'hasReferencesForOldFileExtension']
168 $updateNeeded =
true;
169 $this->output->writeln(
'Referenced form definition files found that should be updated.');
173 $formDefinitionInformation[
'referencesForOldFileExtensionNeedsFlexformUpdates'] ===
true
174 || $formDefinitionInformation[
'referencesForNewFileExtensionNeedsFlexformUpdates'] ===
true
176 $updateNeeded =
true;
177 if ($formDefinitionInformation[
'hasNewFileExtension'] ===
true) {
178 $this->output->writeln(
'Referenced form definition files found that should be updated.');
179 } elseif ($formDefinitionInformation[
'location'] ===
'storage') {
180 $this->output->writeln(
'Referenced form definition files found that should be updated.');
182 $this->output->writeln(
183 '<warning>There are references to form definitions which are located in extensions and thus cannot be renamed automatically by this wizard.'
184 .
'This form definitions from extensions that do not end with .form.yaml have to be renamed by hand!'
185 .
'After that you can run this wizard again to migrate the references.</warning>'
191 return $updateNeeded;
203 $GLOBALS[
'LANG'] = GeneralUtility::makeInstance(LanguageService::class);
204 $connectionPool = GeneralUtility::makeInstance(ConnectionPool::class);
205 $filePersistenceSlot = GeneralUtility::makeInstance(FilePersistenceSlot::class);
207 $this->connection = $connectionPool->getConnectionForTable(
'tt_content');
209 $this->resourceFactory = GeneralUtility::makeInstance(ResourceFactory::class);
210 $this->referenceIndex = GeneralUtility::makeInstance(ReferenceIndex::class);
211 $this->flexFormTools = GeneralUtility::makeInstance(FlexFormTools::class);
213 $filePersistenceSlot->defineInvocation(
219 foreach ($formDefinitionsInformation as $currentPersistenceIdentifier => $formDefinitionInformation) {
222 $formDefinitionInformation[
'hasNewFileExtension'] ===
true
223 && $formDefinitionInformation[
'hasReferencesForOldFileExtension'] ===
false
224 && $formDefinitionInformation[
'hasReferencesForNewFileExtension'] ===
false
227 $formDefinitionInformation[
'hasNewFileExtension'] ===
false
228 && $formDefinitionInformation[
'location'] ===
'extension'
229 && $formDefinitionInformation[
'hasReferencesForOldFileExtension'] ===
false
230 && $formDefinitionInformation[
'hasReferencesForNewFileExtension'] ===
false
237 $formDefinitionInformation[
'hasNewFileExtension'] ===
true
239 $formDefinitionInformation[
'hasReferencesForOldFileExtension'] ===
true
240 || $formDefinitionInformation[
'hasReferencesForNewFileExtension'] ===
true
243 foreach ($formDefinitionInformation[
'referencesForOldFileExtension'] as $referenceForOldFileExtension) {
245 $referenceForOldFileExtension,
246 $referenceForOldFileExtension[
'sheetIdentifiersWhichNeedsUpdate'],
247 $formDefinitionInformation[
'persistenceIdentifier']
250 $referenceForOldFileExtension[
'ttContentUid'],
256 foreach ($formDefinitionInformation[
'referencesForNewFileExtension'] as $referenceForNewFileExtension) {
258 $referenceForNewFileExtension,
259 $referenceForNewFileExtension[
'sheetIdentifiersWhichNeedsUpdate']
262 $referenceForNewFileExtension[
'ttContentUid'],
270 if ($formDefinitionInformation[
'location'] ===
'storage') {
271 $file = $formDefinitionInformation[
'file'];
273 $newPossiblePersistenceIdentifier = $this->persistenceManager->getUniquePersistenceIdentifier(
274 $file->getNameWithoutExtension(),
275 $file->getParentFolder()->getCombinedIdentifier()
278 $newPossiblePersistenceIdentifier,
284 $newPersistenceIdentifier = $file->getCombinedIdentifier();
286 $this->output->writeln(sprintf(
287 '<error>Failed to rename form definition "%s" to "%s".</error>',
288 $formDefinitionInformation[
'persistenceIdentifier'],
296 $formDefinitionInformation[
'hasReferencesForOldFileExtension'] ===
true
297 || $formDefinitionInformation[
'hasReferencesForNewFileExtension'] ===
true
299 foreach ($formDefinitionInformation[
'referencesForOldFileExtension'] as $referenceForOldFileExtension) {
301 $referenceForOldFileExtension[
'flexform'],
302 $formDefinitionsInformation,
303 $currentPersistenceIdentifier,
304 $formDefinitionInformation[
'persistenceIdentifier'],
305 $newPersistenceIdentifier
308 $referenceForOldFileExtension,
309 $sheetIdentifiersWhichNeedsUpdate,
310 $newPersistenceIdentifier
313 $referenceForOldFileExtension[
'ttContentUid'],
318 foreach ($formDefinitionInformation[
'referencesForNewFileExtension'] as $referenceForNewFileExtension) {
320 $referenceForNewFileExtension[
'flexform'],
321 $formDefinitionsInformation,
322 $currentPersistenceIdentifier,
323 $formDefinitionInformation[
'persistenceIdentifier'],
324 $newPersistenceIdentifier
327 $referenceForNewFileExtension,
328 $sheetIdentifiersWhichNeedsUpdate,
329 $newPersistenceIdentifier
332 $referenceForNewFileExtension[
'ttContentUid'],
339 $this->output->writeln(sprintf(
340 '<error>Failed to rename form definition "%s" to "%s". You have to be rename it by hand!. '
341 .
'After that you can run this wizard again to migrate the references.</error>',
342 $formDefinitionInformation[
'persistenceIdentifier'],
348 $filePersistenceSlot->defineInvocation(
361 $formDefinitionsInformation = array_merge(
368 return $formDefinitionsInformation;
376 $formDefinitionsInformation = [];
378 foreach ($this->persistenceManager->retrieveYamlFilesFromStorageFolders() as $file) {
379 $persistenceIdentifier = $file->getCombinedIdentifier();
382 if (empty($formDefinition)) {
387 $persistenceIdentifier,
394 return $formDefinitionsInformation;
402 $formDefinitionsInformation = [];
404 foreach ($this->persistenceManager->retrieveYamlFilesFromExtensionFolders() as $persistenceIdentifier => $_) {
406 $file = $this->resourceFactory->retrieveFileOrFolderObject($persistenceIdentifier);
412 if (empty($formDefinition)) {
417 $persistenceIdentifier,
424 return $formDefinitionsInformation;
435 string $persistenceIdentifier,
436 array $formDefinition,
441 'location' => $localtion,
442 'persistenceIdentifier' => $persistenceIdentifier,
443 'prototypeName' => $formDefinition[
'prototypeName'],
444 'formIdentifier' => $formDefinition[
'identifier'],
446 'referencesForOldFileExtension' => [],
447 'referencesForNewFileExtension' => [],
449 'hasReferencesForOldFileExtension' =>
false,
450 'hasReferencesForNewFileExtension' =>
false,
451 'referencesForOldFileExtensionNeedsFlexformUpdates' =>
false,
452 'referencesForNewFileExtensionNeedsFlexformUpdates' =>
false,
463 if (empty($pluginData[
'pi_flexform'])) {
466 $flexform = GeneralUtility::xml2array($pluginData[
'pi_flexform']);
474 'ttContentUid' => (int)$pluginData[
'uid'],
475 'flexform' => $flexform,
476 'sheetIdentifiersWhichNeedsUpdate' => [],
479 $targetPersistenceIdentifier =
null;
480 if (array_key_exists($referencedPersistenceIdentifier, $formDefinitionsInformation)) {
481 $targetPersistenceIdentifier = $referencedPersistenceIdentifier;
482 if ($referenceHasNewFileExtension) {
483 $referenceData[
'scope'] =
'referencesForNewFileExtension';
485 $referenceData[
'scope'] =
'referencesForOldFileExtension';
488 if ($referenceHasNewFileExtension) {
489 if (array_key_exists($possibleOldReferencedPersistenceIdentifier, $formDefinitionsInformation)) {
490 $targetPersistenceIdentifier = $possibleOldReferencedPersistenceIdentifier;
491 $referenceData[
'scope'] =
'referencesForNewFileExtension';
497 if (array_key_exists($possibleNewReferencedPersistenceIdentifier, $formDefinitionsInformation)) {
498 $targetPersistenceIdentifier = $possibleNewReferencedPersistenceIdentifier;
499 $referenceData[
'scope'] =
'referencesForOldFileExtension';
509 $formDefinitionsInformation,
510 $targetPersistenceIdentifier,
511 $possibleOldReferencedPersistenceIdentifier,
512 $possibleNewReferencedPersistenceIdentifier
515 $scope = $referenceData[
'scope'];
517 $formDefinitionsInformation[$targetPersistenceIdentifier][$scope][] = $referenceData;
518 if ($scope ===
'referencesForOldFileExtension') {
519 $formDefinitionsInformation[$targetPersistenceIdentifier][
'hasReferencesForOldFileExtension'] =
true;
520 $formDefinitionsInformation[$targetPersistenceIdentifier][
'referencesForOldFileExtensionNeedsFlexformUpdates'] = !empty($referenceData[
'sheetIdentifiersWhichNeedsUpdate']);
522 $formDefinitionsInformation[$targetPersistenceIdentifier][
'hasReferencesForNewFileExtension'] =
true;
523 $formDefinitionsInformation[$targetPersistenceIdentifier][
'referencesForNewFileExtensionNeedsFlexformUpdates'] = !empty($referenceData[
'sheetIdentifiersWhichNeedsUpdate']);
527 return $formDefinitionsInformation;
540 array $formDefinitionsInformation,
541 string $targetPersistenceIdentifier,
542 string $possibleOldReferencedPersistenceIdentifier,
543 string $possibleNewReferencedPersistenceIdentifier
545 $sheetIdentifiersWhichNeedsUpdate = [];
548 foreach ($sheetIdentifiers as $currentSheetIdentifier => $finisherIdentifier) {
550 $possibleOldReferencedPersistenceIdentifier,
551 $formDefinitionsInformation[$targetPersistenceIdentifier][
'prototypeName'],
552 $formDefinitionsInformation[$targetPersistenceIdentifier][
'formIdentifier'],
557 $possibleNewReferencedPersistenceIdentifier,
558 $formDefinitionsInformation[$targetPersistenceIdentifier][
'prototypeName'],
559 $formDefinitionsInformation[$targetPersistenceIdentifier][
'formIdentifier'],
564 $currentSheetIdentifier === $sheetIdentifierForOldPersistenceIdentifier
565 && !array_key_exists($sheetIdentifierForNewPersistenceIdentifier, $sheetIdentifiers)
567 $sheetIdentifiersWhichNeedsUpdate[$currentSheetIdentifier] = $sheetIdentifierForNewPersistenceIdentifier;
571 return $sheetIdentifiersWhichNeedsUpdate;
580 $sheetIdentifiers = [];
582 $itemOptionPath = array_keys($sheetData[
'lDEF']);
583 $firstSheetItemOptionPath = array_shift($itemOptionPath);
584 preg_match(
'#^settings\.finishers\.(.*)\..+$#', $firstSheetItemOptionPath, $matches);
585 if (!isset($matches[1])) {
588 $sheetIdentifiers[$sheetIdentifier] = $matches[1];
591 return $sheetIdentifiers;
600 if (!isset($flexform[
'data'])) {
607 return $key !==
'sDEF' && strlen($key) === 32;
619 return $flexform[
'data'][
'sDEF'][
'lDEF'][
'settings.persistenceIdentifier'][
'vDEF'] ??
'';
629 array $referenceData,
630 array $sheetIdentifiersWhichNeedsUpdate,
631 string $newPersistenceIdentifier =
''
633 $flexform = $referenceData[
'flexform'];
634 if (!empty($newPersistenceIdentifier)) {
635 $flexform[
'data'][
'sDEF'][
'lDEF'][
'settings.persistenceIdentifier'][
'vDEF'] = $newPersistenceIdentifier;
638 foreach ($sheetIdentifiersWhichNeedsUpdate as $oldSheetIdentifier => $newSheetIdentifier) {
639 $flexform[
'data'][$newSheetIdentifier] = $flexform[
'data'][$oldSheetIdentifier];
640 unset($flexform[
'data'][$oldSheetIdentifier]);
643 return $this->flexFormTools->flexArray2Xml($flexform,
true);
653 $persistenceIdentifier,
664 return isset($formDefinition[
'identifier'], $formDefinition[
'type']) && $formDefinition[
'type'] ===
'Form';
675 #^(.*)(\.form\.yaml)$#',
677 $persistenceIdentifier
688 '#(?<!\.form).yaml$#',
690 $persistenceIdentifier
702 string $persistenceIdentifier,
703 string $prototypeName,
704 string $formIdentifier,
705 string $finisherIdentifier
709 $persistenceIdentifier,
728 $formDefinition = [];
731 $formDefinition = [];
734 return $formDefinition;
743 $metaDataProperties = [
'identifier',
'type',
'label',
'prototypeName'];
745 foreach (explode(
"\n", $maybeRawFormDefinition) as $line) {
746 if (empty($line) || $line[0] ===
' ') {
750 [$key, $value] = explode(
':', $line);
754 || !in_array($key, $metaDataProperties)
759 $value = trim($value,
' \'"');
760 $metaData[$key] = $value;
771 $queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)
772 ->getQueryBuilderForTable(
'tt_content');
773 $queryBuilder->getRestrictions()
775 ->add(GeneralUtility::makeInstance(DeletedRestriction::class));
777 $records = $queryBuilder
778 ->select(
'uid',
'pi_flexform')
781 $queryBuilder->expr()->eq(
783 $queryBuilder->createNamedParameter(
'form_formframework', \PDO::PARAM_STR)
800 bool $updateRefindex =
false
802 $this->connection->update(
804 [
'pi_flexform' => $flexform],
808 if (!$updateRefindex) {
812 $this->referenceIndex->updateRefIndexTable(
823 return GeneralUtility::makeInstance(ObjectManager::class);