Я регулярно разрабатываю команды импорта/экспорта, работающие с несколькими языками. Я всегда использую репозитории и модели Extbase, поэтому мне не приходится соединять записи вручную или делать другие схематичные вещи.
У меня есть обходные пути: установите для setRespectSysLanguage значение false и добавляйте sysLanguageUid вручную в каждый запрос, но у меня должны быть свои собственные методы, которые возвращают запись на нужном мне языке.
Нет ли в TYPO3 способа установить определенный язык в команде Symfony, возможно, через языковой аспект, глобально, чтобы мне не нужно было иметь специализированные методы для всего, и я мог переключиться на другой язык, отличный от язык по умолчанию и получать записи из репозитория на этом языке?




Вы можете реализовать следующий метод в своем классе репозитория:
public function setLanguage($langId)
{
$querySettings = $this->createQuery()->getQuerySettings();
$querySettings->setLanguageUid($langId);
$this->setDefaultQuerySettings($querySettings);
}
И теперь вы можете установить идентификатор языка в своем репозитории перед получением данных. Т.е. так:
// LangId 2 i.e.
$langIdYouWant = 2;
$this->yourRepository->setLanguage($langIdYouWant);
$model = $this->yourRepository->findByAnythingYouWant('WhatYouWant');
Имейте в виду, что метод findByUid будет игнорировать установленный идентификатор языка.
Теперь вы можете передать идентификатор языка в команду cli и изменить язык в репозитории, прежде чем что-то делать.
РЕДАКТИРОВАТЬ после первого комментария
Если вам нужно немного больше автоматизации, вы можете сделать следующее. Реализуйте базовый класс для своих репозиториев, который будет реализован всеми вашими репозиториями следующим образом:
class YourRepository extends YourBaseRepository
{
// Do fancy repo stuff here....
}
В базовом репозитории вы можете реализовать метод инициализацииОбъекта следующим образом:
class YourBaseRepository extends Repository
{
public function initializeObject() {
parent::initializeObject();
if (defined('CLI_IMPORT_LANGUAGE_UID')){
$langId = constant('CLI_IMPORT_LANGUAGE_UID');
$querySettings = $this->createQuery()->getQuerySettings();
$querySettings->setLanguageUid($langId);
$this->setDefaultQuerySettings($querySettings);
}
}
}
Итак, теперь вы можете передать идентификатор языка вашему CommandController при его выполнении. И установите идентификатор языка как константу времени выполнения.
define('CLI_IMPORT_LANGUAGE_UID', $langUid);
Таким образом, константа доступна только для процедуры импорта вашей команды. Это должно сработать.
Используйте DataHandler/QueryBuilder для импорта в CLI, а не в Extbase. Extbase — это контекст FE, CLI — это контекст BE, но не контекст веб-запроса. Вы можете «имитировать контекст FE» вместе со всем, что необходимо для загрузки контекста FE, включая запрос (глобальный), загрузку TypoScript (Extbase активно использует TypoScript, потому что он привязан к контексту FE) и т. д. Вы не найдете ничего из ядра, которое могло бы помочь. вы находитесь в контексте CLI с Extbase, поскольку Extbase не предназначена для работы в этой области.
Да, но с DataHandler/QueryBuilder я не могу использовать существующие модели. Это требует, чтобы я сам обрабатывал все соединения между таблицами, что требует гораздо больше работы и времени, чем использование репозиториев.
Спасибо. Я обычно так делаю. Проблема с этим методом в том, что как только он становится более сложным, вам придется применять его ко всем репозиториям, и все репозитории должны иметь правильный язык в любое время, поэтому вероятность ошибки возрастает. Это подходит для простых задач, но для сложного импорта с множеством разных репозиториев вам необходимо убедиться, что во всех ваших репозиториях используется правильный язык. Я просто подумал, может быть, есть более простой способ, предоставляемый ядром, который я пропустил.