diff --git a/typo3/sysext/core/Classes/DataHandling/SlugHelper.php b/typo3/sysext/core/Classes/DataHandling/SlugHelper.php index 6d13acb511c6..77aee4f2a7f2 100644 --- a/typo3/sysext/core/Classes/DataHandling/SlugHelper.php +++ b/typo3/sysext/core/Classes/DataHandling/SlugHelper.php @@ -335,10 +335,12 @@ public function isUniqueInSite(string $slug, RecordState $state): bool */ public function isUniqueInTable(string $slug, RecordState $state): bool { + $recordId = $state->getSubject()->getIdentifier(); $languageId = $state->getContext()->getLanguageId(); $queryBuilder = $this->createPreparedQueryBuilder(); $this->applySlugConstraint($queryBuilder, $slug); + $this->applyRecordConstraint($queryBuilder, $recordId); $this->applyLanguageConstraint($queryBuilder, $languageId); $this->applyWorkspaceConstraint($queryBuilder, $state); $statement = $queryBuilder->execute(); diff --git a/typo3/sysext/core/Tests/Functional/DataHandling/DataHandler/DataSet/TestSlugUniqueNewRecordResult.csv b/typo3/sysext/core/Tests/Functional/DataHandling/DataHandler/DataSet/TestSlugUniqueNewRecordResult.csv new file mode 100644 index 000000000000..0ee4a65d1b74 --- /dev/null +++ b/typo3/sysext/core/Tests/Functional/DataHandling/DataHandler/DataSet/TestSlugUniqueNewRecordResult.csv @@ -0,0 +1,6 @@ +"pages",,,, +,"uid","pid","title","slug" +,1,0,"root","/" +,2,1,"Page One","/page-one" +,3,1,"Page Two","/page-two" +,4,1,"Page Two","/page-two-1" diff --git a/typo3/sysext/core/Tests/Functional/DataHandling/DataHandler/DataSet/TestSlugUniqueWithDeduplicatedSlugBase.csv b/typo3/sysext/core/Tests/Functional/DataHandling/DataHandler/DataSet/TestSlugUniqueWithDeduplicatedSlugBase.csv new file mode 100644 index 000000000000..090cffb65d59 --- /dev/null +++ b/typo3/sysext/core/Tests/Functional/DataHandling/DataHandler/DataSet/TestSlugUniqueWithDeduplicatedSlugBase.csv @@ -0,0 +1,5 @@ +"pages",,,, +,"uid","pid","title","slug" +,1,0,"root","/" +,2,1,"Page One","/page-one" +,3,1,"Page One","/page-one-1" diff --git a/typo3/sysext/core/Tests/Functional/DataHandling/DataHandler/SlugUniqueTest.php b/typo3/sysext/core/Tests/Functional/DataHandling/DataHandler/SlugUniqueTest.php index fbecb711aa82..28401649f2c3 100644 --- a/typo3/sysext/core/Tests/Functional/DataHandling/DataHandler/SlugUniqueTest.php +++ b/typo3/sysext/core/Tests/Functional/DataHandling/DataHandler/SlugUniqueTest.php @@ -30,7 +30,6 @@ protected function setUp(): void { parent::setUp(); $this->setUpFrontendSite(1); - $this->importCSVDataSet(__DIR__ . '/DataSet/TestSlugUniqueBase.csv'); } /** @@ -51,8 +50,9 @@ public function getEvalSettingDataProvider(): array * @test * @param string $uniqueSetting */ - public function differentUniqueEvalSettingsDeDuplicateSlug(string $uniqueSetting) + public function differentUniqueEvalSettingsDeDuplicateSlug(string $uniqueSetting): void { + $this->importCSVDataSet(__DIR__ . '/DataSet/TestSlugUniqueBase.csv'); $GLOBALS['TCA']['pages']['columns']['slug']['config']['eval'] = $uniqueSetting; $dataHandler = GeneralUtility::makeInstance(DataHandler::class); $dataHandler->enableLogging = false; @@ -68,7 +68,60 @@ public function differentUniqueEvalSettingsDeDuplicateSlug(string $uniqueSetting [] ); $dataHandler->process_datamap(); + $this->assertCSVDataSet('typo3/sysext/core/Tests/Functional/DataHandling/DataHandler/DataSet/TestSlugUniqueResult.csv'); + } + + /** + * @dataProvider getEvalSettingDataProvider + * @test + * @param string $uniqueSetting + */ + public function currentRecordIsExcludedWhenDeDuplicateSlug(string $uniqueSetting): void + { + $this->importCSVDataSet(__DIR__ . '/DataSet/TestSlugUniqueWithDeduplicatedSlugBase.csv'); + $GLOBALS['TCA']['pages']['columns']['slug']['config']['eval'] = $uniqueSetting; + $dataHandler = GeneralUtility::makeInstance(DataHandler::class); + $dataHandler->enableLogging = false; + $dataHandler->start( + [ + 'pages' => [ + 3 => [ + 'slug' => 'page-one-1', + ], + ], + ], + [] + ); + $dataHandler->process_datamap(); $this->assertCSVDataSet('typo3/sysext/core/Tests/Functional/DataHandling/DataHandler/DataSet/TestSlugUniqueResult.csv'); } + + /** + * @dataProvider getEvalSettingDataProvider + * @test + * @param string $uniqueSetting + */ + public function differentUniqueEvalSettingsDeDuplicateSlugWhenCreatingNewRecords(string $uniqueSetting): void + { + $this->importCSVDataSet(__DIR__ . '/DataSet/TestSlugUniqueBase.csv'); + $GLOBALS['TCA']['pages']['columns']['slug']['config']['eval'] = $uniqueSetting; + $dataHandler = GeneralUtility::makeInstance(DataHandler::class); + $dataHandler->enableLogging = false; + $dataHandler->start( + [ + 'pages' => [ + 'NEW-1' => [ + 'pid' => 1, + 'title' => 'Page Two', + 'slug' => '', + ], + ], + ], + [] + ); + $dataHandler->process_datamap(); + + $this->assertCSVDataSet('typo3/sysext/core/Tests/Functional/DataHandling/DataHandler/DataSet/TestSlugUniqueNewRecordResult.csv'); + } }