From 0747f03cd0d30d85dfbd72b22a78e70fdf866b48 Mon Sep 17 00:00:00 2001
From: Tobi Kretschmann <tobi@tobishome.de>
Date: Fri, 3 Apr 2020 16:39:33 +0200
Subject: [PATCH] [BUGFIX] correctly resolve saved mm relations in TCA
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Using mm tables, the value that is stored in the database does not represent the
uid of the selected item. Much rather it is the amount of selected items.
If three items are selected the value within the database field is "3".
Whereas using multiple select without mm table, it is stored as a
comma-separated list of uids.

Releases: master, 9.5
Resolves: #90925
Change-Id: I110cbf0fd19fab1135958c445a846a1af9c24510
Reviewed-on: https://review.typo3.org/c/Packages/TYPO3.CMS/+/64062
Tested-by: TYPO3com <noreply@typo3.com>
Tested-by: Jörg Bösche <typo3@joergboesche.de>
Tested-by: Sebastian Hofer <sebastian.hofer@marit.ag>
Tested-by: Benni Mack <benni@typo3.org>
Reviewed-by: Jörg Bösche <typo3@joergboesche.de>
Reviewed-by: Sebastian Hofer <sebastian.hofer@marit.ag>
Reviewed-by: Benni Mack <benni@typo3.org>
---
 .../Form/FormDataProvider/TcaSelectItems.php  |  8 +++++++-
 .../FormDataProvider/TcaSelectItemsTest.php   | 20 ++++++++++++-------
 2 files changed, 20 insertions(+), 8 deletions(-)

diff --git a/typo3/sysext/backend/Classes/Form/FormDataProvider/TcaSelectItems.php b/typo3/sysext/backend/Classes/Form/FormDataProvider/TcaSelectItems.php
index 91569d7fd916..53bce81b34d0 100644
--- a/typo3/sysext/backend/Classes/Form/FormDataProvider/TcaSelectItems.php
+++ b/typo3/sysext/backend/Classes/Form/FormDataProvider/TcaSelectItems.php
@@ -78,8 +78,14 @@ class TcaSelectItems extends AbstractItemProvider implements FormDataProviderInt
 
             $removedItems = array_diff_key($removedItems, $fieldConfig['config']['items']);
 
-            // needed to determine the items for invalid values
             $currentDatabaseValuesArray = $this->processDatabaseFieldValue($result['databaseRow'], $fieldName);
+            // Check if it's a new record to respect TCAdefaults
+            if (!empty($fieldConfig['config']['MM']) && $result['command'] !== 'new') {
+                // Getting the current database value on a mm relation doesn't make sense since the amount of selected
+                // relations is stored in the field and not the uids of the items
+                $currentDatabaseValuesArray = [];
+            }
+
             $result['databaseRow'][$fieldName] = $currentDatabaseValuesArray;
 
             // add item values as keys to determine which items are stored in the database and should be preselected
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaSelectItemsTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaSelectItemsTest.php
index 5a14d7ac6e8b..e82d0040af2c 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaSelectItemsTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/TcaSelectItemsTest.php
@@ -3441,7 +3441,7 @@ class TcaSelectItemsTest extends UnitTestCase
             24
         ];
 
-        $relationHandlerProphecy->start(2, 'foreignTable', 'aTable_foreignTable_mm', 42, 'aTable', $fieldConfig)->shouldBeCalled();
+        $relationHandlerProphecy->start('', 'foreignTable', 'aTable_foreignTable_mm', 42, 'aTable', $fieldConfig)->shouldBeCalled();
         $relationHandlerProphecy->getValueArray()->shouldBeCalled()->willReturn($relationHandlerUids);
 
         $expected = $input;
@@ -3877,8 +3877,8 @@ class TcaSelectItemsTest extends UnitTestCase
                     'command' => 'edit',
                     'effectivePid' => 42,
                     'databaseRow' => [
-                        'uid' => 'NEW1234',
-                        'aField' => '24,35',
+                        'uid' => 42,
+                        'aField' => '2',
                     ],
                     'processedTca' => [
                         'columns' => [
@@ -3895,7 +3895,9 @@ class TcaSelectItemsTest extends UnitTestCase
                         ],
                     ],
                 ],
-                [],
+                [
+                    'relationHandlerStartItemList' => '',
+                ],
                 []
             ],
             'Relation with MM table and maxitems = 1 processes field value (item count)' => [
@@ -3923,7 +3925,9 @@ class TcaSelectItemsTest extends UnitTestCase
                         ],
                     ],
                 ],
-                [],
+                [
+                    'relationHandlerStartItemList' => '',
+                ],
                 [
                     24
                 ]
@@ -3953,7 +3957,9 @@ class TcaSelectItemsTest extends UnitTestCase
                         ],
                     ],
                 ],
-                [],
+                [
+                    'relationHandlerStartItemList' => '',
+                ],
                 []
             ]
         ];
@@ -3969,7 +3975,7 @@ class TcaSelectItemsTest extends UnitTestCase
      */
     public function processSelectFieldSetsCorrectValuesForMmRelations(array $input, array $overrideRelationHandlerSettings, array $relationHandlerUids): void
     {
-        $field = $input['databaseRow']['aField'];
+        $field = $overrideRelationHandlerSettings['relationHandlerStartItemList'] ?? $input['databaseRow']['aField'];
         $foreignTable = $overrideRelationHandlerSettings['foreign_table'] ?? $input['processedTca']['columns']['aField']['config']['foreign_table'];
         $mmTable = $overrideRelationHandlerSettings['MM'] ?? $input['processedTca']['columns']['aField']['config']['MM'];
         $uid = $input['databaseRow']['uid'];
-- 
GitLab