如何使用Silverstripe Fluent通过::get()访问区域设置字段值

如何使用Silverstripe Fluent通过::get()访问区域设置字段值,silverstripe,silverstripe-4,Silverstripe,Silverstripe 4,我们正在进行一个项目,使用Silverstripe和启用多个翻译 下面是一个启用Fluent的示例数据对象。首先,我们创建数据对象并显式设置CMS字段: namespace Yard; use SilverStripe\ORM\DataObject; use SilverStripe\Forms\FieldList; use SilverStripe\Forms\TextField; class Milkshake extends DataObject { private static

我们正在进行一个项目,使用Silverstripe和启用多个翻译

下面是一个启用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文件中将
标题设置为可翻译:

Yard\Milkshake:
  extensions:
    - 'TractorCow\Fluent\Extension\FluentExtension'
  translate:
    - 'Title'
这为我们提供了一个具有可翻译的
标题
字段的对象,该字段可以在不同的地区具有不同的值。它将创建以下数据库表:

奶昔本地化

ID | RecordID | Locale | Title
到目前为止一切正常,除了使用:

$milkshake=milkshake::get()->first()
不会从
milkshake
表返回本地化数据和提取

我认为可以使用:

$locale= FluentState::singleton()->getLocale();
$milkshake = Milkshake_Localised::get()->filter(['Locale' => $locale])->first();
但这感觉很笨拙&如果该字段的区域设置数据不存在,则没有回退(此时它应该回退到默认区域设置,或者如果原始
奶昔
字段失败)


在Fluent中访问语言环境数据的正确方法是什么,以便在需要时有回退?

我通过在“”中包装get命令获得了所需的行为


全局回退区域设置是否是一种可能的解决方案?如果这太笼统,可以通过“withState”调用对象,请参见@wmk-调用对象“withState”是有效的。如果你想把它放到答案中,我可以把它标记为正确的:
$milkshake=FluentState::singleton()->withState(函数(FluentState$state){return milkshake::get()->first();})
use TractorCow\Fluent\State\FluentState; 

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