2013-07-30 157 views
5

當添加很像項目many_many關係輔導者的silverstripe指南中關係:

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

我想記錄對關係的屬性。所以例如「積極」 - 項目導師的是/否領域。但是,導師對於與其相關的不同項目可能具有不同的活躍價值。

Silverstripe內置工具的最佳實現方式是什麼?

UPDATE 在IRC的一些幫助下&下面的答案。香港專業教育學院接近一點,有點不工作。我發現這個: https://github.com/chillu/silverstripe-framework/blob/c8136f5d4c8a37a4da274cd1c93907c0a2af86a7/docs/en/reference/grid-field.md 這似乎非常相關。

so DebatePages擁有many_many專門小組成員,他們可以在每次辯論中進行不同的投票。

DebatePage.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); 
     }   
    } 

回答

6

,你可以(在項目類我想在這裏)的$many_many關係使用$many_many_extraFields,像這樣:

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

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

然後對於每個項目一個特定的導師可以是否有效(您可以隨時添加除'Active'以外的其他字段...)。

如果您正在使用SS 3.1你可以通過一個GridFieldGridFieldDetailForm組件輕鬆編輯這些額外的領域:在這個

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

+0

好,謝謝。我在3.0上,但它看起來也許這在那裏也可以嗎?有沒有關於此的任何文檔?不能完全得到它的工作 – Will

+0

$ config var - 那是什麼。它導致「調用成員函數getComponentByType()在非對象」錯誤 – Will

+0

在SS 3.1 beta 1中引入了通過GridField編輯ManyMany字段,因此如果您在3.0上,則無法使用它。您可以查看提交併將其移植到3.0(https://github.com/silverstripe/silverstripe-framework/commit/c8136f5d4c8a37a4da274cd1c93907c0a2af86a)或升級到3.1,這可能是一個好主意,並且不會太多。 '$ config' var是創建GridField的一部分,它是一個非常短的代碼片段,所以沒有以前的所有部件,我已經使用整個GridField代碼編輯了上面的答案,並添加了一個鏈接文件。 – colymba