Silverstripe-重复/可重用分组字段

Silverstripe-重复/可重用分组字段,silverstripe,Silverstripe,我想实现一个布局,其中一列重复几次,可以在CMS中指定为动态内容。但是,我找不到适合此操作的对象类型。 是否必须为每列分别指定输入字段 private static $db = [ 'Intro_Headline' => 'Varchar', 'Intro_Subheadline' => 'Varchar', 'Intro_Text' => 'HTMLText', 'Intro_Headline2' => 'Varchar', 'I

我想实现一个布局,其中一列重复几次,可以在CMS中指定为动态内容。但是,我找不到适合此操作的对象类型。 是否必须为每列分别指定输入字段

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中。如何从数据对象输出数据字段?

对于可重复的内容,您必须将其放入不同的对象中,然后将多个对象链接到当前对象/页面

  • GridFIeld
    在SilverStripe 4中执行此操作的默认方法是使用内置数据库关系(
    $has_many
    $many_many
    而不是
    $db)和
    GridField`作为表单字段

    我建议您阅读本教程:
    特别是关于
    $has\u许多
    的部分将适用于您的用例。(例如,一个团队有多个玩家或一个公司有多人)

    $has_many
    /
    $many_many
    是一个非常通用的选项,可用于任何数量的可能的数据库关系(链接类别、图像、页面等)

  • 基本模块
    另一个选项是官方支持的名为elemental的模块。这是专为可重复内容而构建的。

  • 序列化数据对象模块
    可能不适合您的用例,但我维护了一个模块,该模块提供了GridField的替代方案,但它更适合小表单字段。HTMLEditor太大,在本模块中很有用。

  • PS:不管你走哪条路,我强烈建议你从(1.)开始学习教程。这是SilverStripe非常重要的基本功能


    编辑:对您更新的问题的回答:

    如果您使用的是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的更多细节