Bug #99529
closedDuplicate slugs with collisions using TCA type "slug" and records with sys_language_uid = -1
100%
Description
Here, there is a collision with uid=4 and uid=5 as well as uid=4 and uid=6. They all have the slug 'hallo-2' which would be ok if the language differs, but sys_language_uid=-1 means the record will be shown for all languages
select uid,sys_language_uid,deleted,hidden,slug,title from db.tx_sypetsexampleslug_something; +-----+------------------+---------+--------+-------------------+---------------------+ | uid | sys_language_uid | deleted | hidden | slug | title | +-----+------------------+---------+--------+-------------------+---------------------+ | 1 | 0 | 0 | 0 | hallo | hallo | | 2 | 0 | 0 | 0 | halloeoe-usw-blah | hallöö usw. blah | | 3 | 0 | 0 | 0 | hallo-1 | hallo | | 4 | -1 | 0 | 0 | hallo-2 | hallo | | 5 | 6 | 0 | 0 | hallo-2 | hallo | | 6 | 0 | 0 | 0 | hallo-2 | hallo | +-----+------------------+---------+--------+-------------------+---------------------+
Reproduce¶
There is a minimal extension to reproduce issue which works with v12: https://github.com/sypets/sypets_example_slug
1. Use an extension with slug field (e.g. calendarize or sypets_example_slug)
2. Create several records with the same slugs. Create at least one record with sys_language_uid=-1 (you may have to save once and then generate the slug again to create the duplicate)
The problem can be reproduced with news + TYPO3 v11, calendarize and TYPO3 v11 and TYPO3 v12 and the example extension sypets_example_slug.
or check existing content for extensions, e.g.
news (language 0 or -1):
select path_segment,count(*) as c from tx_news_domain_model_news where not hidden and not deleted and (sys_language_uid=0 || sys_language_uid=-1) group by path_segment order by c;
calendarize (language 0 or -1):
select slug,count(*) as c from tx_calendarize_domain_model_event where not hidden and not deleted and (sys_language_uid=0 || sys_language_uid=-1) group by slug order by c;
Versions¶
- reproduced with latest main branch (v12)
- can be reproduced with v11 using EXT:calendarize, see issue: https://github.com/lochmueller/calendarize/issues/731
Source code example¶
// slug field
'slug' => [
'exclude' => false,
'label' => 'slug',
'config' => [
'type' => 'slug',
'generatorOptions' => [
'fields' => ['title'],
'fieldSeparator' => '/',
'prefixParentPageSlug' => true,
'replacements' => [
'/' => '',
],
],
'fallbackCharacter' => '-',
'eval' => 'unique',
'default' => ''
]
],