From 9b062f6fb1df26dc1b171748f994fa80d6dc71ff Mon Sep 17 00:00:00 2001
From: Helmut Hummel <typo3@helhum.io>
Date: Thu, 15 Dec 2022 13:22:54 +0100
Subject: [PATCH] [BUGFIX] Prioritize form default values over TCA overrides

When defining a default value in column overrides
e.g. for tt_content TCA field sys_language_uid
this value from TCA will override the value that will
be set via the page module when adding a content
element for a different language, because the change
introduced in #86876 does not respect default values
that are set via defVals (which are passed to form engine
as defaultValues)

A check if such values are set is now added, so that
the fix for #86876 will still work, but default values set
via editing forms are also respected

Resolves: #99381
Releases: main, 11.5
Change-Id: Ib4270665b396bbe520afb21a7f145d0d549305ac
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/78893
Tested-by: core-ci <typo3@b13.com>
Tested-by: Oliver Bartsch <bo@cedev.de>
Reviewed-by: Oliver Bartsch <bo@cedev.de>
---
 .../FormDataProvider/TcaColumnsOverrides.php  |  1 +
 .../TcaColumnsOverridesTest.php               | 76 +++++++++++++++++++
 2 files changed, 77 insertions(+)

diff --git a/typo3/sysext/backend/Classes/Form/FormDataProvider/TcaColumnsOverrides.php b/typo3/sysext/backend/Classes/Form/FormDataProvider/TcaColumnsOverrides.php
index 63d6a3833c41..0eae906fd1f8 100644
--- a/typo3/sysext/backend/Classes/Form/FormDataProvider/TcaColumnsOverrides.php
+++ b/typo3/sysext/backend/Classes/Form/FormDataProvider/TcaColumnsOverrides.php
@@ -45,6 +45,7 @@ class TcaColumnsOverrides implements FormDataProviderInterface
                     if ($overridenDefault !== ''
                         && !isset($result['userTsConfig']['TCAdefaults.'][$tableNameWithDot][$field])
                         && !isset($result['pageTsConfig']['TCAdefaults.'][$tableNameWithDot][$field])
+                        && !isset($result['defaultValues'][$result['tableName']][$field])
                         && ($result['databaseRow'][$field] ?? '') !== $overridenDefault
                     ) {
                         $result['databaseRow'][$field] = $overridenDefault;
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsOverridesTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsOverridesTest.php
index b2b6c5811078..837cae8ad65d 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsOverridesTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsOverridesTest.php
@@ -136,4 +136,80 @@ class TcaColumnsOverridesTest extends UnitTestCase
 
         self::assertEquals($expected, $this->subject->addData($input));
     }
+
+    public static function addDataRespectsTSconfigDefaultValuesForNewRecordsDataProvider(): array
+    {
+        return [
+            [
+                [
+                    'userTsConfig' => [
+                        'TCAdefaults.' => [
+                            'aTable.' => [
+                                'aField' => 'userTsConfigValue',
+                            ],
+                        ],
+                    ],
+                ],
+            ],
+            [
+                [
+                    'pageTsConfig' => [
+                        'TCAdefaults.' => [
+                            'aTable.' => [
+                                'aField' => 'pageTsConfigValue',
+                            ],
+                        ],
+                    ],
+                ],
+            ],
+            [
+
+                [
+                    'defaultValues' => [
+                        'aTable' => [
+                            'aField' => 'defaultValuesValue',
+                        ],
+                    ],
+                ],
+            ],
+        ];
+    }
+
+    /**
+     * @test
+     * @dataProvider addDataRespectsTSconfigDefaultValuesForNewRecordsDataProvider
+     */
+    public function addDataRespectsTSconfigDefaultValuesForNewRecords(array $result): void
+    {
+        $input = array_replace_recursive([
+            'command' => 'new',
+            'tableName' => 'aTable',
+            'vanillaUid' => 12,
+            'databaseRow' => [
+                'uid' => 42,
+            ],
+            'recordTypeValue' => 'foo',
+            'processedTca' => [
+                'columns' => [
+                    'aField' => [
+                        'aConfig' => 'aValue',
+                    ],
+                ],
+                'types' => [
+                    'foo' => [
+                        'showitem' => [],
+                        'columnsOverrides' => [
+                            'aField' => [
+                                'config' => [
+                                    'default' => 'aDefault',
+                                ],
+                            ],
+                        ],
+                    ],
+                ],
+            ],
+        ], $result);
+
+        self::assertNotTrue(isset($this->subject->addData($input)['databaseRow']['aField']));
+    }
 }
-- 
GitLab