Выберите записи из других языков в задаче планировщика - PullRequest
0 голосов
/ 04 июня 2018

Я разрабатываю расширение, которое предоставляет задачу планировщика.В этой задаче запускается API, и результаты будут записываться в базу данных.Пока проблем нет.

Но вся страница typo3 (8.7 с php7.2) имеет несколько языков.Поэтому я должен сохранить все объекты API на другом языке.Это не создает никаких трудностей для процесса вставки, но в процессе обновления я не мог выбрать правильные языки.

Некоторые загадочные вещи, которые я до сих пор решил, например, параметр sys_language_uid, который должен быть _languageUid ( подробнее ) или что я не нахожу никакого решения для получения всех возможных языков из таблицы sys_language без использования собственного построителя запросов доктрины над ConnectionPool.(Я также добавляю язык по умолчанию в качестве записи)

Теперь к основной проблеме, которую я пока не могу решить.После отладки ядра я получаю, что запросы, которые я строю с хранилищем, правильные.

хранилище:

$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)

Теперь я пытаюсь получить родительский объект из базы данных, чтобы продолжить обновление.Все отображение обновлений проверено модулем, и все выходные данные отладки подтверждают, что все работает нормально.

Оглядываясь назад, я нахожу на TYPO3 \ CMS \ Extbase \ Persistence \ Generic \ Storage \ Typo3DbBackend :: class в строке 612:

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 подтверждают это.Если я отключу transOrigPointerField в своем TCA, он будет работать так, как ожидалось, но в режиме внутреннего просмотра не удалось назначить несколько языков одному родительскому элементу.

Я также пытался удалить запись TCA только для задачи планировщика, но TCA кэшируется и временная перезапись невозможна.

Я что-то не так делаю, или это просто ошибка?

обновление

Взгляните на упрощенный пример

1 Ответ

0 голосов
/ 08 июня 2018

Я редактировал ядро ​​TYPO3 для версии 8.7 (ветка TYPO3_8-7 после тега 8.7.19).В файле typo3 / sysext / extbase / Classes / Persistence / Generic / Storage / Typo3DbBackend.php в строке 618 я дополнительно проверяю параметр отношенииSysLangauge, поэтому новая проверка будет:

// 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 и всего остального в порядке (все тесты пройдены), и моя проблема исправлена.Я не знаю, как правильно внести свой вклад, не тратя часы на прочтение всего руководства по вкладу .

...