Получение переведенных записей в CommandController

Последние пару дней я искал и отлаживал, как получить переведенную версию объекта 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.


person Mika    schedule 14.06.2018    source источник


Ответы (2)


альтернативное решение:

Основываясь на приведенном выше решении, я решил, что почти все могу делать сам. Так что я сейчас делаю

i) создать независимый конструктор запросов для соответствующей таблицы:

$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($tableName);`

ii) выберите запись с желаемыми l10n_parent и sys_language_uid

$query = $queryBuilder->select('*')
         ->from($tableName)
         ->where($queryBuilder->expr()->eq('sys_language_uid', $langId))
         ->andWhere($queryBuilder->expr()->eq('l10n_parent', $parentUid))
         ->execute();

iii) получить все записи в массив

$rows = $query->fetchAll();

iv) вызвать DataMapper вручную, чтобы получить объект

$dataMapper = $this->objectManager->get(DataMapper::class);
$translated = $dataMapper->map($className, $rows);

Я знаю, что это больше не имеет ничего общего с ModelRepository, но пока работает вполне нормально ...

это все люди

person Mika    schedule 21.06.2018
comment
Здесь таблица мм все еще не переводится. Есть идеи по этому поводу? - person Ganybhat-kalpatech; 12.12.2019

Мое решение проблемы, описанной выше:

Чтобы избежать вызова DataMapper как части запроса из Typo3DbBackend, я использовал необработанный запрос (аргумент для ->execute()) и получил обратно массив, который уже прошел языковой оверлей и т. Д.

НО: в массиве по-прежнему доступен _LOCALIZED_UID. Поэтому я перезаписываю uid значением из _LOCALIZED_UID и вызываю DataMapper вручную. Довольно громоздко и очень хакерски, чтобы преодолеть недостатки бэкэнда Typo3 ...

person Mika    schedule 21.06.2018