首页 文章

在调度程序任务中选择其他语言的记录

提问于
浏览
1

我正在开发一个扩展,它提供了一个调度程序任务 . 在此任务中,将触发API,并将结果写入数据库 . 到目前为止没有问题 .

但整个错字3(8.7与php7.2)页面有多种语言 . 所以我必须用不同的语言保存所有API对象 . 这对插入过程没有任何困难,但在更新过程中我无法选择正确的语言 .

我仍然解决了一些mysterios问题,比如 sys_language_uid 参数,它必须是 _languageUidmore 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 回答

  • 0

    我正在为版本8.7(标签8.7.19之后的分支 TYPO3_8-7 )编辑TYPO3核心 . 在第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 .

相关问题