[TASK] Show flash message if value is changed because unique value is required 73/58873/8
authorGeorg Ringer <georg.ringer@gmail.com>
Thu, 8 Nov 2018 13:16:04 +0000 (14:16 +0100)
committerBenni Mack <benni@typo3.org>
Sat, 16 Mar 2019 12:35:11 +0000 (13:35 +0100)
If a TCA field is configured to be unique and the value changes
by the DataHandler, the user should be informed about the change.

Resolves: #85409
Releases: master
Change-Id: I133c107534c1568d8a6d869436c9438e7660e91d
Reviewed-on: https://review.typo3.org/c/58873
Reviewed-by: Wolfgang Klinger <wolfgang@wazum.com>
Reviewed-by: Georg Ringer <georg.ringer@gmail.com>
Reviewed-by: Josef Glatz <josef.glatz@typo3.org>
Reviewed-by: Benni Mack <benni@typo3.org>
Tested-by: TYPO3com <noreply@typo3.com>
Tested-by: Georg Ringer <georg.ringer@gmail.com>
Tested-by: Josef Glatz <josef.glatz@typo3.org>
Tested-by: Benni Mack <benni@typo3.org>
typo3/sysext/belog/Resources/Private/Language/locallang.xlf
typo3/sysext/core/Classes/DataHandling/DataHandler.php
typo3/sysext/core/Tests/Functional/DataHandling/DataHandler/GetUniqueTest.php

index 74910a4..517b889 100644 (file)
                        <trans-unit id="msg_1_5_16">
                                <source>Copying file '%s' failed!: The destination path (%s) may be write protected. Please make it write enabled!. (%s)</source>
                        </trans-unit>
+                       <trans-unit id="msg_1_5_4">
+                               <source>The value of the field "%s" has been changed from "%s" to "%s" as it is required to be unique.</source>
+                       </trans-unit>
                        <trans-unit id="type_2">
                                <source>FILE</source>
                        </trans-unit>
index c3aa8a1..43fe8c4 100644 (file)
@@ -2337,7 +2337,7 @@ class DataHandler implements LoggerAwareInterface
             }
         }
 
-        $newValue = $value;
+        $newValue = $originalValue = $value;
         $statement = $this->getUniqueCountStatement($newValue, $table, $field, (int)$id, (int)$newPid);
         // For as long as records with the test-value existing, try again (with incremented numbers appended)
         if ($statement->fetchColumn()) {
@@ -2351,6 +2351,10 @@ class DataHandler implements LoggerAwareInterface
             }
         }
 
+        if ($originalValue !== $newValue) {
+            $this->log($table, $id, 5, 0, 4, 'The value of the field "%s" has been changed from "%s" to "%s" as it is required to be unique.', 1, [$field, $originalValue, $newValue], $newPid);
+        }
+
         return $newValue;
     }
 
@@ -8037,7 +8041,7 @@ class DataHandler implements LoggerAwareInterface
      * @param int $recuid Record UID. Zero if NA
      * @param int $action Action number: 0=No category, 1=new record, 2=update record, 3= delete record, 4= move record, 5= Check/evaluate
      * @param int $recpid Normally 0 (zero). If set, it indicates that this log-entry is used to notify the backend of a record which is moved to another location
-     * @param int $error The severity: 0 = message, 1 = error, 2 = System Error, 3 = security notice (admin)
+     * @param int $error The severity: 0 = message, 1 = error, 2 = System Error, 3 = security notice (admin), 4 warning
      * @param string $details Default error message in english
      * @param int $details_nr This number is unique for every combination of $type and $action. This is the error-message number, which can later be used to translate error messages. 0 if not categorized, -1 if temporary
      * @param array $data Array with special information that may go into $details by '%s' marks / sprintf() when the log is shown
@@ -8107,7 +8111,7 @@ class DataHandler implements LoggerAwareInterface
             $log_data = unserialize($row['log_data']);
             $msg = $row['error'] . ': ' . sprintf($row['details'], $log_data[0], $log_data[1], $log_data[2], $log_data[3], $log_data[4]);
             /** @var FlashMessage $flashMessage */
-            $flashMessage = GeneralUtility::makeInstance(FlashMessage::class, $msg, '', FlashMessage::ERROR, true);
+            $flashMessage = GeneralUtility::makeInstance(FlashMessage::class, $msg, '', $row['error'] === 4 ? FlashMessage::WARNING : FlashMessage::ERROR, true);
             /** @var FlashMessageService $flashMessageService */
             $flashMessageService = GeneralUtility::makeInstance(FlashMessageService::class);
             $defaultFlashMessageQueue = $flashMessageService->getMessageQueueByIdentifier();
index 76ca20f..da2737d 100644 (file)
@@ -61,6 +61,7 @@ class GetUniqueTest extends \TYPO3\TestingFramework\Core\Functional\FunctionalTe
     public function getUnique(string $value, string $expected)
     {
         $dataHandler = GeneralUtility::makeInstance(DataHandler::class);
+        $dataHandler->enableLogging = false;
         $this->assertSame(
             $expected,
             $dataHandler->getUnique('pages', 'title', $value, 0, 0)