‪TYPO3CMS  ‪main
FlexFormToolsTest.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use PHPUnit\Framework\Attributes\DataProvider;
21 use PHPUnit\Framework\Attributes\Test;
22 use Symfony\Component\DependencyInjection\Container;
33 use TYPO3\TestingFramework\Core\Functional\FunctionalTestCase;
34 
35 final class ‪FlexFormToolsTest extends FunctionalTestCase
36 {
37  #[Test]
39  {
40  $fieldTca = [
41  'config' => [
42  'ds' => [
43  'default' => '<T3DataStructure>...',
44  ],
45  ],
46  ];
47  $result = $this->get(FlexFormTools::class)->getDataStructureIdentifier($fieldTca, 'aTableName', 'aFieldName', []);
48  $expected = '{"type":"tca","tableName":"aTableName","fieldName":"aFieldName","dataStructureKey":"default"}';
49  self::assertSame($expected, $result);
50  }
51 
52  #[Test]
54  {
55  $fieldTca = [
56  'config' => [
57  'ds' => [
58  'default' => '<T3DataStructure>...',
59  ],
60  ],
61  ];
63  $container = $this->get('service_container');
64  $container->set(
65  'noop',
67  // noop
68  }
69  );
70  $eventListener = $this->get(ListenerProvider::class);
71  $eventListener->addListener(BeforeFlexFormDataStructureIdentifierInitializedEvent::class, 'noop');
72  $result = $this->get(FlexFormTools::class)->getDataStructureIdentifier($fieldTca, 'aTableName', 'aFieldName', []);
73  $expected = '{"type":"tca","tableName":"aTableName","fieldName":"aFieldName","dataStructureKey":"default"}';
74  self::assertSame($expected, $result);
75  }
76 
77  #[Test]
79  {
81  $container = $this->get('service_container');
82  $container->set(
83  'identifier-one',
85  $event->‪setIdentifier([
86  'type' => 'myExtension',
87  'further' => 'data',
88  ]);
89  }
90  );
91  $eventListener = $this->get(ListenerProvider::class);
92  $eventListener->addListener(BeforeFlexFormDataStructureIdentifierInitializedEvent::class, 'identifier-one');
93  $result = $this->get(FlexFormTools::class)->getDataStructureIdentifier([], 'aTableName', 'aFieldName', []);
94  $expected = '{"type":"myExtension","further":"data"}';
95  self::assertSame($expected, $result);
96  }
97 
98  #[Test]
100  {
102  $container = $this->get('service_container');
103  $container->set(
104  'modifier-one',
106  $id = $event->‪getIdentifier();
107  $id['beep'] = 'boop';
108  $event->‪setIdentifier($id);
109  }
110  );
111  $fieldTca = [
112  'config' => [
113  'ds' => [
114  'default' => '<T3DataStructure>...',
115  ],
116  ],
117  ];
118  $eventListener = $this->get(ListenerProvider::class);
119  $eventListener->addListener(AfterFlexFormDataStructureIdentifierInitializedEvent::class, 'modifier-one');
120  $result = $this->get(FlexFormTools::class)->getDataStructureIdentifier($fieldTca, 'aTableName', 'aFieldName', []);
121  $expected = '{"type":"tca","tableName":"aTableName","fieldName":"aFieldName","dataStructureKey":"default","beep":"boop"}';
122  self::assertSame($expected, $result);
123  }
124 
125  #[Test]
127  {
128  $fieldTca = [
129  'config' => [
130  'ds' => 'someStringOnly',
131  // no ds_pointerField,
132  ],
133  ];
134  $this->expectException(\RuntimeException::class);
135  $this->expectExceptionCode(1463826960);
136  $this->get(FlexFormTools::class)->getDataStructureIdentifier($fieldTca, 'aTableName', 'aFieldName', []);
137  }
138 
139  #[Test]
141  {
142  $fieldTca = [
143  'config' => [
144  'ds' => [
145  'default' => '<T3DataStructure>...',
146  ],
147  ],
148  ];
149  $expected = '{"type":"tca","tableName":"aTableName","fieldName":"aFieldName","dataStructureKey":"default"}';
150  self::assertSame($expected, $this->get(FlexFormTools::class)->getDataStructureIdentifier($fieldTca, 'aTableName', 'aFieldName', []));
151  }
152 
153  #[Test]
155  {
156  $fieldTca = [
157  'config' => [
158  'ds' => [],
159  ],
160  ];
161  $this->expectException(InvalidTcaException::class);
162  $this->expectExceptionCode(1463652560);
163  self::assertSame('default', $this->get(FlexFormTools::class)->getDataStructureIdentifier($fieldTca, 'aTableName', 'aFieldName', []));
164  }
165 
166  #[Test]
168  {
169  $fieldTca = [
170  'config' => [
171  'ds' => [],
172  'ds_pointerField' => 'first,second,third',
173  ],
174  ];
175  $this->expectException(\RuntimeException::class);
176  $this->expectExceptionCode(1463577497);
177  $this->get(FlexFormTools::class)->getDataStructureIdentifier($fieldTca, 'aTableName', 'aFieldName', []);
178  }
179 
180  #[Test]
182  {
183  $fieldTca = [
184  'config' => [
185  'ds' => [],
186  'ds_pointerField' => 'notExist',
187  ],
188  ];
189  $row = [
190  'foo' => '',
191  ];
192  $this->expectException(\RuntimeException::class);
193  $this->expectExceptionCode(1463578899);
194  $this->get(FlexFormTools::class)->getDataStructureIdentifier($fieldTca, 'aTableName', 'aFieldName', $row);
195  }
196 
197  #[Test]
199  {
200  $fieldTca = [
201  'config' => [
202  'ds' => [],
203  'ds_pointerField' => 'notExist,second',
204  ],
205  ];
206  $row = [
207  'second' => '',
208  ];
209  $this->expectException(\RuntimeException::class);
210  $this->expectExceptionCode(1463578899);
211  $this->get(FlexFormTools::class)->getDataStructureIdentifier($fieldTca, 'aTableName', 'aFieldName', $row);
212  }
213 
214  #[Test]
216  {
217  $fieldTca = [
218  'config' => [
219  'ds' => [],
220  'ds_pointerField' => 'first,notExist',
221  ],
222  ];
223  $row = [
224  'first' => '',
225  ];
226  $this->expectException(\RuntimeException::class);
227  $this->expectExceptionCode(1463578900);
228  $this->get(FlexFormTools::class)->getDataStructureIdentifier($fieldTca, 'aTableName', 'aFieldName', $row);
229  }
230 
231  #[Test]
233  {
234  $fieldTca = [
235  'config' => [
236  'ds' => [
237  'thePointerValue' => 'FILE:...',
238  ],
239  'ds_pointerField' => 'aField',
240  ],
241  ];
242  $row = [
243  'aField' => 'thePointerValue',
244  ];
245  $expected = '{"type":"tca","tableName":"aTableName","fieldName":"aFieldName","dataStructureKey":"thePointerValue"}';
246  self::assertSame($expected, $this->get(FlexFormTools::class)->getDataStructureIdentifier($fieldTca, 'aTableName', 'aFieldName', $row));
247  }
248 
249  #[Test]
251  {
252  $fieldTca = [
253  'config' => [
254  'ds' => [
255  'default' => 'theDataStructure',
256  ],
257  'ds_pointerField' => 'aField',
258  ],
259  ];
260  $row = [
261  'aField' => 'thePointerValue',
262  ];
263  $expected = '{"type":"tca","tableName":"aTableName","fieldName":"aFieldName","dataStructureKey":"default"}';
264  self::assertSame($expected, $this->get(FlexFormTools::class)->getDataStructureIdentifier($fieldTca, 'aTableName', 'aFieldName', $row));
265  }
266 
267  #[Test]
269  {
270  $fieldTca = [
271  'config' => [
272  'ds' => [
273  'aDifferentDataStructure' => 'aDataStructure',
274  ],
275  'ds_pointerField' => 'aField',
276  ],
277  ];
278  $row = [
279  'uid' => 23,
280  'aField' => 'aNotDefinedDataStructure',
281  ];
282  $this->expectException(InvalidSinglePointerFieldException::class);
283  $this->expectExceptionCode(1463653197);
284  $this->get(FlexFormTools::class)->getDataStructureIdentifier($fieldTca, 'aTableName', 'aFieldName', $row);
285  }
286 
291  {
292  return [
293  'direct match of two fields' => [
294  [
295  // $row
296  'firstField' => 'firstValue',
297  'secondField' => 'secondValue',
298  ],
299  [
300  // registered data structure names
301  'firstValue,secondValue' => '',
302  ],
303  // expected name
304  '{"type":"tca","tableName":"aTableName","fieldName":"aFieldName","dataStructureKey":"firstValue,secondValue"}',
305  ],
306  'match on first field, * for second' => [
307  [
308  'firstField' => 'firstValue',
309  'secondField' => 'secondValue',
310  ],
311  [
312  'firstValue,*' => '',
313  ],
314  '{"type":"tca","tableName":"aTableName","fieldName":"aFieldName","dataStructureKey":"firstValue,*"}',
315  ],
316  'match on second field, * for first' => [
317  [
318  'firstField' => 'firstValue',
319  'secondField' => 'secondValue',
320  ],
321  [
322  '*,secondValue' => '',
323  ],
324  '{"type":"tca","tableName":"aTableName","fieldName":"aFieldName","dataStructureKey":"*,secondValue"}',
325  ],
326  'match on first field only' => [
327  [
328  'firstField' => 'firstValue',
329  'secondField' => 'secondValue',
330  ],
331  [
332  'firstValue' => '',
333  ],
334  '{"type":"tca","tableName":"aTableName","fieldName":"aFieldName","dataStructureKey":"firstValue"}',
335  ],
336  'fallback to default' => [
337  [
338  'firstField' => 'firstValue',
339  'secondField' => 'secondValue',
340  ],
341  [
342  'default' => '',
343  ],
344  '{"type":"tca","tableName":"aTableName","fieldName":"aFieldName","dataStructureKey":"default"}',
345  ],
346  'chain falls through with no match on second value to *' => [
347  [
348  'firstField' => 'firstValue',
349  'secondField' => 'noMatch',
350  ],
351  [
352  'firstValue,secondValue' => '',
353  'firstValue,*' => '',
354  ],
355  '{"type":"tca","tableName":"aTableName","fieldName":"aFieldName","dataStructureKey":"firstValue,*"}',
356  ],
357  'chain falls through with no match on first value to *' => [
358  [
359  'firstField' => 'noMatch',
360  'secondField' => 'secondValue',
361  ],
362  [
363  'firstValue,secondValue' => '',
364  '*,secondValue' => '',
365  ],
366  '{"type":"tca","tableName":"aTableName","fieldName":"aFieldName","dataStructureKey":"*,secondValue"}',
367  ],
368  'chain falls through with no match on any field to default' => [
369  [
370  'firstField' => 'noMatch',
371  'secondField' => 'noMatchToo',
372  ],
373  [
374  'firstValue,secondValue' => '',
375  'secondValue,*' => '',
376  'default' => '',
377  ],
378  '{"type":"tca","tableName":"aTableName","fieldName":"aFieldName","dataStructureKey":"default"}',
379  ],
380  ];
381  }
382 
383  #[DataProvider('getDataStructureIdentifierReturnsValidNameForTwoFieldCombinationsDataProvider')]
384  #[Test]
385  public function ‪getDataStructureIdentifierReturnsValidNameForTwoFieldCombinations(array $row, array $ds, string $expected): void
386  {
387  $fieldTca = [
388  'config' => [
389  'ds' => $ds,
390  'ds_pointerField' => 'firstField,secondField',
391  ],
392  ];
393  self::assertSame($expected, $this->get(FlexFormTools::class)->getDataStructureIdentifier($fieldTca, 'aTableName', 'aFieldName', $row));
394  }
395 
396  #[Test]
398  {
399  $fieldTca = [
400  'config' => [
401  'ds' => [
402  'firstValue,secondValue' => '',
403  ],
404  'ds_pointerField' => 'firstField,secondField',
405  ],
406  ];
407  $row = [
408  'uid' => 23,
409  'firstField' => 'noMatch',
410  'secondField' => 'noMatchToo',
411  ];
412  $this->expectException(InvalidCombinedPointerFieldException::class);
413  $this->expectExceptionCode(1463678524);
414  $this->get(FlexFormTools::class)->getDataStructureIdentifier($fieldTca, 'aTableName', 'aFieldName', $row);
415  }
416 
417  #[Test]
419  {
420  $this->expectException(InvalidIdentifierException::class);
421  $this->expectExceptionCode(1478100828);
422  $this->get(FlexFormTools::class)->parseDataStructureByIdentifier('');
423  }
424 
425  #[Test]
427  {
428  $this->expectException(\RuntimeException::class);
429  $this->expectExceptionCode(1478345642);
430  $this->get(FlexFormTools::class)->parseDataStructureByIdentifier('egon');
431  }
432 
433  #[Test]
435  {
436  $this->expectException(InvalidIdentifierException::class);
437  $this->expectExceptionCode(1478104554);
438  $this->get(FlexFormTools::class)->parseDataStructureByIdentifier('{"some":"input"}');
439  }
440 
441  #[Test]
443  {
445  $container = $this->get('service_container');
446  $container->set(
447  'string',
448  static function (‪BeforeFlexFormDataStructureParsedEvent $event) {
449  if ($event->‪getIdentifier()['type'] === 'myExtension') {
450  $event->‪setDataStructure('
451  <T3DataStructure>
452  <sheets></sheets>
453  </T3DataStructure>
454  ');
455  }
456  }
457  );
458  $eventListener = $this->get(ListenerProvider::class);
459  $eventListener->addListener(BeforeFlexFormDataStructureParsedEvent::class, 'string');
460  ‪$identifier = '{"type":"myExtension"}';
461  $expected = [
462  'sheets' => '',
463  ];
464  self::assertSame($expected, $this->get(FlexFormTools::class)->parseDataStructureByIdentifier(‪$identifier));
465  }
466 
467  #[Test]
469  {
470  $this->expectException(InvalidIdentifierException::class);
471  $this->expectExceptionCode(1478104554);
472  $this->get(FlexFormTools::class)->parseDataStructureByIdentifier('{"type":"bernd"}');
473  }
474 
475  #[Test]
477  {
478  $this->expectException(\RuntimeException::class);
479  $this->expectExceptionCode(1478113471);
480  ‪$identifier = '{"type":"tca","tableName":"aTableName","fieldName":"aFieldName"}';
481  $this->get(FlexFormTools::class)->parseDataStructureByIdentifier(‪$identifier);
482  }
483 
484  #[Test]
486  {
487  $this->expectException(InvalidIdentifierException::class);
488  $this->expectExceptionCode(1478105491);
489  ‪$identifier = '{"type":"tca","tableName":"aTableName","fieldName":"aFieldName","dataStructureKey":"default"}';
490  $this->get(FlexFormTools::class)->parseDataStructureByIdentifier(‪$identifier);
491  }
492 
493  #[Test]
495  {
496  ‪$GLOBALS['TCA']['aTableName']['columns']['aFieldName']['config']['ds']['default'] = '
497  <T3DataStructure>
498  <sheets></sheets>
499  </T3DataStructure>
500  ';
501  ‪$identifier = '{"type":"tca","tableName":"aTableName","fieldName":"aFieldName","dataStructureKey":"default"}';
502  $expected = [
503  'sheets' => '',
504  ];
505  self::assertSame($expected, $this->get(FlexFormTools::class)->parseDataStructureByIdentifier(‪$identifier));
506  }
507 
508  #[Test]
510  {
511  ‪$GLOBALS['TCA']['aTableName']['columns']['aFieldName']['config']['ds']['default']
512  = 'FILE:EXT:core/Does/Not/Exist.xml';
513  ‪$identifier = '{"type":"tca","tableName":"aTableName","fieldName":"aFieldName","dataStructureKey":"default"}';
514  $this->expectException(\RuntimeException::class);
515  $this->expectExceptionCode(1478105826);
516  $this->get(FlexFormTools::class)->parseDataStructureByIdentifier(‪$identifier);
517  }
518 
519  #[Test]
521  {
522  ‪$GLOBALS['TCA']['aTableName']['columns']['aFieldName']['config']['ds']['default']
523  = ' FILE:EXT:core/Tests/Functional/Configuration/FlexForm/Fixtures/DataStructureWithSheet.xml ';
524  ‪$identifier = '{"type":"tca","tableName":"aTableName","fieldName":"aFieldName","dataStructureKey":"default"}';
525  $expected = [
526  'sheets' => [
527  'sDEF' => [
528  'ROOT' => [
529  'type' => 'array',
530  'el' => [
531  'aFlexField' => [
532  'label' => 'aFlexFieldLabel',
533  'config' => [
534  'type' => 'input',
535  ],
536  ],
537  ],
538  'sheetTitle' => 'aTitle',
539  ],
540  ],
541  ],
542  ];
543  self::assertEquals($expected, $this->get(FlexFormTools::class)->parseDataStructureByIdentifier(‪$identifier));
544  }
545 
546  #[Test]
548  {
549  ‪$GLOBALS['TCA']['aTableName']['columns']['aFieldName']['config']['ds']['default'] = '
550  <T3DataStructure>
551  <sheets>
552  <bar>
553  </sheets>
554  </T3DataStructure>
555  ';
556  ‪$identifier = '{"type":"tca","tableName":"aTableName","fieldName":"aFieldName","dataStructureKey":"default"}';
557  $this->expectException(InvalidIdentifierException::class);
558  $this->expectExceptionCode(1478106090);
559  $this->get(FlexFormTools::class)->parseDataStructureByIdentifier(‪$identifier);
560  }
561 
562  #[Test]
564  {
565  ‪$GLOBALS['TCA']['aTableName']['columns']['aFieldName']['config']['ds']['default'] = '
566  <T3DataStructure>
567  <ROOT></ROOT>
568  <sheets></sheets>
569  </T3DataStructure>
570  ';
571  ‪$identifier = '{"type":"tca","tableName":"aTableName","fieldName":"aFieldName","dataStructureKey":"default"}';
572  $this->expectException(\RuntimeException::class);
573  $this->expectExceptionCode(1440676540);
574  $this->get(FlexFormTools::class)->parseDataStructureByIdentifier(‪$identifier);
575  }
576 
577  #[Test]
579  {
580  ‪$GLOBALS['TCA']['aTableName']['columns']['aFieldName']['config']['ds']['default'] = '
581  <T3DataStructure>
582  <ROOT>
583  <sheetTitle>aTitle</sheetTitle>
584  <type>array</type>
585  <el>
586  <aFlexField>
587  <label>aFlexFieldLabel</label>
588  <config>
589  <type>input</type>
590  </config>
591  </aFlexField>
592  </el>
593  </ROOT>
594  </T3DataStructure>
595  ';
596  ‪$identifier = '{"type":"tca","tableName":"aTableName","fieldName":"aFieldName","dataStructureKey":"default"}';
597  $expected = [
598  'sheets' => [
599  'sDEF' => [
600  'ROOT' => [
601  'type' => 'array',
602  'el' => [
603  'aFlexField' => [
604  'label' => 'aFlexFieldLabel',
605  'config' => [
606  'type' => 'input',
607  ],
608  ],
609  ],
610  'sheetTitle' => 'aTitle',
611  ],
612  ],
613  ],
614  ];
615  self::assertEquals($expected, $this->get(FlexFormTools::class)->parseDataStructureByIdentifier(‪$identifier));
616  }
617 
618  #[Test]
620  {
621  ‪$GLOBALS['TCA']['aTableName']['columns']['aFieldName']['config']['ds']['default'] = '
622  <T3DataStructure>
623  <sheets>
624  <aSheet>
625  EXT:core/Tests/Functional/Configuration/FlexForm/Fixtures/DataStructureOfSingleSheet.xml
626  </aSheet>
627  </sheets>
628  </T3DataStructure>
629  ';
630  ‪$identifier = '{"type":"tca","tableName":"aTableName","fieldName":"aFieldName","dataStructureKey":"default"}';
631  $expected = [
632  'sheets' => [
633  'aSheet' => [
634  'ROOT' => [
635  'type' => 'array',
636  'el' => [
637  'aFlexField' => [
638  'label' => 'aFlexFieldLabel',
639  'config' => [
640  'type' => 'input',
641  ],
642  ],
643  ],
644  'sheetTitle' => 'aTitle',
645  ],
646  ],
647  ],
648  ];
649  self::assertEquals($expected, $this->get(FlexFormTools::class)->parseDataStructureByIdentifier(‪$identifier));
650  }
651 
652  #[Test]
654  {
655  ‪$GLOBALS['TCA']['aTableName']['columns']['aFieldName']['config']['ds']['default'] = '
656  <T3DataStructure>
657  <sheets>
658  <aSheet>
659  FILE:EXT:core/Tests/Functional/Configuration/FlexForm/Fixtures/DataStructureOfSingleSheet.xml
660  </aSheet>
661  </sheets>
662  </T3DataStructure>
663  ';
664  ‪$identifier = '{"type":"tca","tableName":"aTableName","fieldName":"aFieldName","dataStructureKey":"default"}';
665  $expected = [
666  'sheets' => [
667  'aSheet' => [
668  'ROOT' => [
669  'type' => 'array',
670  'el' => [
671  'aFlexField' => [
672  'label' => 'aFlexFieldLabel',
673  'config' => [
674  'type' => 'input',
675  ],
676  ],
677  ],
678  'sheetTitle' => 'aTitle',
679  ],
680  ],
681  ],
682  ];
683  self::assertEquals($expected, $this->get(FlexFormTools::class)->parseDataStructureByIdentifier(‪$identifier));
684  }
685 
686  #[Test]
688  {
689  ‪$GLOBALS['TCA']['aTableName']['columns']['aFieldName']['config']['ds']['default'] = '
690  <T3DataStructure>
691  <sheets></sheets>
692  </T3DataStructure>
693  ';
694  ‪$identifier = '{"type":"tca","tableName":"aTableName","fieldName":"aFieldName","dataStructureKey":"default"}';
696  $container = $this->get('service_container');
697  $container->set(
698  'mock',
699  static function (‪AfterFlexFormDataStructureParsedEvent $event) {
700  $event->‪setDataStructure([
701  'sheets' => [
702  'foo' => 'bar',
703  ],
704  ]);
705  }
706  );
707  $eventListener = $this->get(ListenerProvider::class);
708  $eventListener->addListener(AfterFlexFormDataStructureParsedEvent::class, 'mock');
709  $expected = [
710  'sheets' => [
711  'foo' => 'bar',
712  ],
713  ];
714  self::assertSame($expected, $this->get(FlexFormTools::class)->parseDataStructureByIdentifier(‪$identifier));
715  }
716 
717  #[Test]
719  {
720  ‪$GLOBALS['TCA']['aTableName']['columns']['aFieldName']['config']['ds']['default'] = '
721  <T3DataStructure>
722  <ROOT>
723  <sheetTitle>aTitle</sheetTitle>
724  <type>array</type>
725  <el>
726  <category>
727  <label>Single category</label>
728  <config>
729  <type>category</type>
730  <relationship>oneToOne</relationship>
731  </config>
732  </category>
733  <categories>
734  <config>
735  <type>category</type>
736  </config>
737  </categories>
738  </el>
739  </ROOT>
740  </T3DataStructure>
741  ';
742  ‪$identifier = '{"type":"tca","tableName":"aTableName","fieldName":"aFieldName","dataStructureKey":"default"}';
743  $expected = [
744  'sheets' => [
745  'sDEF' => [
746  'ROOT' => [
747  'type' => 'array',
748  'el' => [
749  'category' => [
750  'label' => 'Single category',
751  'config' => [
752  'type' => 'category',
753  'relationship' => 'oneToOne',
754  'foreign_table' => 'sys_category',
755  'foreign_table_where' => ' AND {#sys_category}.{#sys_language_uid} IN (-1, 0)',
756  'maxitems' => 1,
757  'size' => 20,
758  'default' => 0,
759  ],
760  ],
761  'categories' => [
762  'label' => 'LLL:EXT:core/Resources/Private/Language/locallang_tca.xlf:sys_category.categories',
763  'config' => [
764  'type' => 'category',
765  'relationship' => 'oneToMany',
766  'foreign_table' => 'sys_category',
767  'foreign_table_where' => ' AND {#sys_category}.{#sys_language_uid} IN (-1, 0)',
768  'maxitems' => 99999,
769  'size' => 20,
770  ],
771  ],
772  ],
773  'sheetTitle' => 'aTitle',
774  ],
775  ],
776  ],
777  ];
778  self::assertEquals($expected, $this->get(FlexFormTools::class)->parseDataStructureByIdentifier(‪$identifier));
779  }
780 
781  #[Test]
783  {
784  ‪$GLOBALS['TCA']['aTableName']['columns']['aFieldName']['config']['ds']['default'] = '
785  <T3DataStructure>
786  <ROOT>
787  <sheetTitle>aTitle</sheetTitle>
788  <type>array</type>
789  <el>
790  <categories>
791  <config>
792  <type>category</type>
793  <relationship>manyToMany</relationship>
794  </config>
795  </categories>
796  </el>
797  </ROOT>
798  </T3DataStructure>
799  ';
800  ‪$identifier = '{"type":"tca","tableName":"aTableName","fieldName":"aFieldName","dataStructureKey":"default"}';
801  $this->expectException(\UnexpectedValueException::class);
802  $this->expectExceptionCode(1627640208);
803  $this->get(FlexFormTools::class)->parseDataStructureByIdentifier(‪$identifier);
804  }
805 
806  #[Test]
808  {
809  ‪$GLOBALS['TCA']['aTableName']['columns']['aFieldName']['config']['ds']['default'] = '
810  <T3DataStructure>
811  <ROOT>
812  <sheetTitle>aTitle</sheetTitle>
813  <type>array</type>
814  <el>
815  <categories>
816  <config>
817  <type>category</type>
818  <relationship>oneToOne</relationship>
819  <maxitems>12</maxitems>
820  </config>
821  </categories>
822  </el>
823  </ROOT>
824  </T3DataStructure>
825  ';
826  ‪$identifier = '{"type":"tca","tableName":"aTableName","fieldName":"aFieldName","dataStructureKey":"default"}';
827  $this->expectException(\UnexpectedValueException::class);
828  $this->expectExceptionCode(1627640209);
829  $this->get(FlexFormTools::class)->parseDataStructureByIdentifier(‪$identifier);
830  }
831 
832  #[Test]
834  {
835  ‪$GLOBALS['TCA']['aTableName']['columns']['aFieldName']['config']['ds']['default'] = '
836  <T3DataStructure>
837  <ROOT>
838  <sheetTitle>aTitle</sheetTitle>
839  <type>array</type>
840  <el>
841  <categories>
842  <config>
843  <type>category</type>
844  <maxitems>1</maxitems>
845  </config>
846  </categories>
847  </el>
848  </ROOT>
849  </T3DataStructure>
850  ';
851  ‪$identifier = '{"type":"tca","tableName":"aTableName","fieldName":"aFieldName","dataStructureKey":"default"}';
852  $this->expectException(\UnexpectedValueException::class);
853  $this->expectExceptionCode(1627640210);
854  $this->get(FlexFormTools::class)->parseDataStructureByIdentifier(‪$identifier);
855  }
856 
857  #[Test]
859  {
860  $this->expectException(\RuntimeException::class);
861  $this->expectExceptionCode(1697554398);
862  $this->get(FlexFormTools::class)->cleanFlexFormXML('fooTable', 'fooField', []);
863  }
864 
865  #[Test]
867  {
868  $this->expectException(\RuntimeException::class);
869  $this->expectExceptionCode(1697554398);
870  ‪$GLOBALS['TCA']['aTableName']['columns']['aFieldName']['config']['ds']['default'] = 'invalid';
871  $this->get(FlexFormTools::class)->cleanFlexFormXML('fooTable', 'fooField', []);
872  }
873 
874  #[Test]
876  {
877  ‪$GLOBALS['TCA']['aTableName']['columns']['aFieldName']['config']['ds']['default'] = 'invalid';
878  $result = $this->get(FlexFormTools::class)->cleanFlexFormXML('aTableName', 'aFieldName', ['aFieldName' => 'invalid']);
879  self::assertSame('', $result);
880  }
881 
882  #[Test]
884  {
885  ‪$GLOBALS['TCA']['aTableName']['columns']['aFieldName']['config']['ds']['default'] = '
886  <T3DataStructure>
887  <ROOT>
888  <type>array</type>
889  <el>
890  <aFlexField>
891  <label>aFlexFieldLabel</label>
892  <config>
893  <type>input</type>
894  </config>
895  </aFlexField>
896  </el>
897  </ROOT>
898  </T3DataStructure>
899  ';
900  $result = $this->get(FlexFormTools::class)->cleanFlexFormXML('aTableName', 'aFieldName', ['aFieldName' => 'invalid']);
901  self::assertSame('', $result);
902  }
903 
904  #[Test]
906  {
907  $this->expectException(\RuntimeException::class);
908  $this->expectExceptionCode(1697555523);
909  ‪$GLOBALS['TCA']['aTableName']['columns']['aFieldName']['config']['ds']['default'] = '
910  <T3DataStructure>
911  <ROOT></ROOT>
912  </T3DataStructure>
913  ';
914  $flexXml = '<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
915  <T3FlexForms>
916  <data>
917  </data>
918  </T3FlexForms>
919  ';
920  $this->get(FlexFormTools::class)->cleanFlexFormXML('aTableName', 'aFieldName', ['aFieldName' => $flexXml]);
921  }
922 
923  #[Test]
925  {
926  ‪$GLOBALS['TCA']['aTableName']['columns']['aFieldName']['config']['ds']['default'] = file_get_contents(__DIR__ . '/Fixtures/cleanFlexFormHandlesValuesOfSimpleDataStructure.xml');
927  $flexXmlInput = file_get_contents(__DIR__ . '/Fixtures/cleanFlexFormHandlesValuesOfSimpleDataStructureValueInput.xml');
928  $flexXmlExpected = trim(file_get_contents(__DIR__ . '/Fixtures/cleanFlexFormHandlesValuesOfSimpleDataStructureValueExpected.xml'));
929  $flexXmlOutput = $this->get(FlexFormTools::class)->cleanFlexFormXML('aTableName', 'aFieldName', ['aFieldName' => $flexXmlInput]);
930  self::assertSame($flexXmlExpected, $flexXmlOutput);
931  }
932 
933  #[Test]
935  {
936  ‪$GLOBALS['TCA']['aTableName']['columns']['aFieldName']['config']['ds']['default'] = file_get_contents(__DIR__ . '/Fixtures/cleanFlexFormHandlesValuesOfComplexDataStructure.xml');
937  $flexXmlInput = file_get_contents(__DIR__ . '/Fixtures/cleanFlexFormHandlesValuesOfComplexDataStructureValueInput.xml');
938  $flexXmlExpected = trim(file_get_contents(__DIR__ . '/Fixtures/cleanFlexFormHandlesValuesOfComplexDataStructureValueExpected.xml'));
939  $flexXmlOutput = $this->get(FlexFormTools::class)->cleanFlexFormXML('aTableName', 'aFieldName', ['aFieldName' => $flexXmlInput]);
940  self::assertSame($flexXmlExpected, $flexXmlOutput);
941  }
942 }
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\parseDataStructureByIdentifierParsesDataStructureReturnedByEvent
‪parseDataStructureByIdentifierParsesDataStructureReturnedByEvent()
Definition: FlexFormToolsTest.php:442
‪TYPO3\CMS\Core\Configuration\Event\AfterFlexFormDataStructureParsedEvent\setDataStructure
‪setDataStructure(array $dataStructure)
Definition: AfterFlexFormDataStructureParsedEvent.php:57
‪TYPO3\CMS\Core\Configuration\Event\BeforeFlexFormDataStructureParsedEvent\getIdentifier
‪getIdentifier()
Definition: BeforeFlexFormDataStructureParsedEvent.php:63
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm
Definition: FlexFormToolsTest.php:18
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\parseDataStructureByIdentifierThrowsExceptionForIncompleteTcaSyntax
‪parseDataStructureByIdentifierThrowsExceptionForIncompleteTcaSyntax()
Definition: FlexFormToolsTest.php:476
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\getDataStructureIdentifierReturnsValidNameForTwoFieldCombinations
‪getDataStructureIdentifierReturnsValidNameForTwoFieldCombinations(array $row, array $ds, string $expected)
Definition: FlexFormToolsTest.php:385
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\getDataStructureIdentifierReturnsValidNameForTwoFieldCombinationsDataProvider
‪static getDataStructureIdentifierReturnsValidNameForTwoFieldCombinationsDataProvider()
Definition: FlexFormToolsTest.php:290
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\getDataStructureIdentifierReturnsPointerFieldValueIfDataStructureExists
‪getDataStructureIdentifierReturnsPointerFieldValueIfDataStructureExists()
Definition: FlexFormToolsTest.php:232
‪TYPO3\CMS\Core\Configuration\FlexForm\Exception\InvalidCombinedPointerFieldException
Definition: InvalidCombinedPointerFieldException.php:21
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\parseDataStructureByIdentifierFetchesFromFile
‪parseDataStructureByIdentifierFetchesFromFile()
Definition: FlexFormToolsTest.php:520
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\cleanFlexFormXMLThrowsWithDataStructureWithoutSheets
‪cleanFlexFormXMLThrowsWithDataStructureWithoutSheets()
Definition: FlexFormToolsTest.php:905
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest
Definition: FlexFormToolsTest.php:36
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\parseDataStructureByIdentifierThrowsExceptionForInvalidTcaSyntaxPointer
‪parseDataStructureByIdentifierThrowsExceptionForInvalidTcaSyntaxPointer()
Definition: FlexFormToolsTest.php:485
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\parseDataStructureByIdentifierThrowsExceptionIfDataStructureFileDoesNotExist
‪parseDataStructureByIdentifierThrowsExceptionIfDataStructureFileDoesNotExist()
Definition: FlexFormToolsTest.php:509
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\getDataStructureIdentifierThrowsExceptionIfPointerFieldWithStringSingleFieldDoesNotExist
‪getDataStructureIdentifierThrowsExceptionIfPointerFieldWithStringSingleFieldDoesNotExist()
Definition: FlexFormToolsTest.php:181
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\getDataStructureIdentifierThrowsExceptionIfPointerFieldSWithTwoFieldsFirstDoesNotExist
‪getDataStructureIdentifierThrowsExceptionIfPointerFieldSWithTwoFieldsFirstDoesNotExist()
Definition: FlexFormToolsTest.php:198
‪TYPO3\CMS\Core\Configuration\FlexForm\Exception\InvalidSinglePointerFieldException
Definition: InvalidSinglePointerFieldException.php:21
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\parseDataStructureByIdentifierThrowsExceptionOnInvalidCategoryRelationship
‪parseDataStructureByIdentifierThrowsExceptionOnInvalidCategoryRelationship()
Definition: FlexFormToolsTest.php:782
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\getDataStructureIdentifierReturnsDefaultIfPointerFieldValueDoesNotExist
‪getDataStructureIdentifierReturnsDefaultIfPointerFieldValueDoesNotExist()
Definition: FlexFormToolsTest.php:250
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\getDataStructureIdentifierThrowsExceptionIfPointerFieldStringHasMoreThanTwoFields
‪getDataStructureIdentifierThrowsExceptionIfPointerFieldStringHasMoreThanTwoFields()
Definition: FlexFormToolsTest.php:167
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\cleanFlexFormHandlesValuesOfSimpleDataStructure
‪cleanFlexFormHandlesValuesOfSimpleDataStructure()
Definition: FlexFormToolsTest.php:924
‪TYPO3\CMS\Core\Configuration\Event\AfterFlexFormDataStructureIdentifierInitializedEvent\setIdentifier
‪setIdentifier(array $identifier)
Definition: AfterFlexFormDataStructureIdentifierInitializedEvent.php:82
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\parseDataStructureByIdentifierThrowsExceptionOnInvalidMaxitems
‪parseDataStructureByIdentifierThrowsExceptionOnInvalidMaxitems()
Definition: FlexFormToolsTest.php:833
‪TYPO3\CMS\Core\Configuration\Event\BeforeFlexFormDataStructureParsedEvent
Definition: BeforeFlexFormDataStructureParsedEvent.php:35
‪TYPO3\CMS\Core\Configuration\Event\AfterFlexFormDataStructureParsedEvent
Definition: AfterFlexFormDataStructureParsedEvent.php:32
‪TYPO3\CMS\Core\Configuration\Event\BeforeFlexFormDataStructureIdentifierInitializedEvent\setIdentifier
‪setIdentifier(array $identifier)
Definition: BeforeFlexFormDataStructureIdentifierInitializedEvent.php:93
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\parseDataStructureByIdentifierCreatesDefaultSheet
‪parseDataStructureByIdentifierCreatesDefaultSheet()
Definition: FlexFormToolsTest.php:578
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\getDataStructureIdentifierThrowsExceptionIfPointerFieldValueDoesNotExistAndDefaultToo
‪getDataStructureIdentifierThrowsExceptionIfPointerFieldValueDoesNotExistAndDefaultToo()
Definition: FlexFormToolsTest.php:268
‪TYPO3\CMS\Core\Configuration\FlexForm\Exception\InvalidIdentifierException
Definition: InvalidIdentifierException.php:21
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\parseDataStructureByIdentifierThrowsExceptionForInvalidXmlStructure
‪parseDataStructureByIdentifierThrowsExceptionForInvalidXmlStructure()
Definition: FlexFormToolsTest.php:547
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\getDataStructureIdentifierWithNoOpListenerReturnsDefault
‪getDataStructureIdentifierWithNoOpListenerReturnsDefault()
Definition: FlexFormToolsTest.php:53
‪TYPO3\CMS\Core\Configuration\Event\AfterFlexFormDataStructureIdentifierInitializedEvent
Definition: AfterFlexFormDataStructureIdentifierInitializedEvent.php:35
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\cleanFlexFormHandlesValuesOfComplexDataStructure
‪cleanFlexFormHandlesValuesOfComplexDataStructure()
Definition: FlexFormToolsTest.php:934
‪TYPO3\CMS\Core\Configuration\FlexForm\FlexFormTools
Definition: FlexFormTools.php:40
‪TYPO3\CMS\Core\Configuration\Event\BeforeFlexFormDataStructureIdentifierInitializedEvent
Definition: BeforeFlexFormDataStructureIdentifierInitializedEvent.php:44
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\parseDataStructureByIdentifierThrowsExceptionWithEmptyString
‪parseDataStructureByIdentifierThrowsExceptionWithEmptyString()
Definition: FlexFormToolsTest.php:418
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\parseDataStructureByIdentifierPreparesCategoryField
‪parseDataStructureByIdentifierPreparesCategoryField()
Definition: FlexFormToolsTest.php:718
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\getDataStructureIdentifierReturnsDefaultIfDsIsSetButNoDsPointerField
‪getDataStructureIdentifierReturnsDefaultIfDsIsSetButNoDsPointerField()
Definition: FlexFormToolsTest.php:140
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\parseDataStructureByIdentifierThrowsExceptionForInvalidSyntax
‪parseDataStructureByIdentifierThrowsExceptionForInvalidSyntax()
Definition: FlexFormToolsTest.php:468
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\parseDataStructureByIdentifierThrowsExceptionOnInvalidJson
‪parseDataStructureByIdentifierThrowsExceptionOnInvalidJson()
Definition: FlexFormToolsTest.php:426
‪TYPO3\CMS\Core\Configuration\Event\BeforeFlexFormDataStructureParsedEvent\setDataStructure
‪setDataStructure(array|string $dataStructure)
Definition: BeforeFlexFormDataStructureParsedEvent.php:58
‪TYPO3\CMS\Core\Configuration\FlexForm\Exception\InvalidTcaException
Definition: InvalidTcaException.php:23
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\parseDataStructureByIdentifierThrowsEsxceptionOnInvalidMaxitemsForOneToOne
‪parseDataStructureByIdentifierThrowsEsxceptionOnInvalidMaxitemsForOneToOne()
Definition: FlexFormToolsTest.php:807
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\cleanFlexFormXMLThrowsWithMissingDataField
‪cleanFlexFormXMLThrowsWithMissingDataField()
Definition: FlexFormToolsTest.php:866
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\parseDataStructureByIdentifierThrowsExceptionIfStructureHasBothSheetAndRoot
‪parseDataStructureByIdentifierThrowsExceptionIfStructureHasBothSheetAndRoot()
Definition: FlexFormToolsTest.php:563
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\cleanFlexFormXMLReturnsEmptyStringWithInvalidDataStructure
‪cleanFlexFormXMLReturnsEmptyStringWithInvalidDataStructure()
Definition: FlexFormToolsTest.php:875
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\getDataStructureIdentifierThrowsExceptionsIfNoDsPointerFieldIsSetAndDefaultDoesNotExist
‪getDataStructureIdentifierThrowsExceptionsIfNoDsPointerFieldIsSetAndDefaultDoesNotExist()
Definition: FlexFormToolsTest.php:154
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\parseDataStructureByIdentifierResolvesTcaSyntaxPointer
‪parseDataStructureByIdentifierResolvesTcaSyntaxPointer()
Definition: FlexFormToolsTest.php:494
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\parseDataStructureByIdentifierResolvesExtReferenceForSingleSheetsWithFilePrefix
‪parseDataStructureByIdentifierResolvesExtReferenceForSingleSheetsWithFilePrefix()
Definition: FlexFormToolsTest.php:653
‪TYPO3\CMS\Core\Configuration\Event\AfterFlexFormDataStructureIdentifierInitializedEvent\getIdentifier
‪getIdentifier()
Definition: AfterFlexFormDataStructureIdentifierInitializedEvent.php:92
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\cleanFlexFormXMLReturnsEmptyStringWithInvalidValue
‪cleanFlexFormXMLReturnsEmptyStringWithInvalidValue()
Definition: FlexFormToolsTest.php:883
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\cleanFlexFormXMLThrowsWithMissingTca
‪cleanFlexFormXMLThrowsWithMissingTca()
Definition: FlexFormToolsTest.php:858
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\getDataStructureIdentifierWithNoListenersReturnsDefault
‪getDataStructureIdentifierWithNoListenersReturnsDefault()
Definition: FlexFormToolsTest.php:38
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\getDataStructureIdentifierThrowsExceptionIfDsIsNotAnArrayAndNoDsPointerField
‪getDataStructureIdentifierThrowsExceptionIfDsIsNotAnArrayAndNoDsPointerField()
Definition: FlexFormToolsTest.php:126
‪TYPO3\CMS\Core\EventDispatcher\ListenerProvider
Definition: ListenerProvider.php:30
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\getDataStructureIdentifierWithListenerReturnsThatListenersValue
‪getDataStructureIdentifierWithListenerReturnsThatListenersValue()
Definition: FlexFormToolsTest.php:78
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\parseDataStructureByIdentifierRejectsInvalidInput
‪parseDataStructureByIdentifierRejectsInvalidInput()
Definition: FlexFormToolsTest.php:434
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\getDataStructureIdentifierThrowsExceptionForTwoFieldsWithNoMatchAndNoDefault
‪getDataStructureIdentifierThrowsExceptionForTwoFieldsWithNoMatchAndNoDefault()
Definition: FlexFormToolsTest.php:397
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\getDataStructureIdentifierWithModifyListenerCallsListener
‪getDataStructureIdentifierWithModifyListenerCallsListener()
Definition: FlexFormToolsTest.php:99
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\parseDataStructureByIdentifierResolvesExtReferenceForSingleSheets
‪parseDataStructureByIdentifierResolvesExtReferenceForSingleSheets()
Definition: FlexFormToolsTest.php:619
‪TYPO3\CMS\Webhooks\Message\$identifier
‪identifier readonly string $identifier
Definition: FileAddedMessage.php:37
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\getDataStructureIdentifierThrowsExceptionIfPointerFieldSWithTwoFieldsSecondDoesNotExist
‪getDataStructureIdentifierThrowsExceptionIfPointerFieldSWithTwoFieldsSecondDoesNotExist()
Definition: FlexFormToolsTest.php:215
‪TYPO3\CMS\Core\Tests\Functional\Configuration\FlexForm\FlexFormToolsTest\parseDataStructureByIdentifierModifyEventManipulatesDataStructure
‪parseDataStructureByIdentifierModifyEventManipulatesDataStructure()
Definition: FlexFormToolsTest.php:687