From 7d23f31086b70190af454f695923986a1db3b214 Mon Sep 17 00:00:00 2001
From: Claus Due <claus@namelesscoder.net>
Date: Fri, 24 Feb 2017 18:01:33 +0100
Subject: [PATCH] [BUGFIX] Restore operability for USER displayConds

Parsing of the displayCond value was referencing the
incorrect array, causing the parsed displayCond to no
longer be correct. Referencing the correct array solves
the problem by generating the correct "named
condition array" based on the input.

Change-Id: Ia0cae240387ec8f24ea66b593b6824f9bb6b6dc5
Resolves: #79822
Releases: master
Reviewed-on: https://review.typo3.org/51837
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Wouter Wolters <typo3@wouterwolters.nl>
Reviewed-by: Morton Jonuschat <m.jonuschat@mojocode.de>
Tested-by: Morton Jonuschat <m.jonuschat@mojocode.de>
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
---
 .../EvaluateDisplayConditions.php             |  8 ++--
 .../EvaluateDisplayConditionsTest.php         | 41 +++++++++++++++++++
 2 files changed, 45 insertions(+), 4 deletions(-)

diff --git a/typo3/sysext/backend/Classes/Form/FormDataProvider/EvaluateDisplayConditions.php b/typo3/sysext/backend/Classes/Form/FormDataProvider/EvaluateDisplayConditions.php
index 5544c45a9eb8..59df135acc99 100644
--- a/typo3/sysext/backend/Classes/Form/FormDataProvider/EvaluateDisplayConditions.php
+++ b/typo3/sysext/backend/Classes/Form/FormDataProvider/EvaluateDisplayConditions.php
@@ -415,10 +415,10 @@ class EvaluateDisplayConditions implements FormDataProviderInterface
                         1481382954
                     );
                 }
-                $namedConditionArray['function'] = $namedConditionArray[1];
-                array_shift($namedConditionArray);
-                array_shift($namedConditionArray);
-                $namedConditionArray['parameters'] = $namedConditionArray;
+                $namedConditionArray['function'] = $conditionArray[1];
+                array_shift($conditionArray);
+                array_shift($conditionArray);
+                $namedConditionArray['parameters'] = $conditionArray;
                 $namedConditionArray['record'] = $databaseRow;
                 break;
             default:
diff --git a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/EvaluateDisplayConditionsTest.php b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/EvaluateDisplayConditionsTest.php
index 235b7bd8a249..9c8a0235eece 100644
--- a/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/EvaluateDisplayConditionsTest.php
+++ b/typo3/sysext/backend/Tests/Unit/Form/FormDataProvider/EvaluateDisplayConditionsTest.php
@@ -494,6 +494,47 @@ class EvaluateDisplayConditionsTest extends \TYPO3\TestingFramework\Core\Unit\Un
         (new EvaluateDisplayConditions())->addData($input);
     }
 
+    /**
+     * @test
+     */
+    public function addDataEvaluatesUserCondition()
+    {
+        $input = [
+            'databaseRow' => [],
+            'processedTca' => [
+                'columns' => [
+                    'field_1' => [
+                        'displayCond' => 'USER:' . self::class . '->addDataEvaluatesUserConditionCallback:more:arguments',
+                    ],
+                ],
+            ],
+        ];
+        $this->expectException(\RuntimeException::class);
+        $this->expectExceptionCode(1488130499);
+        (new EvaluateDisplayConditions())->addData($input);
+    }
+
+    /**
+     * Callback method of addDataEvaluatesUserCondition. A USER condition
+     * Throws an exception if data is correct!
+     *
+     * @throws \RuntimeException if data is ok
+     */
+    public function addDataEvaluatesUserConditionCallback(array $parameter)
+    {
+        $expected = [
+            'record' => [],
+            'flexformValueKey' => 'vDEF',
+            'conditionParameters' => [
+                0 => 'more',
+                1 => 'arguments',
+            ]
+        ];
+        if ($expected === $parameter) {
+            throw new \RuntimeException('testing', 1488130499);
+        }
+    }
+
     /**
      * @test
      */
-- 
GitLab