Silverstripe-重复/可重用分组字段
我想实现一个布局,其中一列重复几次,可以在CMS中指定为动态内容。但是,我找不到适合此操作的对象类型。 是否必须为每列分别指定输入字段Silverstripe-重复/可重用分组字段,silverstripe,Silverstripe,我想实现一个布局,其中一列重复几次,可以在CMS中指定为动态内容。但是,我找不到适合此操作的对象类型。 是否必须为每列分别指定输入字段 private static $db = [ 'Intro_Headline' => 'Varchar', 'Intro_Subheadline' => 'Varchar', 'Intro_Text' => 'HTMLText', 'Intro_Headline2' => 'Varchar', 'I
private static $db = [
'Intro_Headline' => 'Varchar',
'Intro_Subheadline' => 'Varchar',
'Intro_Text' => 'HTMLText',
'Intro_Headline2' => 'Varchar',
'Intro_Subheadline2' => 'Varchar',
'Intro_Text2' => 'HTMLText',
...
];
--
或者有人能告诉我找不到哪种字段类型吗
更新:
现在,除了页面模型中的$db变量外,我还有一个$has\u many变量:
private static $has_many = [
'Intro_Columns' => IntroColumn::class,
];
在getCMSFields()函数中,我添加它们如下:
$fields->addFieldToTab('Root.Columns', GridField::create('Intro_Columns', 'Columns', IntroColumn::get()), 'Content');
class IntroColumn extends DataObject
{
private static $db = [
'img_url' => 'Text',
'headline' => 'Varchar',
'subheadline' => 'Varchar',
'text' => 'Text',
'link' => 'Text'
];
}
我的数据对象如下所示:
$fields->addFieldToTab('Root.Columns', GridField::create('Intro_Columns', 'Columns', IntroColumn::get()), 'Content');
class IntroColumn extends DataObject
{
private static $db = [
'img_url' => 'Text',
'headline' => 'Varchar',
'subheadline' => 'Varchar',
'text' => 'Text',
'link' => 'Text'
];
}
但这些字段尚未显示在CMS中。如何从数据对象输出数据字段?对于可重复的内容,您必须将其放入不同的对象中,然后将多个对象链接到当前对象/页面
在SilverStripe 4中执行此操作的默认方法是使用内置数据库关系(
$has_many
或$many_many
而不是$db)和
GridField`作为表单字段
我建议您阅读本教程:特别是关于
$has\u许多
的部分将适用于您的用例。(例如,一个团队有多个玩家或一个公司有多人)
$has_many
/$many_many
是一个非常通用的选项,可用于任何数量的可能的数据库关系(链接类别、图像、页面等)
另一个选项是官方支持的名为elemental的模块。这是专为可重复内容而构建的。
可能不适合您的用例,但我维护了一个模块,该模块提供了GridField的替代方案,但它更适合小表单字段。HTMLEditor太大,在本模块中很有用。
编辑:对您更新的问题的回答: 如果您使用的是GridField,我建议您:
类页面扩展SiteTree{
私有静态$has_many=[
'Intro_Columns'=>IntroColumn::class,
];
公共函数getCMSFields(){
$fields=parent::getCMSFields();
$fields->addFieldToTab('Root.Columns',新建GridField(
“介绍栏”,
“我的专栏”,
$this->Intro_Columns(),
新的GridFieldConfig_RecordEditor()
)“内容”);
返回$fields;
}
}
类IntroColumn扩展了DataObject{
私有静态$db=[
'headline'=>'Varchar',
“subheadline”=>“Varchar”,
“文本”=>“文本”,
'链接'=>'文本'
];
私有静态$has_one=[
“图像”=>“图像”,
]
公共函数getCMSFields(){
$fields=新字段列表();
$fields->push(newtextfield('headline','My headline'));
$fields->push(新文本字段('subheadline','My subheadline');
//……等等
$fields->push(newuploadfield('Image','Upload an Image'));
返回$fields;
}
}
请注意,我使用的是$this->Intro_Columns()
作为GridField的值,而不是IntroColumn::get()
。因为$this->Intro_Columns()
是一个自动生成的方法,它返回链接到当前页面的所有IntroColumn对象。但是$this->Intro_Columns()
将返回所有页面中的所有Intro列
在模板中,您还可以访问此自动生成的方法:
页面标题:$Title
$headline
$subheadline
$Image.URL
...
谢谢,我再次更新了我的问题。不幸的是,我在文档中没有找到在CMS中以gridfields形式输出数据对象的方法。我更新了答案,在底部添加了关于如何使用gridfield的更多细节