在 CommandController 中获取翻译记录

Getting translated records in CommandController

这两天一直在搜索和调试如何获取 Typo3 v8.7 中 CommandController 中 DomainModel 对象的翻译版本。

在 Typo3 4.5/4.7 中,我做了以下事情: - 输入:默认语言的DomainModel - 构建一个查询,查找 l10n_parent 匹配的记录 给定领域模型 - 获得具有所需 sys_language_uid

的新领域模型

不幸的是,这在 Typo3 v8.7 中不再起作用。我总是得到 默认语言的域模型。

我已经将其追溯到方法 Typo3DbBackend::doLanguageAndWorkspaceOverlay 通过 Typo3DbBackend::getObjectDataByQuery

调用

查询 returns 正确的(翻译的)行(在调试器和 mysql 查询日志中看到),然后变量 $rowdoLanguageAndWorkspaceOverlay 中被覆盖,无论我如何 设置 querySettings setLanguageOverlayModesetLanguageMode.

那么在 命令控制器?

更新:

我想我更进了一步。如果我将 ->setQueryLanguage(1) 添加到查询设置,doLanguageAndWorkspaceOverlay() 会尝试获取语言 = 1 的翻译记录。但为了成功,我需要通过以下方式欺骗 FrontendGroupRestriction class设置 $GLOBALS['TSFE']->gr_list = "0,-2";

doLanguageAndWorkspaceOverlay() 返回的数组现在包含所有翻译的条目,但 uid 除外,它仍然是来自主要语言记录的 uid。翻译记录的 uid 存储在 _LOCALIZED_UID.

现在我的问题是我仍然在主语言中得到记录,因为 DataMapper->mapSingleRow()(通过 DataMapper->map() 调用)有某种对象缓存,因此 returns 对象使用默认语言(因为 uid 仍然是主要语言的记录之一)。

这一切似乎有点老套。那么我的问题又来了:在 CommandController 中获取翻译域模型的正确方法是什么?

谢谢, 米卡

p.s.: 我已经在后端设置了第二种语言,并且创建翻译记录工作得很好。我的问题只是如何在 CommandController 中获取现有的翻译记录。

我对上述问题的解决方案:

避免调用 DataMapper 作为查询的一部分 Typo3DbBackend,我使用了原始查询(->execute() 的参数)并得到 返回一个已经通过语言覆盖等的数组。

但是: 在 '_LOCALIZED_UID' 数组仍然可用。所以我覆盖了 使用来自“_LOCALIZED_UID”的值的 uid 并调用 DataMapper 手动。克服 Typo3 相当麻烦且非常 hackish 后端缺点...

备选方案:

基于上面的解决方案,我决定我几乎可以做任何事情 靠我自己。所以我现在做的是

i) 根据 table:

创建一个独立的查询生成器
$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($tableName);`

ii) select 具有所需 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 不再有任何关系,但它 现在工作得很好...

这就是所有人