如何使用 Silverstripe Fluent 通过 ::get() 访问 Locale 字段值

How to access Locale field values through ::get() using Silverstripe Fluent

我们正在开发一个项目,使用 Silverstripe 和 Fluent module 来启用多种翻译。

这是一个启用了 Fluent 的示例数据对象。首先,我们创建数据对象并明确设置 CMS 字段:

namespace Yard;

use SilverStripe\ORM\DataObject;
use SilverStripe\Forms\FieldList;
use SilverStripe\Forms\TextField;

class Milkshake extends DataObject {
  private static $table_name = 'Milkshake';

  private static $db = [
    'Title' => 'Varchar(255)'
  ]

  public function getCMSFields() {
    $fields = new FieldList(
        new TextField('Title', 'Milkshake Title', null, 255)
    );
    $this->extend('updateCMSFields', $fields);
    return $fields;
  }
}

然后我们在YML文件中将Title设置为translatable:

Yard\Milkshake:
  extensions:
    - 'TractorCow\Fluent\Extension\FluentExtension'
  translate:
    - 'Title'

这为我们提供了一个带有 translatable Title 字段的对象,该字段在不同的语言环境中可以具有不同的值。它创建以下数据库 table:

Milkshake_Localised

ID | RecordID | Locale | Title

到目前为止一切顺利,除了使用:

$milkshake = Milkshake::get()->first() 不 return 本地化数据并从 Milkshake table.

中提取

我认为可以使用:

$locale= FluentState::singleton()->getLocale();
$milkshake = Milkshake_Localised::get()->filter(['Locale' => $locale])->first();

但是如果该字段的区域设置数据不存在(此时它应该回退到默认区域设置,否则原始 Milkshake 字段失败),这感觉很笨拙并且没有回退。

在 Fluent 中访问区域设置数据的正确方法是什么,以便在需要时可以回退?

通过将 get 命令包装在“withState

中,我获得了所需的行为
use TractorCow\Fluent\State\FluentState; 

$milkshake = FluentState::singleton()->withState(function (FluentState $state) {
 return Milkshake::get()->first(); 
});