如何使用 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();
});
我们正在开发一个项目,使用 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();
});