Я разрабатываю расширение, которое предоставляет задачу планировщика.В этой задаче запускается 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 кэшируется и временная перезапись невозможна.
Я что-то не так делаю, или это просто ошибка?
обновление
Взгляните на упрощенный пример