Мы работаем над проектом, использующим Silverstripe с модулем Fluent для включения нескольких переводов.
Вот пример объекта данных с включенным 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_Localised
ID | RecordID | Locale | Title
Пока все хорошо, кроме использования:
$milkshake = Milkshake::get()->first()
не возвращаетлокализованные данные и данные из таблицы Milkshake
.
Я думаю, что можно использовать:
$locale= FluentState::singleton()->getLocale();
$milkshake = Milkshake_Localised::get()->filter(['Locale' => $locale])->first();
Но это выглядит неуклюже и не имеет откатов, если данные локали не 'не существует для этого поля (в этот момент оно должно возвращаться к локали по умолчанию или при отсутствии исходного поля Milkshake
).
Какой правильный способ доступа к данным локали в Fluent, так что естьзапасной вариант, если требуется?