【问题标题】:SilverStripe - DataObject to add tab and save data in PageSilverStripe - 用于在页面中添加选项卡和保存数据的 DataObject
【发布时间】:2016-09-08 13:55:55
【问题描述】:

我正在寻找一个 DataObject 类,它将字段注入到 Page 对象中,但这样做有点麻烦。到目前为止,我发现的唯一解决方案需要我在页面中做一些事情(除了添加两个类之间的关系),我不太确定我是什么做错了...

我需要让 DataObject 在 Page 中添加一个选项卡和一些字段,并将该 Page 的数据保存到 DataObjects 表中。

从某种意义上说,我希望它们在某种程度上彼此独立,以便我可以不时将其链接到 文章,然后在以后的某个时间链接到其他一些页面类型。

这是我目前所拥有的:

Article.php

 class Article extends Page {

     private static $description = 'An article page for writing and posting content';

     private static $has_many = array(
         'MyExtraFields' => 'MyExtraFields'
     );
 }

数据对象

 class MyExtraFields extends DataObject {

     private static $db = array(
         'ExtraText' => 'Varchar(255)',
         'ExtraWYSIWYG' => 'HTMLText'
     );

     private static $has_many = array(
         'Article' => 'Article'
     );

     private static $summary_fields = array(
         'ExtraText' => 'ExtraText',
         'ExtraWYSIWYG' => 'ExtraWYSIWYG'
     );

     public function updateCMSFields(){

         $fields = parent::getCMSFields();

         $fields->addFieldsToTab('Root.Content.Translation', array(
             TextField::create('ExtraText'),
             HTMLEditorField::create('ExtraWYSIWYG')
             )
         );

         return $fields;
     }
 }

【问题讨论】:

  • 目标到底是什么?只需向页面添加两个附加字段?如果是这种情况,直接将它们添加到页面中?如果您需要将它们应用到不同的页面,或者通过扩展。如果您希望能够将 0 - N ExtraFields 添加到页面,那基本上是一个内容块模块(为此目的有几个现有模块)
  • 在ExtraFields 类中(我会将那个重命名为ExtraField,因为每个对象只包含一个),文章页面有一个has_many,它应该是一个has_one。如果你想创建一个多对多,那么你应该在一侧创建一个 many_many 关系,在另一侧创建一个 belongs_many_many (但我猜这不是你想要实现的......)

标签: silverstripe


【解决方案1】:

如果我理解正确,您希望能够将 DataObject MyExtraField 添加到 Pagetype 文章中。如果 MyExtraField 依赖于 Article,那么您需要将 ExtraField 的 Relation 更改为 has_one,如 jberculo 所说:

class MyExtraField extends DataObject {

    ...

    private static $has_one = array(
        'Article' => 'Article'
    );
}

然后你必须在文章的 CMS 视图中添加一个 GridField 来管理 DataObject:

class Article extends Page {

    ...
    private static $has_many = array(
        'MyExtraFields' => 'MyExtraField'
    );

    public function getCMSFields() {
        $fields = parent::getCMSFields();

        $gridFieldConfig = GridFieldConfig_RecordEditor::create();
        $gridfield = new GridField( "MyExtraFields", "MyExtraField", $this->MyExtraField(), $gridFieldConfig );
        $fields->addFieldToTab( 'Root.ExtraFields', $gridfield );
        return $fields;
    }

如果你想在不同的文章中复用DataObject,你需要使用多对多关系和不同的GridField-Configuration:

 $gridFieldConfig = GridFieldConfig_RelationEditor::create();

您可以在此处找到 GridField 的文档:

https://docs.silverstripe.org/en/3.4/developer_guides/forms/field_types/gridfield

如果您想管理 has_one 关系以便能够仅添加一个可选的 MyExtraField 实例,您可以使用:

https://github.com/burnbright/silverstripe-hasonefield

【讨论】:

  • 这差不多了,但我怎么做才能让每个ExtraFields 不能有多个Article 条目?目前我已经使用if(MyExtraField::get()->find('ArticleID', $this->ID)) 解决了这个问题,如果有条目则删除添加按钮,但我确信有一种更简洁的方式来呈现它,对吧?
  • 我为 has_one 关系添加了一个解决方案。但我可以问:你为什么要这样做?将字段直接添加到页面类型要简单得多。 BTW:获取相关对象的更简单方法是:if($this->MyExtraFields())
猜你喜欢
  • 2017-10-07
  • 1970-01-01
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-10
相关资源
最近更新 更多