【问题标题】:How to access Locale field values through ::get() using Silverstripe Fluent如何使用 Silverstripe Fluent 通过 ::get() 访问区域设置字段值
【发布时间】:2020-02-13 20:29:53
【问题描述】:

我们正在开发一个项目,使用 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 为可翻译:

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】:

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

use TractorCow\Fluent\State\FluentState; 

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-09
    • 2012-05-27
    相关资源
    最近更新 更多