Отношение Silverstripe $ many_many с атрибутом отношения

При добавлении отношения many_many, очень похожего на отношения проектов и наставников в серебрянной полосе:

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

Я хотел бы записать атрибут против отношения. Так, например, «активный» - поле «да / нет» для наставника по проекту. Но наставник может иметь разную ценность для разных проектов, к которым он относится.

Как лучше всего добиться этого с помощью встроенных инструментов Silverstripe?

ОБНОВЛЕНИЕ с помощью IRC и ответа ниже. Я подошел немного ближе, но это не работает. Я нашел это: , что кажется очень актуальным.

поэтому на DebatePages есть много_многих участников дискуссии, которые могут голосовать по-разному в каждом обсуждении.

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

person Will    schedule 30.07.2013    source источник


Ответы (2)


вы можете использовать $many_many_extraFields в отношении $many_many, например (здесь, в классе Project, я думаю):

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

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

Затем для каждого проекта конкретный наставник может быть активным или нет (вы всегда можете добавить другие поля, кроме _4 _...).

Если вы используете 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

person colymba    schedule 30.07.2013
comment
хорошо спасибо. Я использую 3.0, но похоже, что он там тоже доступен, не так ли? Есть ли вообще по этому поводу документация? не могу заставить его работать - person Will; 02.08.2013
comment
$ config var - что это такое. это вызывает вызов функции-члена getComponentByType () при ошибке, не связанной с объектом - person Will; 02.08.2013
comment
Редактирование полей ManyMany через GridField было введено в SS 3.1 beta 1, поэтому, если вы используете версию 3.0, вы не можете его использовать. Вы можете посмотреть фиксацию и перенести ее на версию 3.0 ( - person colymba; 02.08.2013
comment
благодаря. Я обновился до 3.1, нашел несколько примеров в исходном коде и попробовал это сделать. Я понял, что не могу обрабатывать суб-URL-адреса объекта CMSForm. ошибка. Я сейчас просмотрю ваш фрагмент и посмотрю, проливает ли он немного света - person Will; 02.08.2013
comment
Можете ли вы опубликовать полный код DebatePage.php и Panelist.php здесь или лучше в виде Gist. Может быть, лучше проверить и помочь? - person colymba; 02.08.2013
comment
То, что у вас было выше, отлично поработало, с дополнительным значением поля, доступным как обычно, как переменной - $ Motion. Большое спасибо за Вашу помощь. Действительно ценится. Если кому-то нужен полный фрагмент для ссылки, дайте мне знать. - person Will; 08.08.2013

(См .: 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);
person StripeLabs    schedule 02.06.2015