我在最近几天搜索并调试了如何获得 Typo3 v8.7中CommandController中DomainModel对象的翻译版本。
在Typo3 4.5 / 4.7中,我做了以下事情: - 输入:默认语言的DomainModel - 构建一个查询,找到与l10n_parent匹配的记录 给定域模型 - 使用所需的sys_language_uid
获取新的域模型不幸的是,这在Typo3 v8.7中不起作用了。我总是得到 默认语言的域模型。
我已将此追溯到方法Typo3DbBackend::doLanguageAndWorkspaceOverlay
通过Typo3DbBackend::getObjectDataByQuery
查询返回正确的(已翻译的)行(在调试器和mysql查询日志中看到),但随后变量
无论我如何,$row
都会覆盖doLanguageAndWorkspaceOverlay
设置querySettings setLanguageOverlayMode
和setLanguageMode
。
那么获取翻译域模型的正确方法是什么? 命令控制器?
更新
我想我更进了一步。如果我将->setQueryLanguage(1)
添加到查询设置中,doLanguageAndWorkspaceOverlay()
会尝试获取language = 1的已翻译记录。但为了成功,我需要通过设置{{1}来欺骗FrontendGroupRestriction
类}}。
$GLOBALS['TSFE']->gr_list = "0,-2";
返回的数组现在包含所有已翻译的条目,但doLanguageAndWorkspaceOverlay()
除外,它仍然是主语言记录中的uid
。翻译记录的uid
存储在uid
。
现在我的问题是我仍然在主要语言中获取记录,因为_LOCALIZED_UID
(通过DataMapper->mapSingleRow()
调用)具有某种对象缓存,因此以默认语言返回对象(因为DataMapper->map()
仍然是主要语言中的记录之一。)
所有这一切似乎都有点hackish。再次提出我的问题:在CommandController中获取翻译域模型的正确方法是什么?
感谢, 米卡
p.s。:我在后端设置了第二种语言,创建翻译记录就可以了。我的问题是如何在CommandController中获取现有的翻译记录。
答案 0 :(得分:0)
我对上述问题的解决方案:
为避免从查询中调用DataMapper作为查询的一部分
Typo3DbBackend,我使用了原始查询(->execute()
的参数)并得到
返回一个已经经过语言覆盖等的数组。
但:在 数组'_LOCALIZED_UID'仍然可用。所以我覆盖了 uid和'_LOCALIZED_UID'中的值,并调用DataMapper 手动。要克服Typo3相当繁琐且非常棘手 后端缺点...
答案 1 :(得分:0)
替代解决方案:
基于上述解决方案,我决定我可以做几乎所有事情 我一个人所以我现在要做的是
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无关,但是 现在工作还不错...
那是所有人