我已经将Silverstripe网站从3.x升级到了4.x。
3.x使用多语言进行翻译,现在在4.x中,我已将Silverlingipe Fluent模块替换为多语言,但我想知道如何在使用Fluent的情况下将数据(已翻译字段)导入新系统。
更准确地说,我想通过翻译后的数据以类似的方式更新SiteTree_Localized表
$record = SiteTree_Localised::get()->filter(array(
'RecordID' => 16,
'Locale' => 'de_DE'
))->first();
$record->Title = 'Some title';
$record->write();
但是这不起作用,因为SiteTree_Localized对象不存在?如何更新以上记录?
答案 0 :(得分:1)
SiteTree_Localised
数据库表不能通过ORM直接访问,但是通过Fluent的ORM操作被包裹在钩子之下。您可以通过更改“ FluentState”来访问和修改此表中的记录,然后像在SilverStripe中通常那样写记录。
这是在SilverStripe 4中的特定Fluent上下文中编写对象的方式:
FluentState::singleton()->withState(function (FluentState $newState) {
$newState->setLocale('de_DE');
$record = SiteTree::get()->byID(16);
$record->Title = 'Some title';
$record->write();
});
您可以循环执行此操作(例如,进行数据转储),然后通过use ($data, $locale)
将所需的数据传递给withState回调。
还有一个BuiltTask for migrating from translatable to fluent不会直接帮助您,但可能会提供一些见识。