在 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 查询日志中看到),然后变量
$row
在 doLanguageAndWorkspaceOverlay
中被覆盖,无论我如何
设置 querySettings setLanguageOverlayMode
和 setLanguageMode
.
那么在
命令控制器?
更新:
我想我更进了一步。如果我将 ->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 不再有任何关系,但它
现在工作得很好...
这就是所有人
这两天一直在搜索和调试如何获取 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 查询日志中看到),然后变量
$row
在 doLanguageAndWorkspaceOverlay
中被覆盖,无论我如何
设置 querySettings setLanguageOverlayMode
和 setLanguageMode
.
那么在 命令控制器?
更新:
我想我更进了一步。如果我将 ->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 不再有任何关系,但它 现在工作得很好...
这就是所有人