Typo3 在CommandController中获取已翻译的记录

Typo3 在CommandController中获取已翻译的记录,typo3,extbase,typo3-8.x,typo3-extensions,typo3-8.7.x,Typo3,Extbase,Typo3 8.x,Typo3 Extensions,Typo3 8.7.x,在过去的几天里,我搜索并调试了如何获取 Typo3 v8.7中CommandController中DomainModel对象的翻译版本 在Typo3 4.5/4.7中,我做了以下工作: -输入:默认语言的DomainModel -生成一个查询,以查找l10n\u父项与 给定域模型 -获取具有所需系统语言uid的新域模型 $query = $queryBuilder->select('*') ->from($tableName) ->where

在过去的几天里,我搜索并调试了如何获取 Typo3 v8.7中CommandController中DomainModel对象的翻译版本

在Typo3 4.5/4.7中,我做了以下工作: -输入:默认语言的DomainModel -生成一个查询,以查找l10n\u父项与 给定域模型 -获取具有所需系统语言uid的新域模型

$query = $queryBuilder->select('*')
         ->from($tableName)
         ->where($queryBuilder->expr()->eq('sys_language_uid', $langId))
         ->andWhere($queryBuilder->expr()->eq('l10n_parent', $parentUid))
         ->execute();
不幸的是,这在Typo3 v8.7中不再起作用。我总是很紧张 默认语言的域模型

我将其追溯到方法
typo3dbackend::doLanguageAndWorkspaceOverlay
通过
Typo3DbBackend::getObjectDataByQuery调用

查询返回正确的(翻译的)行(在调试器和mysql查询日志中看到),然后返回变量
$row
doLanguageAndWorkspaceOverlay
中被覆盖,无论我如何 设置查询设置
setLanguageOverlyMode
setLanguageMode

那么,在一个应用程序中获得翻译后的域模型的正确方法是什么呢 指挥官

更新:

我想我更进一步了。如果我将
->setQueryLanguage(1)
添加到查询设置中,
doLanguageAndWorkspaceOverlay()
尝试获取language=1的翻译记录。但是为了成功,我需要通过设置
$GLOBALS['TSFE']->gr_list=“0,-2”来欺骗
FrontendGroupRestriction

doLanguageAndWorkspaceOverlay()
返回的数组现在包含所有翻译的条目,除了
uid
,它仍然是主语言记录中的
uid
。翻译记录的
uid
存储在
\u-LOCALIZED\u-uid

现在我的问题是,我仍然在主语言中获取记录,因为
DataMapper->mapSingleRow()
(通过
DataMapper->map()
调用)具有某种对象缓存,因此以默认语言返回对象(因为
uid
仍然是主语言中的记录之一)

所有这一切似乎都有点不合时宜。那么,我的问题是:在CommandController中获得翻译后的域模型的正确方法是什么

谢谢, 米卡


p、 s:我在后端设置了第二种语言,创建了一个翻译的记录,效果很好。我的问题是如何在CommandController中获取现有的翻译记录。

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

避免将DataMapper作为查询的一部分从 Typo3DbBackend,我使用了一个原始查询(
->execute()
)的参数)并获取 返回一个数组,该数组已通过语言覆盖等

但是:在 “\u本地化的\u UID”数组仍然可用。所以我覆盖了 uid,并调用数据映射程序 手动。要克服打字错误,相当麻烦且非常老练3
后端缺点…

替代解决方案:

基于上述解决方案,我决定我几乎可以做任何事情 我一个人。所以我现在要做的是

i) 为相应的表创建独立的querybuilder:

$queryBuilder = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable($tableName);`
ii)选择具有所需l10n\u父项和系统语言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没有任何关系,但是 现在效果很好


这就是所有人

这里的mm表仍然没有被翻译。有什么想法吗?