Skip to content

Commit 309324a

Browse files
authored
Merge pull request #151 from andreaswolf/MigrateInternalTypeFolderToTypeFolderFlexFormRector
[FEATUER] Add MigrateInternalTypeFolderToTypeFolderFlexFormFractor
2 parents d56ca13 + a5f6523 commit 309324a

File tree

5 files changed

+196
-0
lines changed

5 files changed

+196
-0
lines changed

packages/typo3-fractor/config/typo3-12.php

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
use a9f\Typo3Fractor\TYPO3v12\FlexForm\MigrateEmailFlagToEmailTypeFlexFormFractor;
66
use a9f\Typo3Fractor\TYPO3v12\FlexForm\MigrateEvalIntAndDouble2ToTypeNumberFlexFormFractor;
7+
use a9f\Typo3Fractor\TYPO3v12\FlexForm\MigrateInternalTypeFolderToTypeFolderFlexFormFractor;
78
use a9f\Typo3Fractor\TYPO3v12\FlexForm\MigrateNullFlagFlexFormFractor;
89
use a9f\Typo3Fractor\TYPO3v12\Fluid\AbstractMessageGetSeverityFluidRector;
910
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
@@ -17,5 +18,6 @@
1718
$services->set(AbstractMessageGetSeverityFluidRector::class);
1819
$services->set(MigrateEmailFlagToEmailTypeFlexFormFractor::class);
1920
$services->set(MigrateEvalIntAndDouble2ToTypeNumberFlexFormFractor::class);
21+
$services->set(MigrateInternalTypeFolderToTypeFolderFlexFormFractor::class);
2022
$services->set(MigrateNullFlagFlexFormFractor::class);
2123
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<T3DataStructure>
3+
<sheets>
4+
<sDEF>
5+
<ROOT>
6+
<sheetTitle>sheetTitle</sheetTitle>
7+
<type>array</type>
8+
<el>
9+
<settings.group_field>
10+
<label>Group field</label>
11+
<config>
12+
<type>group</type>
13+
<internal_type>folder</internal_type>
14+
</config>
15+
</settings.group_field>
16+
<settings.migrated_group_field>
17+
<label>Migrated Group field</label>
18+
<config>
19+
<type>folder</type>
20+
</config>
21+
</settings.migrated_group_field>
22+
</el>
23+
</ROOT>
24+
</sDEF>
25+
</sheets>
26+
</T3DataStructure>
27+
-----
28+
<?xml version="1.0" encoding="UTF-8"?>
29+
<T3DataStructure>
30+
<sheets>
31+
<sDEF>
32+
<ROOT>
33+
<sheetTitle>sheetTitle</sheetTitle>
34+
<type>array</type>
35+
<el>
36+
<settings.group_field>
37+
<label>Group field</label>
38+
<config>
39+
<type>folder</type>
40+
</config>
41+
</settings.group_field>
42+
<settings.migrated_group_field>
43+
<label>Migrated Group field</label>
44+
<config>
45+
<type>folder</type>
46+
</config>
47+
</settings.migrated_group_field>
48+
</el>
49+
</ROOT>
50+
</sDEF>
51+
</sheets>
52+
</T3DataStructure>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace a9f\Typo3Fractor\Tests\TYPO3v12\FlexForm\MigrateInternalTypeFolderToTypeFolderFlexFormFractor;
6+
7+
use a9f\Fractor\Testing\PHPUnit\AbstractFractorTestCase;
8+
use PHPUnit\Framework\Attributes\DataProvider;
9+
10+
final class MigrateInternalTypeFolderToTypeFolderFlexFormFractorTest extends AbstractFractorTestCase
11+
{
12+
#[DataProvider('provideData')]
13+
public function test(string $filePath): void
14+
{
15+
$this->doTestFile($filePath);
16+
}
17+
18+
public static function provideData(): \Iterator
19+
{
20+
return self::yieldFilesFromDirectory(__DIR__ . '/Fixtures', '*.xml');
21+
}
22+
23+
public function provideConfigFilePath(): ?string
24+
{
25+
return __DIR__ . '/config/fractor.php';
26+
}
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use a9f\Fractor\Configuration\FractorConfiguration;
6+
use a9f\Fractor\ValueObject\Indent;
7+
use a9f\FractorXml\Configuration\XmlProcessorOption;
8+
use a9f\Typo3Fractor\TYPO3v12\FlexForm\MigrateInternalTypeFolderToTypeFolderFlexFormFractor;
9+
10+
return FractorConfiguration::configure()
11+
->withOptions([
12+
XmlProcessorOption::INDENT_CHARACTER => Indent::STYLE_TAB,
13+
XmlProcessorOption::INDENT_SIZE => 1,
14+
])
15+
->withRules([MigrateInternalTypeFolderToTypeFolderFlexFormFractor::class]);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace a9f\Typo3Fractor\TYPO3v12\FlexForm;
6+
7+
use a9f\Fractor\Application\ValueObject\File;
8+
use a9f\Typo3Fractor\AbstractFlexformFractor;
9+
use a9f\Typo3Fractor\Helper\FlexFormHelperTrait;
10+
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
11+
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
12+
13+
/**
14+
* @changelog https://docs.typo3.org/c/typo3/cms-core/main/en-us/Changelog/12.0/Feature-96983-TCATypeFolder.html
15+
* @see \a9f\Typo3Fractor\Tests\TYPO3v12\FlexForm\MigrateInternalTypeFolderToTypeFolderFlexFormFractor\MigrateInternalTypeFolderToTypeFolderFlexFormFractorTest
16+
*/
17+
final class MigrateInternalTypeFolderToTypeFolderFlexFormFractor extends AbstractFlexformFractor
18+
{
19+
use FlexFormHelperTrait;
20+
21+
private \DOMDocument $domDocument;
22+
23+
public function canHandle(\DOMNode $node): bool
24+
{
25+
return parent::canHandle($node) && $node->nodeName === 'config';
26+
}
27+
28+
public function beforeTraversal(File $file, \DOMDocument $rootNode): void
29+
{
30+
$this->file = $file;
31+
$this->domDocument = $rootNode;
32+
}
33+
34+
public function refactor(\DOMNode $node): \DOMNode|int|null
35+
{
36+
if (! $node instanceof \DOMElement) {
37+
return null;
38+
}
39+
40+
if (! $this->isConfigType($node, 'group') || ! $this->hasKey($node, 'internal_type')) {
41+
return null;
42+
}
43+
44+
$internalTypeDomElement = $this->extractDomElementByKey($node, 'internal_type');
45+
if (! $internalTypeDomElement instanceof \DOMElement) {
46+
return null;
47+
}
48+
49+
// Unset
50+
if ($internalTypeDomElement->parentNode instanceof \DOMElement) {
51+
$internalTypeDomElement->parentNode->removeChild($internalTypeDomElement);
52+
}
53+
54+
if ($internalTypeDomElement->nodeValue === 'folder') {
55+
$this->changeTcaType($this->domDocument, $node, 'folder');
56+
}
57+
58+
return $node;
59+
}
60+
61+
public function getRuleDefinition(): RuleDefinition
62+
{
63+
return new RuleDefinition('Migrates TCA internal_type into new new TCA type folder', [new CodeSample(
64+
<<<'CODE_SAMPLE'
65+
<T3DataStructure>
66+
<ROOT>
67+
<sheetTitle>aTitle</sheetTitle>
68+
<type>array</type>
69+
<el>
70+
<aFlexField>
71+
<label>aFlexFieldLabel</label>
72+
<config>
73+
<type>group</type>
74+
<internal_type>folder</internal_type>
75+
</config>
76+
</aFlexField>
77+
</el>
78+
</ROOT>
79+
</T3DataStructure>
80+
CODE_SAMPLE
81+
,
82+
<<<'CODE_SAMPLE'
83+
<T3DataStructure>
84+
<ROOT>
85+
<sheetTitle>aTitle</sheetTitle>
86+
<type>array</type>
87+
<el>
88+
<aFlexField>
89+
<label>aFlexFieldLabel</label>
90+
<config>
91+
<type>folder</type>
92+
</config>
93+
</aFlexField>
94+
</el>
95+
</ROOT>
96+
</T3DataStructure>
97+
CODE_SAMPLE
98+
)]);
99+
}
100+
}

0 commit comments

Comments
 (0)