5

添加 many_many 关系时,就像 silverstripe 指南中的项目与导师关系一样:

http://doc.silverstripe.org/framework/en/tutorials/5-dataobject-relationship-management

我想针对这种关系记录一个属性。因此,例如“活动” - 项目导师的是/否字段。但是,对于与她相关的不同项目,导师可能对活跃有不同的价值。

使用 Silverstripe 的内置工具实现这一目标的最佳方法是什么?

在 IRC 的一些帮助和下面的答案下进行更新。我离得更近了一点,它不起作用。我发现了这个: https ://github.com/chillu/silverstripe-framework/blob/c8136f5d4c8a37a4da274cd1c93907c0a2af86a7/docs/en/reference/grid-field.md 这似乎非常相关。

所以 DebatePages 有许多小组成员,他们可以对每场辩论进行不同的投票。

辩论页面.php

  private static $many_many = array(
    'Panelists'     => 'Panelist',
    'RelationTags'  => 'Tag'
  );
  public static $many_many_extraFields = array(
    'Panelists' => array('Motion' => 'Boolean')
  );




public function getCMSFields() {
    .....
    if($this->ID) {
            $panelistFields = singleton('Panelist')->getCMSFields();
            $panelistFields->addFieldToTab(
                'Root.Main',
                // Please follow the "ManyMany[<extradata-name>]" convention
                new TextField('ManyMany[Motion]', 'Agree with Motion')
            );
            $config = GridFieldConfig_RelationEditor::create();
            $config->getComponentByType('GridFieldDetailForm')->setFields($panelistFields);
            $gridField = new GridField('Panelists', 'Panelists', $this->Panelists(), $config);
            $fields->findOrMakeTab('Root.Panelists')->replaceField('Panelist', $gridField);
        }        
    }
4

2 回答 2

9

你可以$many_many_extraFields$many_many关系上使用,像这样(我猜是在Project类上):

static $many_many = array(
    'Mentors' => 'Mentor'
);

static $many_many_extraFields = array(
    'Mentors' => array(
        'Active' => 'Boolean'
    )
);

然后对于每个项目,一个特定的导师可以是活跃的或不活跃的(你总是可以添加其他字段而不是'Active'......)。

如果您使用的是SS 3.1,您可以通过组件轻松编辑这些额外的GridField字段GridFieldDetailForm

function getCMSFields(){

    --[snip]--

    $detailFormFields = new FieldList();
    $detailFormFields->push( new CheckBoxField(
        'ManyMany[Active]',
        'Is Mentor active?'
    ));
    $detailFormFields->push( new TextField(
        'SomeOtherField',
        'Some other title'
    ));
    $config = new GridFieldConfig_RelationEditor();
    $config->getComponentByType('GridFieldDetailForm')->setFields($detailFormFields);

    $f = new GridField('Mentors', 'Mentors', $this->Mentors(), $config);
    //push() or addFieldToTab() $f to CMSFields

    --[snip]--

}

文档在这里:http ://doc.silverstripe.com/framework/en/3.1/reference/grid-field#customizing-detail-forms

在您的代码中检索数据时,您可以使用 上的getExtraData($componentName, $itemID)方法ManyManyList来检索那些额外的字段值: http ://api.silverstripe.org/3.1/source-class-ManyManyList.html#178-210

于 2013-07-30T06:52:04.570 回答
2

(参见:SS3.1 - http://api.silverstripe.org/3.1/class-CheckboxSetField.html

尝试这个:

private static $many_many = array(
    'Mentors' => 'Mentor'
); 
$mentors = Mentor::get();   
$mentorFields = new CheckboxSetField(    
    'Mentors',   
    'Mentor',   
    $mentors->map(),   
    $value="1"   
);  
$fields->addFieldToTab('Root.Mentors', $mentorFields);
于 2015-06-02T02:55:08.070 回答