我正在开发一个扩展,它提供了一个调度程序任务 . 在此任务中,将触发API,并将结果写入数据库 . 到目前为止没有问题 .
但整个错字3(8.7与php7.2)页面有多种语言 . 所以我必须用不同的语言保存所有API对象 . 这对插入过程没有任何困难,但在更新过程中我无法选择正确的语言 .
我仍然解决了一些mysterios问题,比如 sys_language_uid
参数,它必须是 _languageUid
(more details),或者我没有找到任何解决方案来从 sys_language
表中获取所有可能的语言而不使用 ConnectionPool
上的自己的doctrine查询构建器 . (我还将默认语言添加为条目)
现在到了主要问题,我还没有解决 . 在调试核心之后,我得到了我使用存储库构建的查询是正确的 .
存储库:
$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
1 回答
我正在为版本8.7(标签8.7.19之后的分支
TYPO3_8-7
)编辑TYPO3核心 . 在第618行的文件typo3 / sysext / extbase / Classes / Persistence / Generic / Storage / Typo3DbBackend.php中,我另外检查了respectSysLangauge选项,这样新的检查将是:在此之后,我为TYPO3的这一部分启动了TYPO3-testsuite,并且everthing似乎没问题(所有测试都已通过)并且我的问题已修复 . 我不知道如何正确贡献而不花费数小时阅读整个contribution guide .