我定期开发处理多种语言的导入/导出命令。我总是使用 Extbase 存储库和模型,因此我不必手动连接记录或做其他粗略的事情。
我有将 setRespectSysLanguage 设置为 false 的解决方法,并将 sysLanguageUid 手动添加到每个查询中,但我必须拥有以我需要的语言返回记录的自定义方法。
TYPO3 中是否有一种方法可以在 Symfony 命令中设置特定语言,也许通过语言方面,全局设置,这样我就不必为所有事情使用专门的方法,并且我可以切换到不同的语言,除了默认语言,并以该语言从存储库中获取记录?
您可以在存储库类中实现以下方法:
public function setLanguage($langId)
{
$querySettings = $this->createQuery()->getQuerySettings();
$querySettings->setLanguageUid($langId);
$this->setDefaultQuerySettings($querySettings);
}
现在您可以在获取数据之前将语言 ID 设置到您的存储库。 IE。像这样:
// LangId 2 i.e.
$langIdYouWant = 2;
$this->yourRepository->setLanguage($langIdYouWant);
$model = $this->yourRepository->findByAnythingYouWant('WhatYouWant');
请注意,findByUid 方法将忽略设置的 languageId。
您现在可以将语言 ID 传递给 cli 命令,并在执行操作之前更改存储库中的语言。
第一条评论后编辑
如果您需要更自动化一点,您可以执行以下操作。 为您的存储库实现一个基类,该基类将由您的所有存储库实现,如下所示:
class YourRepository extends YourBaseRepository
{
// Do fancy repo stuff here....
}
在基础存储库中,您可以像这样实现initializeObject方法:
class YourAbstractRepository 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 时将语言 ID 传递给它。并将语言 ID 设置为运行时常量。
define('CLI_IMPORT_LANGUAGE_UID', $langUid);
这样,该常量仅可用于命令的导入例程。 这应该可以完成工作。