在调度程序任务

时间:2018-06-04 12:42:34

标签: typo3 extbase

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

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

我仍在解决的一些mysterios事情,例如sys_language_uid参数,必须是_languageUidmore 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

1 个答案:

答案 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