Последние пару дней я искал и отлаживал, как получить переведенную версию объекта DomainModel в CommandController в Typo3 v8.7.
В Typo3 4.5 / 4.7 я сделал следующее: - input: DomainModel на языке по умолчанию - построил запрос, который находит запись с l10n_parent, соответствующую данной модели предметной области - получил новую модель предметной области с желаемым sys_language_uid
К сожалению, это больше не работает в Typo3 v8.7. Я всегда получаю модель предметной области для языка по умолчанию.
Я проследил это до метода Typo3DbBackend::doLanguageAndWorkspaceOverlay
, вызванного через Typo3DbBackend::getObjectDataByQuery
Запрос возвращает правильную (переведенную) строку (видимую в отладчике, а также в журнале запросов mysql), но затем переменная $row
перезаписывается в doLanguageAndWorkspaceOverlay
независимо от того, как я установил параметры querySettings setLanguageOverlayMode
и setLanguageMode
.
Итак, как правильно получить переведенную модель предметной области в CommandController?
ОБНОВЛЕНИЕ:
Думаю, я на шаг впереди. Если я добавлю ->setQueryLanguage(1)
в настройки запроса, doLanguageAndWorkspaceOverlay()
попытается получить переведенную запись для language = 1. Но для успеха мне нужно обмануть класс FrontendGroupRestriction
, установив $GLOBALS['TSFE']->gr_list = "0,-2";
.
Массив, возвращаемый doLanguageAndWorkspaceOverlay()
, теперь содержит все переведенные записи, кроме uid
, который по-прежнему является uid
из записи на основном языке. uid
переведенной записи сохраняется в _LOCALIZED_UID
.
Теперь моя проблема заключается в том, что я все еще получаю запись в основном языке, потому что DataMapper->mapSingleRow()
(вызывается через DataMapper->map()
) имеет какой-то объектный кеш и, таким образом, возвращает объект на языке по умолчанию (потому что uid
по-прежнему является одной из записей в главный язык).
Все это кажется немного хакерским. И снова мой вопрос: как правильно получить переведенную модель предметной области в CommandController?
спасибо мика
p.s .: Я установил второй язык в бэкэнде, и создание переведенной записи работает нормально. Мой вопрос в том, как получить существующую переведенную запись в CommandController.