如何使用Silverstripe Fluent通过::get()访问区域设置字段值
我们正在进行一个项目,使用Silverstripe和启用多个翻译 下面是一个启用Fluent的示例数据对象。首先,我们创建数据对象并显式设置CMS字段:如何使用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
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();
});