我们正在使用Fluent来显示多个翻译/区域设置的Silverstripe项目。
我们想设置一些数据对象,以便可以将记录切换为仅在某些Fluent语言环境中显示。想法是在数据对象上具有一个复选框字段,用户可以在其中选择他们想要在其中显示记录的语言环境。
这里是示例数据对象:
namespace Yard;
use SilverStripe\ORM\DataObject;
use TractorCow\Fluent\Model\Locale;
class Milkshake extends DataObject {
private static $table_name = 'Milkshake';
private static $db = [
'Title' => 'Varchar(255)'
]
private static $belongs_many_many = [
'ShowInLocale' => 'Locale'
];
}
然后我们需要扩展Locale类:
namespace AppExtensions;
use SilverStripe\ORM\DataExtension;
class LocaleExtension extends DataExtension
{
private static $many_many = [
'Milkshakes' => 'Yard\Milkshake'
];
}
并通过YML应用该扩展名:
TractorCow\Fluent\Model\Locale:
extensions:
- 'AppExtensions\LocaleExtension'
目前为止很好-但是当我尝试在管理员中查看“奶昔”时,出现此错误消息:
[[紧急]未捕获LogicException:belongs_many_many关系Yard \ Milkshake.ShowInLocale指向不匹配的语言环境many_many
据我所知,我添加了一个匹配的many_many
关系:数据库记录已创建。
对我应该如何解决此问题的任何想法都表示赞赏。
我使用$many_many through
functionality通过单独的数据对象进行连接。
奶昔对象从$many_many through
(不正确)更改为具有“直通”对象关系的$belongs_many_many
:
$many_many
这是我创建复选框的方式:
class Milkshake extends DataObject {
private static $many_many = [
'ShowInLocale' => [
'through' => LocaleMilkshake::class,
'from' => 'Milkshake',
'to' => 'Locale'
]
];
并定义了一个单独的数据对象:
$fields = parent::getCMSFields();
$showInLocaleField = CheckboxSetField::create(
'ShowInLocale',
'Show in these Locales',
Locale::get()->map('ID','Title');
);
$fields->addFieldToTab('Root.Main', $showInLocaleField);
并将class LocaleMilkshake extends DataObject
{
private static $table_name = 'LocaleMilkshake';
private static $has_one = [
'Milkshake' => 'Yard\Milkshake',
'Locale' => 'TractorCow\Fluent\Model\Locale'
];
}
关系更改为Locale
:
$belongs_many_many