在CommandController

时间:2018-06-14 07:25:46

标签: typo3 extbase typo3-8.x typo3-extensions typo3-8.7.x

我在最近几天搜索并调试了如何获得 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 setLanguageOverlayModesetLanguageMode

那么获取翻译域模型的正确方法是什么? 命令控制器?

更新

我想我更进了一步。如果我将->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中获取现有的翻译记录。

2 个答案:

答案 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无关,但是 现在工作还不错...

那是所有人