Bug #92142
openPageRouter does not find correct page candidates when using mount points
0%
Description
When you have a mount point which is NOT translated, and try to access a (mounted) page which is translated, you get a PageNotFound exception.
The generation of the URL is properly created by TYPO3, but the decoding fails.
(Real) example configuration on how to reproduce¶
(there is possibly a shorter configuration but at least you have here a full real example)
We have domain.tld
with the following structure:
. |-- [1] domain.tld (slug = /) | `-- [2] share (slug = /share, mount_pid=3, mount_pid_ol=0) | |-- [3] shared pages | `-- [4] login (slug = /login) .
Language configuration¶
domain.tld
is configured for French (default), German (sys_language_uid=1), Italian (sys_language_uid=3) and English (sys_language_uid=4)shared pages
is configured for English (default), German (sys_language_uid=1), French (sys_language_uid=2) and Italian (sys_language_uid=3)
In order for French in the context of domain.tld
to use any French translation in the context of shared pages
, we configure that domain to use sys_language_uid=2
with a fallback to 0
(French and German configuration included, missing are Italian and English but they have the same structure):
languages: - title: Français enabled: true base: /fr/ typo3Language: fr locale: 'fr_CH.utf8,fr_CH.UTF-8' iso-639-1: fr websiteTitle: '' navigationTitle: Français hreflang: fr-CH direction: '' fallbackType: fallback fallbacks: '0' flag: fr languageId: '2' - title: Deutsch enabled: true base: /de/ typo3Language: de locale: 'de_CH.utf8,de_CH.UTF-8' iso-639-1: de websiteTitle: '' navigationTitle: Deutsch hreflang: de-CH direction: '' fallbackType: fallback fallbacks: '0' flag: de languageId: '1' -
The shared pages
have the exact same configuration.
How does it work?¶
/fr/
is configured to fetch content with sys_language_uid=2
but there is none in the context of domain.tld
so it always falls back to French content with default language sys_language_uid=0
.
When we access a shared page however, since we are with sys_language_uid=2
we can properly access French-translated content in the context of those pages where English is the default language.
The same heppens the other way around, when being in English in domain.tld
, we are in sys_language_uid=4
and when accessing content in the shared pages, we have no such content, it thus falls back to content with sys_language_uid=0
, default language which happens to be English in that context.
Problem¶
Page 4 is translated like that:
- Default (English): slug=/login
- German: slug=/anmeldung
- French: slug=/authentification
In a menu, you ask TYPO3 to generate a link to the login page. In the default language, you will get a link http://domain.tld/fr/share/authentification
but when clicking the link, you get a 404 Page Not Found.
Analysis¶
Since page 2 (/share) is not translated, the PageRouter will be able to resolve it only when looking for page in sys_language_uid=0
. Then, as it is a mount point, it tries to match the rest of the URL with mounted pages but it does that in the context of sys_language_uid=0
only, and NOT in the context of sys_language_uid=2
. As such it cannot match the slug /authentification
.
If you manually try to access the page /fr/share/login
, then the URL resolution works and you get the page.
Fix¶
Method findPageCandidatesOfMountPoint
should be called with the whole list of requested languages so that any custom fallback logic is properly taken into account even if the mount point is untranslated.