Typo3 在CommandController中获取已翻译的记录
在过去的几天里,我搜索并调试了如何获取 Typo3 v8.7中CommandController中DomainModel对象的翻译版本 在Typo3 4.5/4.7中,我做了以下工作: -输入:默认语言的DomainModel -生成一个查询,以查找l10n\u父项与 给定域模型 -获取具有所需系统语言uid的新域模型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
$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表仍然没有被翻译。有什么想法吗?