我正在开发一个扩展,它提供了一个调度任务。在此任务中,将触发API,并将结果写入数据库。到目前为止没有问题。
但是整个错字3(带有php7.2的8.7)页面有多种语言。所以我必须用不同的语言保存所有API对象。这对插入过程没有任何困难,但在更新过程中我无法选择正确的语言。
我仍在解决的一些mysterios事情,例如sys_language_uid
参数,必须是_languageUid
(more details),或者我找不到任何解决方案来获取所有可能的语言sys_language
表没有在ConnectionPool
上使用自己的doctrine querybuilder。 (我还将默认语言添加为条目)
现在主要问题,我还没解决。在调试核心之后,我得到了我使用存储库构建的查询是正确的。
存储库:
$query = $this->createQuery();
$query->getQuerySettings()->setIgnoreEnableFields(true);
$query->getQuerySettings()->setRespectSysLanguage(false);
$query->matching(
$query->logicalAnd(
$query->equals('identifier', $identifier),
$query->equals('sys_language_uid', $languageUid)
)
);
生成的查询是:
SELECT `TABLE`.* FROM `TABLE` `T`
WHERE (
(`T`.`identifier` = :dcValue1)
AND (`T`.`sys_language_uid` = :dcValue2)
) AND (`T`.`deleted` = 0)
现在我尝试从数据库中获取父对象以继续更新。整个更新映射经过单元测试,所有调试输出都确认一切正常。
我回顾核心,并在第612行的TYPO3\CMS\Extbase\Persistence\Generic\Storage\Typo3DbBackend::class找到:
foreach ($rows as $row) {
// If current row is a translation select its parent
if (isset($tableName) && isset($GLOBALS['TCA'][$tableName])
&& isset($GLOBALS['TCA'][$tableName]['ctrl']['languageField'])
&& isset($GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField'])
&& $tableName !== 'pages_language_overlay'
) {
if (isset($row[$GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField']])
&& $row[$GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField']] > 0
) {
$queryBuilder = $this->connectionPool->getQueryBuilderForTable($tableName);
$queryBuilder->getRestrictions()->removeAll();
$row = $queryBuilder->select($tableName . '.*')
->from($tableName)
->where(
$queryBuilder->expr()->eq(
$tableName . '.uid',
$queryBuilder->createNamedParameter(
$row[$GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField']],
\PDO::PARAM_INT
)
),
$queryBuilder->expr()->eq(
$tableName . '.' . $GLOBALS['TCA'][$tableName]['ctrl']['languageField'],
$queryBuilder->createNamedParameter(0, \PDO::PARAM_INT)
)
)
->setMaxResults(1)
->execute()
->fetch();
}
}
...
就像第613行上的评论所说,数据库中的行将被覆盖在这个foreach中。所有xdebug数据都证实了这一点。如果我在我的TCA中禁用transOrigPointerField
它将按预期工作,但后端视图无法将多种语言分配给一个父元素。
我还尝试删除仅用于调度程序任务的TCA条目,但是缓存了TCA并且不能进行临时覆盖。
我做错了什么,还是只是一个错误?
查看简化的example
答案 0 :(得分:0)
我正在编辑版本8.7的TYPO3核心(标记8.7.19之后的分支TYPO3_8-7
)。在第618行的文件typo3 / sysext / extbase / Classes / Persistence / Generic / Storage / Typo3DbBackend.php中,我另外检查了respectSysLangauge选项,以便新检查:
// If current row is a translation select its parent
if (isset($tableName) && isset($GLOBALS['TCA'][$tableName])
&& isset($GLOBALS['TCA'][$tableName]['ctrl']['languageField'])
&& isset($GLOBALS['TCA'][$tableName]['ctrl']['transOrigPointerField'])
&& $tableName !== 'pages_language_overlay'
&& true === $querySettings->getRespectSysLanguage()
) {
在此之后,我为TYPO3的这一部分启动了TYPO3-testsuite,并且everthing似乎没问题(所有测试都已通过)并且我的问题已修复。我不知道如何正确地做出贡献而不花费数小时阅读整个contribution guide。