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

问题描述 投票:0回答:1

我们正在使用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;
  }
}

然后我们将Title设置为可在YML文件中翻译:

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

这为我们提供了一个具有可翻译Title字段的对象,该字段在不同的区域可以具有不同的值。它创建以下数据库表:

Milkshake_Localized

ID | RecordID | Locale | Title

到目前为止很好,除了使用:

[$milkshake = Milkshake::get()->first()不返回本地化数据并从Milkshake表中提取。

我认为可以使用:

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

但是,如果该字段的语言环境数据不存在,这会显得很笨拙,并且没有回退(这时,它应该回退到默认语言环境,否则将失败为原始的Milkshake字段。

在Fluent中访问语言环境数据的正确方法是什么,如果需要的话会有一个后备方法?

silverstripe silverstripe-4
1个回答
0
投票

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

use TractorCow\Fluent\State\FluentState; 

$milkshake = FluentState::singleton()->withState(function (FluentState $state) {
 return Milkshake::get()->first(); 
});
© www.soinside.com 2019 - 2024. All rights reserved.