Skip to content

Commit a7434a7

Browse files
authored
Merge pull request #158 from andreaswolf/MigrateRequiredFlagFlexFormFractor
[FEATURE] Add MigrateRequiredFlagFlexFormFractor
2 parents 8ce73b0 + 98cbf02 commit a7434a7

File tree

5 files changed

+240
-0
lines changed

5 files changed

+240
-0
lines changed

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

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use a9f\Typo3Fractor\TYPO3v12\FlexForm\MigrateNullFlagFlexFormFractor;
99
use a9f\Typo3Fractor\TYPO3v12\FlexForm\MigratePasswordAndSaltedPasswordToPasswordTypeFlexFormFractor;
1010
use a9f\Typo3Fractor\TYPO3v12\FlexForm\MigrateRenderTypeColorpickerToTypeColorFlexFormFractor;
11+
use a9f\Typo3Fractor\TYPO3v12\FlexForm\MigrateRequiredFlagFlexFormFractor;
1112
use a9f\Typo3Fractor\TYPO3v12\Fluid\AbstractMessageGetSeverityFluidRector;
1213
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
1314

@@ -24,4 +25,5 @@
2425
$services->set(MigrateNullFlagFlexFormFractor::class);
2526
$services->set(MigratePasswordAndSaltedPasswordToPasswordTypeFlexFormFractor::class);
2627
$services->set(MigrateRenderTypeColorpickerToTypeColorFlexFormFractor::class);
28+
$services->set(MigrateRequiredFlagFlexFormFractor::class);
2729
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
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.fieldContainsEvalRequired>
10+
<config>
11+
<type>input</type>
12+
<eval>required</eval>
13+
</config>
14+
</settings.fieldContainsEvalRequired>
15+
<settings.fieldContainsEvalTrimRequired>
16+
<config>
17+
<type>input</type>
18+
<eval>trim,required</eval>
19+
</config>
20+
</settings.fieldContainsEvalTrimRequired>
21+
<settings.fieldDoesNotContainEvalWithRequire>
22+
<config>
23+
<type>input</type>
24+
<eval>trim</eval>
25+
</config>
26+
</settings.fieldDoesNotContainEvalWithRequire>
27+
<settings.fieldDoesNotContainEval>
28+
<config>
29+
<type>input</type>
30+
</config>
31+
</settings.fieldDoesNotContainEval>
32+
</el>
33+
</ROOT>
34+
</sDEF>
35+
</sheets>
36+
</T3DataStructure>
37+
-----
38+
<?xml version="1.0" encoding="UTF-8"?>
39+
<T3DataStructure>
40+
<sheets>
41+
<sDEF>
42+
<ROOT>
43+
<sheetTitle>sheetTitle</sheetTitle>
44+
<type>array</type>
45+
<el>
46+
<settings.fieldContainsEvalRequired>
47+
<config>
48+
<type>input</type>
49+
<required>1</required>
50+
</config>
51+
</settings.fieldContainsEvalRequired>
52+
<settings.fieldContainsEvalTrimRequired>
53+
<config>
54+
<type>input</type>
55+
<eval>trim</eval>
56+
<required>1</required>
57+
</config>
58+
</settings.fieldContainsEvalTrimRequired>
59+
<settings.fieldDoesNotContainEvalWithRequire>
60+
<config>
61+
<type>input</type>
62+
<eval>trim</eval>
63+
</config>
64+
</settings.fieldDoesNotContainEvalWithRequire>
65+
<settings.fieldDoesNotContainEval>
66+
<config>
67+
<type>input</type>
68+
</config>
69+
</settings.fieldDoesNotContainEval>
70+
</el>
71+
</ROOT>
72+
</sDEF>
73+
</sheets>
74+
</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\MigrateRequiredFlagFlexFormFractor;
6+
7+
use a9f\Fractor\Testing\PHPUnit\AbstractFractorTestCase;
8+
use PHPUnit\Framework\Attributes\DataProvider;
9+
10+
final class MigrateRequiredFlagFlexFormFractorTest 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\MigrateRequiredFlagFlexFormFractor;
9+
10+
return FractorConfiguration::configure()
11+
->withOptions([
12+
XmlProcessorOption::INDENT_CHARACTER => Indent::STYLE_TAB,
13+
XmlProcessorOption::INDENT_SIZE => 1,
14+
])
15+
->withRules([MigrateRequiredFlagFlexFormFractor::class]);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
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\Fractor\Helper\ArrayUtility;
9+
use a9f\Fractor\Helper\StringUtility;
10+
use a9f\Typo3Fractor\AbstractFlexformFractor;
11+
use a9f\Typo3Fractor\Helper\FlexFormHelperTrait;
12+
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
13+
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
14+
15+
/**
16+
* @changelog https://docs.typo3.org/c/typo3/cms-core/main/en-us/Changelog/12.0/Deprecation-97035-RequiredOptionInEvalKeyword.html
17+
* @changelog https://docs.typo3.org/c/typo3/cms-core/main/en-us/Changelog/12.0/Feature-97035-UtilizeRequiredDirectlyInTCAFieldConfiguration.html
18+
* @see \a9f\Typo3Fractor\Tests\TYPO3v12\FlexForm\MigrateRequiredFlagFlexFormFractor\MigrateRequiredFlagFlexFormFractorTest
19+
*/
20+
final class MigrateRequiredFlagFlexFormFractor extends AbstractFlexformFractor
21+
{
22+
use FlexFormHelperTrait;
23+
24+
private \DOMDocument $domDocument;
25+
26+
public function canHandle(\DOMNode $node): bool
27+
{
28+
return parent::canHandle($node) && $node->nodeName === 'config';
29+
}
30+
31+
public function beforeTraversal(File $file, \DOMDocument $rootNode): void
32+
{
33+
$this->file = $file;
34+
$this->domDocument = $rootNode;
35+
}
36+
37+
public function refactor(\DOMNode $node): \DOMNode|int|null
38+
{
39+
if (! $node instanceof \DOMElement) {
40+
return null;
41+
}
42+
43+
if (! $this->hasKey($node, 'eval')) {
44+
return null;
45+
}
46+
47+
$evalDomElement = $this->extractDomElementByKey($node, 'eval');
48+
if (! $evalDomElement instanceof \DOMElement) {
49+
return null;
50+
}
51+
52+
$evalListValue = $evalDomElement->nodeValue;
53+
if (! is_string($evalListValue)) {
54+
return null;
55+
}
56+
57+
if (! StringUtility::inList($evalListValue, 'required')) {
58+
return null;
59+
}
60+
61+
$evalList = ArrayUtility::trimExplode(',', $evalListValue, true);
62+
63+
// Remove "required" from $evalList
64+
$evalList = array_filter($evalList, static fn (string $eval): bool => $eval !== 'required');
65+
66+
if ($evalList !== []) {
67+
// Write back filtered 'eval'
68+
$evalDomElement->nodeValue = '';
69+
$evalDomElement->appendChild($this->domDocument->createTextNode(implode(',', $evalList)));
70+
} elseif ($evalDomElement->parentNode instanceof \DOMElement) {
71+
// 'eval' is empty, remove whole configuration
72+
$evalDomElement->parentNode->removeChild($evalDomElement);
73+
}
74+
75+
$requiredDomElement = $this->extractDomElementByKey($node, 'required');
76+
if (! $requiredDomElement instanceof \DOMElement) {
77+
$node->appendChild($this->domDocument->createElement('required', '1'));
78+
}
79+
80+
return $node;
81+
}
82+
83+
public function getRuleDefinition(): RuleDefinition
84+
{
85+
return new RuleDefinition('Migrate required flag', [new CodeSample(
86+
<<<'CODE_SAMPLE'
87+
<T3DataStructure>
88+
<ROOT>
89+
<sheetTitle>aTitle</sheetTitle>
90+
<type>array</type>
91+
<el>
92+
<some_column>
93+
<title>foo</title>
94+
<config>
95+
<eval>trim,required</eval>
96+
</config>
97+
</some_column>
98+
</el>
99+
</ROOT>
100+
</T3DataStructure>
101+
CODE_SAMPLE
102+
,
103+
<<<'CODE_SAMPLE'
104+
<T3DataStructure>
105+
<ROOT>
106+
<sheetTitle>aTitle</sheetTitle>
107+
<type>array</type>
108+
<el>
109+
<some_column>
110+
<title>foo</title>
111+
<config>
112+
<eval>trim</eval>
113+
<required>1</required>
114+
</config>
115+
</some_column>
116+
</el>
117+
</ROOT>
118+
</T3DataStructure>
119+
CODE_SAMPLE
120+
)]);
121+
}
122+
}

0 commit comments

Comments
 (0)