TYPO3CMS  8
 All Classes Namespaces Files Functions Variables Pages
TcaFlexProcessTest.php
Go to the documentation of this file.
1 <?php
2 namespace TYPO3\CMS\Backend\Tests\Unit\Form\FormDataProvider;
3 
4 /*
5  * This file is part of the TYPO3 CMS project.
6  *
7  * It is free software; you can redistribute it and/or modify it under
8  * the terms of the GNU General Public License, either version 2
9  * of the License, or any later version.
10  *
11  * For the full copyright and license information, please read the
12  * LICENSE.txt file that was distributed with this source code.
13  *
14  * The TYPO3 project - inspiring people to share!
15  */
16 
17 use Prophecy\Argument;
18 use Prophecy\Prophecy\ObjectProphecy;
25 
30 {
34  protected $subject;
35 
40 
41  protected function setUp()
42  {
44  $this->backendUserProphecy = $this->prophesize(BackendUserAuthentication::class);
45  $GLOBALS['BE_USER'] = $this->backendUserProphecy->reveal();
46  $GLOBALS['BE_USER']->groupData['non_exclude_fields'] = '';
47 
48  // Some tests call FormDataCompiler for sub elements. Those tests have functional test characteristics.
49  // This is ok for the time being, but this settings takes care only parts of the compiler are called
50  // to have less dependencies.
51  $GLOBALS['TYPO3_CONF_VARS']['SYS']['formEngine']['formDataGroup']['flexFormSegment'] = [];
52 
53  $this->subject = new TcaFlexProcess();
54  }
55 
60  {
61  $input = [
62  'tableName' => 'aTable',
63  'databaseRow' => [
64  'aField' => [
65  'data' => [],
66  ],
67  'pointerField' => 'aFlex',
68  ],
69  'processedTca' => [
70  'columns' => [
71  'aField' => [
72  'config' => [
73  'type' => 'flex',
74  'ds_pointerField' => 'pointerField',
75  'ds' => [
76  'sheets' => [
77  'aSheet' => [
78  'ROOT' => [
79  'type' => 'array',
80  'el' => [
81  'aFlexField' => [
82  'label' => 'aFlexFieldLabel',
83  'config' => [
84  'type' => 'input',
85  ],
86  ]
87  ],
88  ],
89  ],
90  ],
91  ],
92  ],
93  ],
94  ],
95  ],
96  'pageTsConfig' => [
97  'TCEFORM.' => [
98  'aTable.' => [
99  'aField.' => [
100  'aFlex.' => [
101  'aSheet.' => [
102  'disabled' => 1,
103  ],
104  ],
105  ],
106  ],
107  ],
108  ],
109  ];
110 
111  $expected = $input;
112  $expected['processedTca']['columns']['aField']['config']['ds'] = [
113  'sheets' => [],
114  'meta' => [
115  'dataStructurePointers' => [
116  'pointerField' => 'aFlex',
117  ],
118  ],
119  ];
120 
121  $this->assertEquals($expected, $this->subject->addData($input));
122  }
123 
128  {
129  $input = [
130  'tableName' => 'aTable',
131  'databaseRow' => [
132  'aField' => [
133  'data' => [],
134  ],
135  'pointerField' => 'aFlex',
136  ],
137  'processedTca' => [
138  'columns' => [
139  'aField' => [
140  'config' => [
141  'type' => 'flex',
142  'ds_pointerField' => 'pointerField',
143  'ds' => [
144  'sheets' => [
145  'aSheet' => [
146  'ROOT' => [
147  'type' => 'array',
148  'el' => [
149  'aFlexField' => [
150  'label' => 'aFlexFieldLabel',
151  'config' => [
152  'type' => 'input',
153  ],
154  ]
155  ],
156  ],
157  ],
158  ],
159  ],
160  ],
161  ],
162  ],
163  ],
164  'pageTsConfig' => [
165  'TCEFORM.' => [
166  'aTable.' => [
167  'aField.' => [
168  'aFlex.' => [
169  'aSheet.' => [
170  'sheetTitle' => 'aTitle',
171  ],
172  ],
173  ],
174  ],
175  ],
176  ],
177  ];
178 
179  $expected = $input;
180  $expected['processedTca']['columns']['aField']['config']['ds'] = [
181  'sheets' => [
182  'aSheet' => [
183  'ROOT' => [
184  'type' => 'array',
185  'el' => [
186  'aFlexField' => [
187  'label' => 'aFlexFieldLabel',
188  'config' => [
189  'type' => 'input',
190  ],
191  ],
192  ],
193  'sheetTitle' => 'aTitle',
194  ],
195  ],
196  ],
197  'meta' => [
198  'dataStructurePointers' => [
199  'pointerField' => 'aFlex',
200  ],
201  ],
202  ];
203 
204  $this->assertEquals($expected, $this->subject->addData($input));
205  }
206 
211  {
212  $input = [
213  'tableName' => 'aTable',
214  'databaseRow' => [
215  'aField' => [
216  'data' => [],
217  ],
218  'pointerField' => 'aFlex',
219  ],
220  'processedTca' => [
221  'columns' => [
222  'aField' => [
223  'config' => [
224  'type' => 'flex',
225  'ds_pointerField' => 'pointerField',
226  'ds' => [
227  'sheets' => [
228  'aSheet' => [
229  'ROOT' => [
230  'type' => 'array',
231  'el' => [
232  'aFlexField' => [
233  'label' => 'aFlexFieldLabel',
234  'config' => [
235  'type' => 'input',
236  ],
237  ]
238  ],
239  ],
240  ],
241  ],
242  ],
243  ],
244  ],
245  ],
246  ],
247  'pageTsConfig' => [
248  'TCEFORM.' => [
249  'aTable.' => [
250  'aField.' => [
251  'aFlex.' => [
252  'aSheet.' => [
253  'sheetDescription' => 'aDescription',
254  ],
255  ],
256  ],
257  ],
258  ],
259  ],
260  ];
261 
262  $expected = $input;
263  $expected['processedTca']['columns']['aField']['config']['ds'] = [
264  'sheets' => [
265  'aSheet' => [
266  'ROOT' => [
267  'type' => 'array',
268  'el' => [
269  'aFlexField' => [
270  'label' => 'aFlexFieldLabel',
271  'config' => [
272  'type' => 'input',
273  ],
274  ],
275  ],
276  'sheetDescription' => 'aDescription',
277  ],
278  ],
279  ],
280  'meta' => [
281  'dataStructurePointers' => [
282  'pointerField' => 'aFlex',
283  ],
284  ],
285  ];
286 
287  $this->assertEquals($expected, $this->subject->addData($input));
288  }
289 
294  {
295  $input = [
296  'tableName' => 'aTable',
297  'databaseRow' => [
298  'aField' => [
299  'data' => [],
300  ],
301  'pointerField' => 'aFlex',
302  ],
303  'processedTca' => [
304  'columns' => [
305  'aField' => [
306  'config' => [
307  'type' => 'flex',
308  'ds_pointerField' => 'pointerField',
309  'ds' => [
310  'sheets' => [
311  'aSheet' => [
312  'ROOT' => [
313  'type' => 'array',
314  'el' => [
315  'aFlexField' => [
316  'label' => 'aFlexFieldLabel',
317  'config' => [
318  'type' => 'input',
319  ],
320  ]
321  ],
322  ],
323  ],
324  ],
325  ],
326  ],
327  ],
328  ],
329  ],
330  'pageTsConfig' => [
331  'TCEFORM.' => [
332  'aTable.' => [
333  'aField.' => [
334  'aFlex.' => [
335  'aSheet.' => [
336  'sheetDescription' => 'sheetShortDescr',
337  ],
338  ],
339  ],
340  ],
341  ],
342  ],
343  ];
344 
345  $expected = $input;
346  $expected['processedTca']['columns']['aField']['config']['ds'] = [
347  'sheets' => [
348  'aSheet' => [
349  'ROOT' => [
350  'type' => 'array',
351  'el' => [
352  'aFlexField' => [
353  'label' => 'aFlexFieldLabel',
354  'config' => [
355  'type' => 'input',
356  ],
357  ],
358  ],
359  'sheetDescription' => 'sheetShortDescr',
360  ],
361  ],
362  ],
363  'meta' => [
364  'dataStructurePointers' => [
365  'pointerField' => 'aFlex',
366  ],
367  ],
368  ];
369 
370  $this->assertEquals($expected, $this->subject->addData($input));
371  }
372 
377  {
378  $input = [
379  'tableName' => 'aTable',
380  'databaseRow' => [
381  'aField' => [
382  'data' => [],
383  ],
384  'pointerField' => 'aFlex',
385  ],
386  'processedTca' => [
387  'columns' => [
388  'aField' => [
389  'config' => [
390  'type' => 'flex',
391  'ds_pointerField' => 'pointerField',
392  'ds' => [
393  'sheets' => [
394  'sDEF' => [
395  'ROOT' => [
396  'type' => 'array',
397  'el' => [
398  'aFlexField' => [
399  'label' => 'aFlexFieldLabel',
400  'config' => [
401  'type' => 'input',
402  ],
403  ]
404  ],
405  ],
406  ],
407  ],
408  ],
409  ],
410  ],
411  ],
412  ],
413  'pageTsConfig' => [
414  'TCEFORM.' => [
415  'aTable.' => [
416  'aField.' => [
417  'aFlex.' => [
418  'sDEF.' => [
419  'sheetDescription' => 'sheetShortDescr',
420  ],
421  ],
422  ],
423  ],
424  ],
425  ],
426  ];
427 
428  $expected = $input;
429  $expected['processedTca']['columns']['aField']['config']['ds'] = [
430  'sheets' => [
431  'sDEF' => [
432  'ROOT' => [
433  'type' => 'array',
434  'el' => [
435  'aFlexField' => [
436  'label' => 'aFlexFieldLabel',
437  'config' => [
438  'type' => 'input',
439  ],
440  ],
441  ],
442  'sheetDescription' => 'sheetShortDescr',
443  ],
444  ],
445  ],
446  'meta' => [
447  'dataStructurePointers' => [
448  'pointerField' => 'aFlex',
449  ],
450  ],
451  ];
452 
453  $this->assertEquals($expected, $this->subject->addData($input));
454  }
455 
460  {
461  $input = [
462  'tableName' => 'aTable',
463  'databaseRow' => [
464  'aField' => [
465  'data' => [],
466  ],
467  'pointerField' => 'aFlex',
468  ],
469  'processedTca' => [
470  'columns' => [
471  'aField' => [
472  'config' => [
473  'type' => 'flex',
474  'ds_pointerField' => 'pointerField',
475  'ds' => [
476  'sheets' => [
477  'sDEF' => [
478  'ROOT' => [
479  'type' => 'array',
480  'el' => [
481  'aFlexField' => [
482  'label' => 'aFlexFieldLabel',
483  'exclude' => '1',
484  'config' => [
485  'type' => 'input',
486  ],
487  ]
488  ],
489  ],
490  ],
491  ],
492  ],
493  ],
494  ],
495  ],
496  ],
497  'pageTsConfig' => [],
498  ];
499 
500  $this->backendUserProphecy->isAdmin()->shouldBeCalled()->willReturn(false);
501  $GLOBALS['BE_USER']->groupData['non_exclude_fields'] = '';
502 
503  $expected = $input;
504  $expected['processedTca']['columns']['aField']['config']['ds'] = [
505  'sheets' => [
506  'sDEF' => [
507  'ROOT' => [
508  'type' => 'array',
509  'el' => [],
510  ],
511  ],
512  ],
513  'meta' => [
514  'dataStructurePointers' => [
515  'pointerField' => 'aFlex',
516  ],
517  ],
518  ];
519 
520  $this->assertEquals($expected, $this->subject->addData($input));
521  }
522 
527  {
528  $input = [
529  'tableName' => 'aTable',
530  'databaseRow' => [
531  'aField' => [
532  'data' => [],
533  ],
534  'pointerField' => 'aFlex',
535  ],
536  'processedTca' => [
537  'columns' => [
538  'aField' => [
539  'config' => [
540  'type' => 'flex',
541  'ds_pointerField' => 'pointerField',
542  'ds' => [
543  'sheets' => [
544  'sDEF' => [
545  'ROOT' => [
546  'type' => 'array',
547  'el' => [
548  'aFlexField' => [
549  'label' => 'aFlexFieldLabel',
550  'exclude' => '1',
551  'config' => [
552  'type' => 'input',
553  ],
554  ]
555  ],
556  ],
557  ],
558  ],
559  ],
560  ],
561  ],
562  ],
563  ],
564  'pageTsConfig' => [],
565  ];
566 
567  $this->backendUserProphecy->isAdmin()->shouldBeCalled()->willReturn(false);
568  $GLOBALS['BE_USER']->groupData['non_exclude_fields'] = 'aTable:aField;aFlex;sDEF;aFlexField';
569 
570  $expected = $input;
571  $expected['processedTca']['columns']['aField']['config']['ds'] = [
572  'sheets' => [
573  'sDEF' => [
574  'ROOT' => [
575  'type' => 'array',
576  'el' => [
577  'aFlexField' => [
578  'label' => 'aFlexFieldLabel',
579  'config' => [
580  'type' => 'input',
581  ],
582  'exclude' => '1',
583  ],
584  ],
585  ],
586  ],
587  ],
588  'meta' => [
589  'dataStructurePointers' => [
590  'pointerField' => 'aFlex',
591  ],
592  ],
593  ];
594 
595  $this->assertEquals($expected, $this->subject->addData($input));
596  }
597 
602  {
603  $input = [
604  'tableName' => 'aTable',
605  'databaseRow' => [
606  'aField' => [
607  'data' => [],
608  ],
609  'pointerField' => 'aFlex',
610  ],
611  'processedTca' => [
612  'columns' => [
613  'aField' => [
614  'config' => [
615  'type' => 'flex',
616  'ds_pointerField' => 'pointerField',
617  'ds' => [
618  'sheets' => [
619  'sDEF' => [
620  'ROOT' => [
621  'type' => 'array',
622  'el' => [
623  'aFlexField' => [
624  'label' => 'aFlexFieldLabel',
625  'exclude' => '1',
626  'config' => [
627  'type' => 'input',
628  ],
629  ]
630  ],
631  ],
632  ],
633  ],
634  ],
635  ],
636  ],
637  ],
638  ],
639  'pageTsConfig' => [],
640  ];
641 
642  $this->backendUserProphecy->isAdmin()->shouldBeCalled()->willReturn(true);
643  $GLOBALS['BE_USER']->groupData['non_exclude_fields'] = '';
644 
645  $expected = $input;
646  $expected['processedTca']['columns']['aField']['config']['ds'] = [
647  'sheets' => [
648  'sDEF' => [
649  'ROOT' => [
650  'type' => 'array',
651  'el' => [
652  'aFlexField' => [
653  'label' => 'aFlexFieldLabel',
654  'config' => [
655  'type' => 'input',
656  ],
657  'exclude' => '1',
658  ],
659  ],
660  ],
661  ],
662  ],
663  'meta' => [
664  'dataStructurePointers' => [
665  'pointerField' => 'aFlex',
666  ],
667  ],
668  ];
669 
670  $this->assertEquals($expected, $this->subject->addData($input));
671  }
672 
677  {
678  $input = [
679  'tableName' => 'aTable',
680  'databaseRow' => [
681  'aField' => [
682  'data' => [],
683  ],
684  'pointerField' => 'aFlex',
685  ],
686  'processedTca' => [
687  'columns' => [
688  'aField' => [
689  'config' => [
690  'type' => 'flex',
691  'ds_pointerField' => 'pointerField',
692  'ds' => [
693  'sheets' => [
694  'sDEF' => [
695  'ROOT' => [
696  'type' => 'array',
697  'el' => [
698  'aFlexField' => [
699  'label' => 'aFlexFieldLabel',
700  'config' => [
701  'type' => 'input',
702  ],
703  ]
704  ],
705  ],
706  ],
707  ],
708  ],
709  ],
710  ],
711  ],
712  ],
713  'pageTsConfig' => [
714  'TCEFORM.' => [
715  'aTable.' => [
716  'aField.' => [
717  'aFlex.' => [
718  'sDEF.' => [
719  'aFlexField.' => [
720  'disabled' => 1,
721  ],
722  ],
723  ],
724  ],
725  ],
726  ],
727  ],
728  ];
729 
730  $expected = $input;
731  $expected['processedTca']['columns']['aField']['config']['ds'] = [
732  'sheets' => [
733  'sDEF' => [
734  'ROOT' => [
735  'type' => 'array',
736  'el' => [],
737  ],
738  ],
739  ],
740  'meta' => [
741  'dataStructurePointers' => [
742  'pointerField' => 'aFlex',
743  ],
744  ],
745  ];
746 
747  $this->assertEquals($expected, $this->subject->addData($input));
748  }
749 
753  public function addDataHandlesPageTsConfigSettingsOfSingleFlexField()
754  {
755  $input = [
756  'tableName' => 'aTable',
757  'databaseRow' => [
758  'aField' => [
759  'data' => [],
760  ],
761  'pointerField' => 'aFlex',
762  ],
763  'processedTca' => [
764  'columns' => [
765  'aField' => [
766  'config' => [
767  'type' => 'flex',
768  'ds_pointerField' => 'pointerField',
769  'ds' => [
770  'sheets' => [
771  'sDEF' => [
772  'ROOT' => [
773  'type' => 'array',
774  'el' => [
775  'aFlexField' => [
776  'label' => 'aFlexFieldLabel',
777  'config' => [
778  'type' => 'radio',
779  'items' => [
780  0 => [
781  0 => 'aLabel',
782  1 => 'aValue',
783  ],
784  ],
785  ],
786  ],
787  ],
788  ],
789  ],
790  ],
791  ],
792  ],
793  ],
794  ],
795  ],
796  'pageTsConfig' => [
797  'TCEFORM.' => [
798  'aTable.' => [
799  'aField.' => [
800  'aFlex.' => [
801  'sDEF.' => [
802  'aFlexField.' => [
803  'altLabels.' => [
804  '0' => 'labelOverride',
805  ],
806  ],
807  ],
808  ],
809  ],
810  ],
811  ],
812  ],
813  ];
814 
815  $GLOBALS['TYPO3_CONF_VARS']['SYS']['formEngine']['formDataGroup']['flexFormSegment'] = [
816  \TYPO3\CMS\Backend\Form\FormDataProvider\TcaRadioItems::class => [],
817  ];
818 
820  $languageService = $this->prophesize(LanguageService::class);
821  $GLOBALS['LANG'] = $languageService->reveal();
822  $languageService->sL(Argument::cetera())->willReturnArgument(0);
823 
824  $this->backendUserProphecy->isAdmin()->willReturn(true);
825  $this->backendUserProphecy->checkLanguageAccess(Argument::cetera())->willReturn(true);
826 
827  $expected = $input;
828  $expected['processedTca']['columns']['aField']['config']['ds'] = [
829  'sheets' => [
830  'sDEF' => [
831  'ROOT' => [
832  'type' => 'array',
833  'el' => [
834  'aFlexField' => [
835  'label' => 'aFlexFieldLabel',
836  'config' => [
837  'type' => 'radio',
838  'items' => [
839  0 => [
840  0 => 'labelOverride',
841  1 => 'aValue',
842  ],
843  ],
844  ],
845  ],
846  ],
847  ],
848  ],
849  ],
850  'meta' => [
851  'dataStructurePointers' => [
852  'pointerField' => 'aFlex',
853  ],
854  ],
855  ];
856 
857  $this->assertEquals($expected, $this->subject->addData($input));
858  }
859 
863  public function addDataSetsDefaultValueFromFlexTcaForField()
864  {
865  $input = [
866  'tableName' => 'aTable',
867  'databaseRow' => [
868  'aField' => [
869  'data' => [],
870  ],
871  'pointerField' => 'aFlex',
872  ],
873  'processedTca' => [
874  'columns' => [
875  'aField' => [
876  'config' => [
877  'type' => 'flex',
878  'ds_pointerField' => 'pointerField',
879  'ds' => [
880  'sheets' => [
881  'sDEF' => [
882  'ROOT' => [
883  'type' => 'array',
884  'el' => [
885  'aFlexField' => [
886  'label' => 'aFlexFieldLabel',
887  'config' => [
888  'type' => 'input',
889  'default' => 'defaultValue',
890  ],
891  ],
892  ],
893  ],
894  ],
895  ],
896  ],
897  ],
898  ],
899  ],
900  ],
901  'pageTsConfig' => [],
902  ];
903 
904  $GLOBALS['TYPO3_CONF_VARS']['SYS']['formEngine']['formDataGroup']['flexFormSegment'] = [
905  \TYPO3\CMS\Backend\Form\FormDataProvider\DatabaseRowDefaultValues::class => [],
906  ];
907 
909  $languageService = $this->prophesize(LanguageService::class);
910  $GLOBALS['LANG'] = $languageService->reveal();
911  $languageService->sL(Argument::cetera())->willReturnArgument(0);
912 
913  $this->backendUserProphecy->isAdmin()->willReturn(true);
914  $this->backendUserProphecy->checkLanguageAccess(Argument::cetera())->willReturn(true);
915 
916  $expected = $input;
917  $expected['processedTca']['columns']['aField']['config']['ds']['meta'] = [
918  'dataStructurePointers' => [
919  'pointerField' => 'aFlex'
920  ],
921  ];
922  $expected['databaseRow']['aField']['data']['sDEF']['lDEF']['aFlexField']['vDEF'] = 'defaultValue';
923 
924  $this->assertEquals($expected, $this->subject->addData($input));
925  }
926 
931  {
932  $input = [
933  'tableName' => 'aTable',
934  'databaseRow' => [
935  'aField' => [
936  'data' => [],
937  'meta' => [],
938  ],
939  ],
940  'processedTca' => [
941  'columns' => [
942  'aField' => [
943  'config' => [
944  'type' => 'flex',
945  'ds' => [
946  'sheets' => [
947  'sDEF' => [
948  'ROOT' => [
949  'type' => 'array',
950  'el' => [
951  'aFlexField' => [
952  'type' => 'array',
953  ],
954  ],
955  ],
956  ],
957  ],
958  ],
959  ],
960  ],
961  ],
962  ],
963  'pageTsConfig' => [],
964  ];
965 
966  $this->backendUserProphecy->isAdmin()->willReturn(true);
967  $this->backendUserProphecy->checkLanguageAccess(Argument::cetera())->willReturn(true);
968 
969  $this->expectException(\UnexpectedValueException::class);
970  $this->expectExceptionCode(1440685208);
971 
972  $this->subject->addData($input);
973  }
974 
979  {
980  $input = [
981  'tableName' => 'aTable',
982  'databaseRow' => [
983  'aField' => [
984  'data' => [],
985  'meta' => [],
986  ],
987  ],
988  'processedTca' => [
989  'columns' => [
990  'aField' => [
991  'config' => [
992  'type' => 'flex',
993  'ds' => [
994  'sheets' => [
995  'sDEF' => [
996  'ROOT' => [
997  'type' => 'array',
998  'el' => [
999  'aFlexField' => [
1000  'section' => '1',
1001  ],
1002  ],
1003  ],
1004  ],
1005  ],
1006  ],
1007  ],
1008  ],
1009  ],
1010  ],
1011  'pageTsConfig' => [],
1012  ];
1013 
1014  $this->backendUserProphecy->isAdmin()->willReturn(true);
1015  $this->backendUserProphecy->checkLanguageAccess(Argument::cetera())->willReturn(true);
1016 
1017  $this->expectException(\UnexpectedValueException::class);
1018  $this->expectExceptionCode(1440685208);
1019 
1020  $this->subject->addData($input);
1021  }
1022 
1026  public function addDataSetsValuesAndStructureForSectionContainerElements()
1027  {
1028  $input = [
1029  'tableName' => 'aTable',
1030  'databaseRow' => [
1031  'aField' => [
1032  'data' => [
1033  'sDEF' => [
1034  'lDEF' => [
1035  'section_1' => [
1036  'el' => [
1037  '1' => [
1038  'container_1' => [
1039  // It should set the default value for aFlexField here
1040  'el' => [
1041  ],
1042  ],
1043  ],
1044  '2' => [
1045  'container_1' => [
1046  'el' => [
1047  'aFlexField' => [
1048  // It should keep this value
1049  'vDEF' => 'dbValue',
1050  ],
1051  ],
1052  ],
1053  ],
1054  ],
1055  ],
1056  ],
1057  'lEN' => [
1058  'section_1' => [
1059  'el' => [
1060  '1' => [
1061  'container_1' => [
1062  // It should add the default value for aFlexField here
1063  ],
1064  ],
1065  ],
1066  ],
1067  ],
1068  ],
1069  ],
1070  'meta' => [],
1071  ],
1072  ],
1073  'processedTca' => [
1074  'columns' => [
1075  'aField' => [
1076  'config' => [
1077  'type' => 'flex',
1078  'ds' => [
1079  'sheets' => [
1080  'sDEF' => [
1081  'ROOT' => [
1082  'type' => 'array',
1083  'el' => [
1084  'section_1' => [
1085  'section' => '1',
1086  'type' => 'array',
1087  'el' => [
1088  'container_1' => [
1089  'type' => 'array',
1090  'el' => [
1091  'aFlexField' => [
1092  'label' => 'aFlexFieldLabel',
1093  'config' => [
1094  'type' => 'input',
1095  'default' => 'defaultValue',
1096  ],
1097  ],
1098  ],
1099  ],
1100  ],
1101  ],
1102  ],
1103  ],
1104  ],
1105  ],
1106  ],
1107  ],
1108  ],
1109  ],
1110  ],
1111  'pageTsConfig' => [],
1112  ];
1113 
1114  $GLOBALS['TYPO3_CONF_VARS']['SYS']['formEngine']['formDataGroup']['flexFormSegment'] = [
1115  \TYPO3\CMS\Backend\Form\FormDataProvider\DatabaseRowDefaultValues::class => [],
1116  ];
1117 
1119  $languageService = $this->prophesize(LanguageService::class);
1120  $GLOBALS['LANG'] = $languageService->reveal();
1121  $languageService->sL(Argument::cetera())->willReturnArgument(0);
1122 
1123  $this->backendUserProphecy->isAdmin()->willReturn(true);
1124  $this->backendUserProphecy->checkLanguageAccess(Argument::cetera())->willReturn(true);
1125 
1126  $expected = $input;
1127 
1128  // A default value for existing container field aFlexField should have been set
1129  $expected['databaseRow']['aField']['data']['sDEF']['lDEF']['section_1']['el']['1']['container_1']['el']['aFlexField']['vDEF'] = 'defaultValue';
1130 
1131  // Dummy row values for container_1 on lDEF sheet
1132  $expected['databaseRow']['aField']['data']['sDEF']['lDEF']['section_1']['templateRows']['container_1']['el']['aFlexField']['vDEF'] = 'defaultValue';
1133 
1134  $this->assertEquals($expected, $this->subject->addData($input));
1135  }
1136 
1141  {
1142  $input = [
1143  'tableName' => 'aTable',
1144  'databaseRow' => [
1145  'aField' => [
1146  'data' => [],
1147  ],
1148  'pointerField' => 'aFlex',
1149  ],
1150  'processedTca' => [
1151  'columns' => [
1152  'aField' => [
1153  'config' => [
1154  'type' => 'flex',
1155  'ds' => [
1156  'sheets' => [
1157  'sDEF' => [
1158  'ROOT' => [
1159  'type' => 'array',
1160  'el' => [
1161  'section_1' => [
1162  'section' => '1',
1163  'type' => 'array',
1164  'el' => [
1165  'container_1' => [
1166  'type' => 'array',
1167  'el' => [
1168  'aFlexField' => [
1169  'label' => 'aFlexFieldLabel',
1170  'config' => [
1171  'type' => 'inline',
1172  ],
1173  ],
1174  ],
1175  ],
1176  ],
1177  ],
1178  ],
1179  ],
1180  ],
1181  ],
1182  ],
1183  ],
1184  ],
1185  ],
1186  ],
1187  'pageTsConfig' => [],
1188  ];
1189 
1190  $this->expectException(\UnexpectedValueException::class);
1191  $this->expectExceptionCode(1458745468);
1192 
1193  $this->subject->addData($input);
1194  }
1195 
1200  {
1201  $input = [
1202  'tableName' => 'aTable',
1203  'databaseRow' => [
1204  'aField' => [
1205  'data' => [],
1206  ],
1207  'pointerField' => 'aFlex',
1208  ],
1209  'processedTca' => [
1210  'columns' => [
1211  'aField' => [
1212  'config' => [
1213  'type' => 'flex',
1214  'ds' => [
1215  'sheets' => [
1216  'sDEF' => [
1217  'ROOT' => [
1218  'type' => 'array',
1219  'el' => [
1220  'section_1' => [
1221  'section' => '1',
1222  'type' => 'array',
1223  'el' => [
1224  'container_1' => [
1225  'type' => 'array',
1226  'el' => [
1227  'section_nested' => [
1228  'section' => '1',
1229  'type' => 'array',
1230  'el' => [
1231  ],
1232  ],
1233  ],
1234  ],
1235  ],
1236  ],
1237  ],
1238  ],
1239  ],
1240  ],
1241  ],
1242  ],
1243  ],
1244  ],
1245  ],
1246  'pageTsConfig' => [],
1247  ];
1248 
1249  $this->expectException(\UnexpectedValueException::class);
1250  $this->expectExceptionCode(1458745712);
1251 
1252  $this->subject->addData($input);
1253  }
1254 
1258  public function addDataCallsFlexFormSegmentGroupForFieldAndAddsFlexParentDatabaseRow()
1259  {
1260  $input = [
1261  'tableName' => 'aTable',
1262  'databaseRow' => [
1263  'aField' => [
1264  'data' => [],
1265  ],
1266  'pointerField' => 'aFlex',
1267  ],
1268  'processedTca' => [
1269  'columns' => [
1270  'aField' => [
1271  'config' => [
1272  'type' => 'flex',
1273  'ds_pointerField' => 'pointerField',
1274  'ds' => [
1275  'sheets' => [
1276  'sDEF' => [
1277  'ROOT' => [
1278  'type' => 'array',
1279  'el' => [
1280  'aFlexField' => [
1281  'label' => 'aFlexFieldLabel',
1282  'config' => [
1283  'type' => 'input',
1284  ],
1285  ],
1286  ],
1287  ],
1288  ],
1289  ],
1290  ],
1291  ],
1292  ],
1293  ],
1294  ],
1295  'pageTsConfig' => [],
1296  ];
1297 
1299  $dummyGroup = $this->prophesize(FlexFormSegment::class);
1300  GeneralUtility::addInstance(FlexFormSegment::class, $dummyGroup->reveal());
1301 
1302  // Check array given to flex group contains databaseRow as flexParentDatabaseRow and check compile is called
1303  $dummyGroup->compile(Argument::that(function ($result) use ($input) {
1304  if ($result['flexParentDatabaseRow'] === $input['databaseRow']) {
1305  return true;
1306  }
1307  return false;
1308  }))->shouldBeCalled()->willReturnArgument(0);
1309 
1310  $this->subject->addData($input);
1311  }
1312 
1316  public function addDataCallsFlexFormSegmentGroupForDummyContainerAndAddsFlexParentDatabaseRow()
1317  {
1318  $input = [
1319  'tableName' => 'aTable',
1320  'databaseRow' => [
1321  'aField' => [
1322  'data' => [],
1323  ],
1324  'pointerField' => 'aFlex',
1325  ],
1326  'processedTca' => [
1327  'columns' => [
1328  'aField' => [
1329  'config' => [
1330  'type' => 'flex',
1331  'ds_pointerField' => 'pointerField',
1332  'ds' => [
1333  'sheets' => [
1334  'sDEF' => [
1335  'ROOT' => [
1336  'type' => 'array',
1337  'el' => [
1338  'aFlexField' => [
1339  'label' => 'aFlexFieldLabel',
1340  'config' => [
1341  'type' => 'input',
1342  ],
1343  ],
1344  ],
1345  ],
1346  ],
1347  ],
1348  ],
1349  ],
1350  ],
1351  ],
1352  ],
1353  'pageTsConfig' => [],
1354  ];
1355 
1357  $dummyGroupExisting = $this->prophesize(FlexFormSegment::class);
1358  GeneralUtility::addInstance(FlexFormSegment::class, $dummyGroupExisting->reveal());
1359  // Check array given to flex group contains databaseRow as flexParentDatabaseRow and check compile is called
1360  $dummyGroupExisting->compile(Argument::that(function ($result) use ($input) {
1361  if ($result['flexParentDatabaseRow'] === $input['databaseRow']) {
1362  return true;
1363  }
1364  return false;
1365  }))->shouldBeCalled()->willReturnArgument(0);
1366 
1367  $this->subject->addData($input);
1368  }
1369 
1377  public function addDataHandsPageTsConfigIdOverToFlexFormSegmentGroupAsFlexHack()
1378  {
1379  $input = [
1380  'tableName' => 'aTable',
1381  'databaseRow' => [
1382  'aField' => [
1383  'data' => [],
1384  ],
1385  'pointerField' => 'aFlex',
1386  ],
1387  'processedTca' => [
1388  'columns' => [
1389  'aField' => [
1390  'config' => [
1391  'type' => 'flex',
1392  'ds_pointerField' => 'pointerField',
1393  'ds' => [
1394  'sheets' => [
1395  'sDEF' => [
1396  'ROOT' => [
1397  'type' => 'array',
1398  'el' => [
1399  'aFlexField' => [
1400  'label' => 'aFlexFieldLabel',
1401  'config' => [
1402  'type' => 'input',
1403  ],
1404  ],
1405  ],
1406  ],
1407  ],
1408  ],
1409  ],
1410  ],
1411  ],
1412  ],
1413  ],
1414  'pageTsConfig' => [
1415  'TCEFORM.' => [
1416  'aTable.' => [
1417  'aField.' => [
1418  'PAGE_TSCONFIG_ID' => '42',
1419  'PAGE_TSCONFIG_IDLIST' => '2,3,5',
1420  'PAGE_TSCONFIG_STR' => 'configString',
1421  ],
1422  ],
1423  ],
1424  ],
1425  ];
1426 
1428  $dummyGroupExisting = $this->prophesize(FlexFormSegment::class);
1429  GeneralUtility::addInstance(FlexFormSegment::class, $dummyGroupExisting->reveal());
1430  // Check array given to flex group contains pageTsConfig with flexHack field
1431  $dummyGroupExisting->compile(Argument::that(function ($result) use ($input) {
1432  if ($result['pageTsConfig']['flexHack.'] === $input['pageTsConfig']['TCEFORM.']['aTable.']['aField.']) {
1433  return true;
1434  }
1435  return false;
1436  }))->shouldBeCalled()->willReturnArgument(0);
1437 
1438  $this->subject->addData($input);
1439  }
1440 }
if(TYPO3_MODE=== 'BE') $GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['t3lib/class.t3lib_tsfebeuserauth.php']['frontendEditingController']['default']
static addInstance($className, $instance)