From 8ff6876594e91d6800ff20e845ba4dbde6c7dd38 Mon Sep 17 00:00:00 2001
From: Oliver Bartsch <bo@cedev.de>
Date: Sun, 5 Apr 2020 16:55:13 +0200
Subject: [PATCH] [BUGFIX] Set default value defined in columnsOverrides

The TcaColumnsOverrides provider now handles overwriting
of a fields default value for a specific record type.

This is done by setting the value from `columnsOverrides`
as the field value of the new `databaseRow` by respecting
TSconfig `TCAdefaults`.

Resolves: #86876
Releases: master, 9.5
Change-Id: If03871f262ed89011dbeda3f268f0b61c20036be
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/64081
Tested-by: TYPO3com <noreply@typo3.com>
Tested-by: aslam idrisov <aslambek.idrisov1@swisscom.com>
Tested-by: Benni Mack <benni@typo3.org>
Reviewed-by: aslam idrisov <aslambek.idrisov1@swisscom.com>
Reviewed-by: Benni Mack <benni@typo3.org>
---
 .../FormDataProvider/TcaColumnsOverrides.php  | 13 ++++++
 .../TcaColumnsOverridesTest.php               | 46 +++++++++++++++++++
 2 files changed, 59 insertions(+)

diff --git a/typo3/sysext/backend/Classes/Form/FormDataProvider/TcaColumnsOverrides.php b/typo3/sysext/backend/Classes/Form/FormDataProvider/TcaColumnsOverrides.php
index 6cc0a30e7720..63d6a3833c41 100644
--- a/typo3/sysext/backend/Classes/Form/FormDataProvider/TcaColumnsOverrides.php
+++ b/typo3/sysext/backend/Classes/Form/FormDataProvider/TcaColumnsOverrides.php
@@ -38,6 +38,19 @@ class TcaColumnsOverrides implements FormDataProviderInterface
                 $result['processedTca']['columns'],
                 $result['processedTca']['types'][$type]['columnsOverrides']
             );
+            if ($result['command'] === 'new') {
+                $tableNameWithDot = $result['tableName'] . '.';
+                foreach ($result['processedTca']['types'][$type]['columnsOverrides'] as $field => $columnsOverrideConfig) {
+                    $overridenDefault = $columnsOverrideConfig['config']['default'] ?? '';
+                    if ($overridenDefault !== ''
+                        && !isset($result['userTsConfig']['TCAdefaults.'][$tableNameWithDot][$field])
+                        && !isset($result['pageTsConfig']['TCAdefaults.'][$tableNameWithDot][$field])
+                        && ($result['databaseRow'][$field] ?? '') !== $overridenDefault
+                    ) {
+                        $result['databaseRow'][$field] = $overridenDefault;
+                    }
+                }
+            }
             unset($result['processedTca']['types'][$type]['columnsOverrides']);
         }
         return $result;
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsOverridesTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsOverridesTest.php
index 58383a641a0e..9b305cd24f4f 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsOverridesTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaColumnsOverridesTest.php
@@ -40,6 +40,8 @@ class TcaColumnsOverridesTest extends UnitTestCase
     public function addDataRemovesGivenColumnsOverrides()
     {
         $input = [
+            'command' => 'new',
+            'tableName' => 'aTable',
             'recordTypeValue' => 'foo',
             'processedTca' => [
                 'columns' => [],
@@ -64,6 +66,8 @@ class TcaColumnsOverridesTest extends UnitTestCase
     public function addDataMergesColumnsOverridesIntoColumns()
     {
         $input = [
+            'command' => 'new',
+            'tableName' => 'aTable',
             'recordTypeValue' => 'foo',
             'processedTca' => [
                 'columns' => [
@@ -91,4 +95,46 @@ class TcaColumnsOverridesTest extends UnitTestCase
 
         self::assertEquals($expected, $this->subject->addData($input));
     }
+
+    /**
+     * @test
+     */
+    public function addDataMergesColumnsOverridesDefaultValueIntoDatabaseRow()
+    {
+        $input = [
+            'command' => 'new',
+            'tableName' => 'aTable',
+            'vanillaUid' => 12,
+            'databaseRow' => [
+                'uid' => 42,
+            ],
+            'recordTypeValue' => 'foo',
+            'processedTca' => [
+                'columns' => [
+                    'aField' => [
+                        'aConfig' => 'aValue'
+                    ],
+                ],
+                'types' => [
+                    'foo' => [
+                        'showitem' => [],
+                        'columnsOverrides' => [
+                            'aField' => [
+                                'config' => [
+                                    'default' => 'aDefault'
+                                ]
+                            ],
+                        ],
+                    ],
+                ],
+            ],
+        ];
+
+        $expected = $input;
+        $expected['databaseRow']['aField'] = 'aDefault';
+        $expected['processedTca']['columns']['aField']['config']['default'] = 'aDefault';
+        unset($expected['processedTca']['types']['foo']['columnsOverrides']);
+
+        self::assertEquals($expected, $this->subject->addData($input));
+    }
 }
-- 
GitLab