通过脚本更新SiteTree_Localized表

时间:2019-02-26 12:22:31

标签: php silverstripe silverstripe-4

我已经将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对象不存在?如何更新以上记录?

1 个答案:

答案 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不会直接帮助您,但可能会提供一些见识。